分类目录归档:大话Android应用开发

主题与风格 第3节 主题-theme

第3节 主题-theme

主题theme由具备各种风格style的组件组合起来的。如果说style关注的是具体某个控件,那么theme就关注的是整体宏观的方面,例如一个Activity或者一个应用整体。

3.1 theme的定义

theme的定义与style的定义完全一样,一样的标签、一样的写法,

  1. res\values目录下,新建一个themes.xml文件(如果使用styles.xml文件)也可以;
  2. 在新建的文件中,使用style标签,在标签中为定义的主题取个名字,例如name="Mytheme"
  3. 在style标签内部,使用item标签,为需要定制的属性设置新的值;

3.2 theme的继承

theme的继承与style的继承完全一样
theme也可以从已有的theme继承而来。
theme与style一样,有两种继承方式,一种是显式继承,一种是隐式继承。

3.2.1 显示继承

  1. 继承已有的theme时,使用parent=属性,
  2. 在子theme中,定义需要扩展或者需要覆盖的属性,

3.2.2 隐式继承

  1. 继承已有的theme,给新theme以.为分隔符取名,例如"MyTheme.ExMyTheme,被继承的theme名称要放在前面;
  2. 子theme中,定义需要扩展或者需要覆盖的属性,

3.3 theme的使用

theme常用在两种地方,一个是应用,一个是Activity。

3.3.1 应用使用theme

  1. 配置文件中设置:在项目工程的AndroidManifest.xml文件中,application标签的android:theme属性,就用来指定整个应用的theme

  2. java源码中设置:当应用被创建的时候,在ApplicationonCreate()函数中设置,

3.3.2 Activity使用theme

  1. 配置文件中设置:在项目工程的AndroidManifest.xml文件中,标签的android:theme属性,就用来指定该Activity的theme

  2. java源码中设置:当应用被创建的时候,在ActivityonCreate()函数中设置,

3.4 属性值的设置

在对属性值设置时,可以使用三种方式,前两种已经在style的相关章节介绍了,下面介绍?引用。

这种引用并不直接设置值,而是表明希望设置的值与“另一个属性”的值相同;这“另一个属性”定义在当前使用的主题当中,例如,

  1. 创建自定义属性myAttr:在res\values目录下创建一个attrs.xml文件,添加一个自定义属性myAttr

  2. 定义一个theme-MyTheme,设置myAttr的值,

  3. 让这个应用使用MyTheme,作为应用的主题(当然也可以指定某个具体的Activity使用这个主题),

  4. 定义一个style-MyStyle,使用myAttr来指定按钮文字的颜色,

  5. 为布局文件中的一个Button使用MyStyle

这样,Button显示的文字颜色就是MyThememyAttr指定的颜色了。

3.5 theme可用的各种属性

theme可以设置的属性很多,可以参考安卓的系统源码themes.xml themes_device_defaults.xml themes_material.xml themes_holo.xml等,里面使用了很多定义主题时用到的属性。

不过里面有的属性是不对应用层开放的,在应用层使用的这些属性的时候,如果遇到编译错误,那么多半就是这个原因。

系统主题的属性很多,我们将选择性的介绍一些重要属性的用法和效果。

3.5.1 调色板属性

调色板属性是主题最为重要的属性,它决定了主题的配色。这些属性包括,

  1. android:colorPrimaryDark
  2. android:colorPrimary
  3. android:colorAccent
  4. android:colorEdgeEffect
  5. android:colorControlNormal
  6. android:colorControlActivated
  7. android:colorControlHighlight
  8. android:colorButtonNormal
  9. android:colorSwitchThumbNormal

如果一款应用设计了自己的配色方案,那么修改这些属性,会让开发的效率大大提高。

例如colorAccent就被很多控件利用?访问的方式使用到,一旦修改了它,很多控件的配色也就跟着变化了。例如,我们将该属性的值设置成绿色,

其它属性也对应着修改界面控件的某些颜色,由于它们都是和主题配色相关的属性,所以称它们为调色板属性。

3.5.2 导航栏、状态栏属性

从安卓5.0起,Android SDK加入了对导航栏和状态栏颜色的设定属性,

  1. 导航栏:android:navigationBarColor
  2. 状态栏:android:statusBarColor

3.6 系统主题

安卓系统内置了很多种主题,它们各有各的特点,也具有很多共同的性质。

按照设计思路,分成三个大类:

  1. theme:这是安卓系统刚诞生时使用的界面元素设计理念,具有暗色和亮色两种风格;

  2. Holo:这是安卓系统3.0时开始使用的界面元素设计理念,具有暗色和亮色两种风格;

  3. Material:这是安卓系统5.0时开始使用的界面元素设计理念,具有暗色和亮色两种风格;

以上三个大类下面还有很多主题,可以通过Android Studio提供的preview工具看到这些主题。

  1. 打开任意一个布局文件,例如activity_main.xml;
  2. 点击预览窗口上红色方框对应的图标,会弹出一个Select Theme窗口;

这里分门别类的列举出了所有可用的系统内置的主题。

最后需要特别的指出一个类型的主题:device default
它并不是除了theme holo material之外的第四类,而是为了安卓系统在不同版本上的兼容性而采取的兼容方案。

可以简单的认为,当使用这种主题的应用在安卓3.0~安卓5.0之间的版本上运行时,它使用的主题就是holo;当使用这种主题的应用在安卓5.0以上的版本,它使用的主题就是material


/**************************************************************************/
* 版权声明
* 本教程只在CSDN安豆网发布,其他网站出现本教程均属侵权。
/
**************************************************************************/

主题与风格 第2节 风格-style

第2节 风格-style

style指的是某一类具体的控件的风格,例如TextView的风格、Button的风格。

指定控件的style,就是指定诸如它的字体大小、字体颜色、字体种类等元素,

这好比一本书,书的一级标题要使用一号字体(字体要比别的字体大),二级标题要使用二号字体,以此类推。每一级标题使用的文字,就对应的一种style。以后在写书的时候,每使用某级的标题,就自然将文字显示成了这一级应该的字体大小。

2.1 style的定义

  1. res\values目录下,新建一个styles.xml文件;
  2. 在新建的文件中,使用style标签,在标签中为定义的主题取个名字,例如name="BtnStyle"
  3. 在style标签内部,使用item标签,为需要定制的属性设置新的值;

2.2 style的继承

style也可以从已有的style继承而来。
style有两种继承方式,一种是显式继承,一种是隐式继承。

2.2.1 显示继承

  1. 继承已有的style时,使用parent=属性,
  2. 在子style中,定义需要扩展或者需要覆盖的属性,

2.2.2 隐式继承

  1. 继承已有的style,给新style以.为分隔符取名,例如"BtnStyle.ExBtnStyle,被继承的style名称要放在前面;
  2. 子style中,定义需要扩展或者需要覆盖的属性,

2.3 style的使用

style有两种使用方式。

  1. 直接针对具体的控件使用。
    通过控件的style属性设置,

  2. 提供给theme使用。
    相关的内容请参考主题相关的章节。

2.4 style可用的各种属性

style可以设置的属性很多,不同的控件有不同的属性。具体有哪些属性可以设置,可以参考控件的开发文档,例如TextView就有很多属性,开发文档都有列举。

2.5 属性值的设置

在对属性值设置时,可以使用三种方式。

  1. 直接赋值:直接将要设定的值写到item标签当中,

  2. @引用:将要设定的值通过@引用,设置给item标签,这种引用是将要设定的值换了一个名字,

  3. 引用:这种引用并不直接设置值,而是表明希望设置的值与“另一个属性”的值相同;这“另一个属性”定义在当前使用的主题当中(怎么定义的会在主题相关的章节介绍),


/**************************************************************************/
* 版权声明
* 本教程只在CSDN安豆网发布,其他网站出现本教程均属侵权。
/
**************************************************************************/

主题与风格 第1节 概述

第1节 概述

主题theme与风格style是两个很相近的概念,经常把它们混乱着称呼。它们都定义在xml文件中,都使用style标签。

主题与风格是包含与被包含的关系。例如同一个主题中,按钮使用一种风格,进度条使用一种风格。可以说主题是由具备各种风格的组件组合起来的。

从下面定义的主题例子中,我们可以看到

  1. 这个主题里面的文字,使用的是TextAppearance.DeviceDefault风格;
  2. 这个主题里面的按钮,使用的是Widget.DeviceDefault.Button风格;
  3. 这个主题的窗口标题,使用的是WindowTitle.DeviceDefault风格;

由此我们将先来介绍风格style,之后再来介绍主题theme。


/**************************************************************************/
* 版权声明
* 本教程只在CSDN安豆网发布,其他网站出现本教程均属侵权。
/
**************************************************************************/

APK反编译

前言

在学习安卓开发的时候,我们都希望向优秀的应用学习设计思路,看看别人在实现一个功能的时候是怎么做的。但是没有文档、没有源代码,只能感到遗憾了。不过有的时候,我们也可以通过反编译这些应用,获得更多的信息。

这里我们将介绍反编译安卓应用的原理和方法,希望大家通过这些介绍更佳深刻的理解APK的结构,每个模块的功能,通过反编译的部分代码,参考别人的开发思路,帮助我们更好的提高应用开发技术。不过反编译技术也会被作恶的人利用,窜改设计,加入恶意代码,所以这里我们只介绍如何尽可能的还原代码设计,而跳过代码的重组、修改、打包。

本文针对的读者是:

  1. 对安卓开发有初步认识的开发者;
  2. 向学习和借鉴优秀应用设计方式的开发者;

在开始以前,假设各位已经做好了如下准备:

  • 已经搭建好了的安卓软件开发平台
  • 待反编译的APK包

本文将介绍到:

  1. APK的包结构;
  2. 编译与反编译的概念;
  3. 反编译资源文件和java源代码

第1节 APK包的结构

Android应用存在的实体形式是一个后缀为apk的安装包,例如“微信.apk” “QQ.apk”。将这个安装包放入到Android系统后,系统就可以启动运行它了。

apk安装包实际上是一个zip压缩包。我们用解压软件可以将它解压,解压后可以看到如下图的文件结构和目录结构。

1.1 classes.dex

classes.dex就是程序中java文件被编译后生成的字节码。字节码可以在Android系统的虚拟机(VM)运行。我们说的运行一个安卓程序,其实就是运行这个程序的字节码。

1.2 res

res中存放的的这个应用会使用到的资源文件,例如字符串、图片、界面布局等等。它的目录结构与Android Studio中我们看到的项目工程的res目录一样。这里面的xml文件内容都是被编译器编译过的,实际它们上已经变成了二进制文件,不再是文本文件了。

1.3 assets

asset目录下存放的是不会被编译器处理的文件,一般是一些资源性质的文件,这些文件放进去是什么样,被打包后还是什么样。需要注意的是,asset目录和res目录都可以存放资源,只是前者不被编译器处理,后者会被编译器再转化一次。

1.4 AndroidManifest

AndroidManifest.xml也是被编译器处理过的文件,也是二进制文件,不再是文本文件。

1.5. libs目录

libs目录下存放的是APK使用的库文件--so文件。so文件是c++或者c语言编写后通过编译器生成的。有的应用会使用到so文件,例如微信。使用so文件的应用会通过java,调用c++语言实现的功能。我们暂时把目光投放在纯Java开发应用上,以后再来讲解Java调用c++开发的方式。

因为不是所有的APK都会使用库文件。所以不会有libs目录。

1.6 resources.arsc

resources.arsc文件,用来描述那些具有ID值的资源的配置信息,它的内容就相当于是一个资源索引表。

第2节 APK包反编译

被编译器处理过的代码和资源已经打包成了APK,有的甚至被转化成了二进制文件。但是我们也有一些方法,把这些编译过的内容给变回原来的样子,这个过程叫做-反编译。

反编译分为两个部分:一个是资源文件,一个是java文件。so文件是c++编译的结果,可以认为是不可反编译的(反编译成汇编指令,估计大部分人也看不懂)。

2.1 反编译资源文件

APK tool是反编译的有力工具,据说是谷歌提供的官方的反编译工具,可以把APK目录解包,资源文件全部还原成编译前的样子,而dex文件反编译成smail格式的文件(而不是我们希望的java原文件)。smail格式文件是安卓系统的虚拟机执行时使用的语法,我们不会去讲解这部分内容。

2.1.1 工具准备

  1. APK tool的官网下载APKTool的最新版本;

  2. 在官网下载与APKTool配套的脚本文件-apktool.bat,其内容如下;

  3. 将下载的jar包重命名为APKTool.jar,与脚本文件一起放到你希望存放的目录下,例如D:\Work\apktool;

如果无法访问官网下载,请上安豆网,下载最新的版本。

2.1.2 反编译资源

接下来开始使用APKTool,

  1. 启动cmd命令行窗口,进入apktool目录;
  2. 输入apktool d D:\Test.apk,开始反编译Test.apkapktool d后面需要跟上要反编译的APK文件路径;

  3. 编译的结果就在cmd命令行窗口启动的位置下,反编译的目录结构如下,

现在打开res目录下的资源都被还原了,打开后就能看到原始的设计;而java源码被反编译成了smali格式的文件。

2.2 反编译java源代码

要查看java源码,有三个方式:

  1. 把dex文件转换成smail文件,然后用专门的工具将smail翻译成java;
  2. 把dex文件转换成java的通用编译格式class文件,然后用专门的工具将class翻译成java;
  3. 把dex文件转换成jar文件,然后用专门的工具将jar翻译成java;

这里我们采用第三种方法。

2.2.1 工具准备

首先准备反编译用的工具。

  1. 在官网下载dex2jar工具,它可以把APK中的dex文件转化成jar文件;
  2. 下载完成后,将压缩包解压,放到你希望存放的目录下,例如D:\Work\dex2jar;

  3. 在官网下载JD-GUI,它可以查看jar文件的java源码;

  4. 下载完成后,将压缩包解压,放到你希望存放的目录下,例如D:\Work\jd-gui;

至此,java源码的反编译工具就安装并设置完成了。
如果无法访问官网下载,请上安豆网下载,那里将这几个工具整体打包,方便大家使用。

2.2.2 反编译代码

接下来开始使用反编译工具,

  1. APK文件后缀名改为zip,解压,找到Android软件安装包中的class.dex

  2. 用dex2jar工具将classes.dex生成jar文件;启动cmd命令行窗口,输入d2j-dex2jar D:\classes.dex,开始反编译classes.dexd2j-dex2jar后面需要跟上要反编译的dex文件路径;

    结果生成了classes-dex2jar.jar文件;

  3. 进入JD-GUI目录,运行JD-GUI工具,打开上面的生成的jar文件,即可看到java源代码。

结束

通过上面的介绍,我们就能反编译APK的资源和java源码了。
有的APK还包含了二进制so库文件。不过这里并不能反编译二进制so库文件。so文件是c或者c++代码通过编译器获得的,并不在我们讨论的反编译当中。

反编译APK只是为了我们学习、参考别人的优秀设计,可千万别用它干坏事啊!


/**************************************************************************/
* 版权声明
* 本教程只在CSDN安豆网发布,其他网站出现本教程均属侵权。
/
**************************************************************************/

程序调试 第4节 Wifi代替数据线调试

更新时间 修改意见
2016-08-02 陈敏

第4节 Wifi代替数据线调试

我们通常都是使用USB线连接设备和电脑进行的程序调试。
有的程序本身就要使用USB口,例如一个文件浏览器,它可以列出通过USB接口接入的U盘。
在调试这样的应用的时候,USB接口被占用了,但设备也只有一个USB接口,就可以考虑使用WiFi来进行ADB调试了。

通过WiFi代替数据线进行程序调试,利用了ADB工具的adb tcpipadb connect命令。

  1. 使用USB数据线连接设备和电脑,输入如下命令

  2. 断开USB线,将通过设备的IP地址连接上被调试设备

    设备当前的IP地址,通常可以在设备上,启动设置->关于手机->状态信息看到具体的内容。

这样通过命令行就完成了Wifi调试的设置。


不过这里还有一个更简单的方案,使用Android Studio的第三方插件ADB WIFI

  1. Preferences->Plugins->Browse repositories...;
  2. 在搜索栏中输入ADB WIFI
  3. 选择安装plugin
  4. 重启Android Studio就可以了;

以后在要使用Wifi调试的时候,

  1. 使用USB数据线连接设备和电脑;
  2. Tools->Android->ADB WIFI->ADB USB to WIFI
  3. 拔出USB连接线;

此时,就可以像之前使用USB数据线调试那样,通过Wifi对程序进行调试了。


/**************************************************************************/
* 版权声明
* 本教程只在CSDN安豆网发布,其他网站出现本教程均属侵权。
/
**************************************************************************/

程序调试 第3节 ADB工具

更新时间 修改意见
2016-08-02 陈敏

第3节 ADB工具

ADB-Android Debug Bridge,是安卓系统调试的核心。它将设备与调试用的电脑在软件层次上连接在了一起。第二章介绍的ADM中很多获取设备上信息的功能,其实就是通过ADB得到的。

ADB工具位于SDK目录\platform-tools\adb。如果在安装的时候你采用默认目录安装,那么它应该是c:\Users\用户名\AppData\Local\Android\sdk\platform-tools\adb

3.1 为ADB添加环境变量

为了方便的使用ADB工具,我们最好为它添加一个环境变量。这样,我们只要打开cmd命令行终端,就能马上使用它了。

  1. 我的电脑点击右键->属性->高级系统设置->环境变量,选中Path这一项,进行编辑;

  2. 在编辑栏最后输入ADB所在的路径c:\Users\用户名\AppData\Local\Android\sdk\platform-tools\;如果该项之前还有别的路径,请用;分隔开;

  3. 重启电脑->连接上手机->启动cmd命令行终端,输入adb version,如果得到类似下面的结果,说明ADB已经设置好了;

cmd命令行终端的启动方法:

  1. 通过Win+R启动Windows操作系统的运行面板;
  2. 在面板中输入cmd,启动命令行窗口;

3.2 ADB常用命令

ADB提供了很多使用的命令,这里列出最为常用的几个命令的用法。

3.2.1 adb devices

列出当前连接到电脑上的所有安卓设备

3.2.2 adb logcat

输出安卓设备上的log信息。功能和Android Device Manager中的logcat完全一样。后者实际上就是利用了ADB工具。

清除设备上已有的log,

开始输出log,

logcat的-v的输出选项,可以控制输出数据的显示格式。它提供brief process tag raw time threadtime long等参数。大多数情况下,我们使用-v time这个参数项就好了。

获取帮助,

其实adb logcat并没有h命令选项,不过当logcat没有找到正确的命令时,就会输出logcat的帮助信息,供使用者参考。

3.2.3 adb start-server

启动ADB工具,

3.2.4 adb kill-server

停止ADB工具,

3.2.5 adb shell

从电脑登录到安卓设备上,

登录到设备上后,就可以直接操作设备了。

3.2.6 adb shell dumpsys

输出设备上所有系统模块的状态信息,这个输出会非常的长,

为了让我们关注我们需要的模块,可以进一步设置要dump的模块名称,例如:

甚至更进一步:

这些模块的名称和更进一步的关键字(window windows等等),可以从adb shell dumpsys返回的结果中找到,它们的表现形式大概如下:

括号中的就是可以使用的dump形式。

3.2.7 adb install

安装应用,

-r选项表示强制安装-如果这个应用以前安装过,就把它更新安装,可以不使用;后面跟的是安装文件在电脑上的位置。

3.2.8 adb uninstall

卸载应用,

uninstall后面跟的是要卸载的程序的包名字。

3.2.9 adb help

ADB工具还有很多别的功能,可以通过这个命令查询它们的深入的详细的用法。


/**************************************************************************/
* 版权声明
* 本教程只在CSDN安豆网发布,其他网站出现本教程均属侵权。
/
**************************************************************************/

程序调试 第2节 Android Device Monitor

更新时间 修改意见
2016-08-02 陈敏

第2节 Android Device Monitor

Android Studio的Android Device Monitor(简称ADM)是我们动态调试安卓程序时重要的帮手。它提供了很多动态调试的工具和调试方法。上一章介绍的log调试,就需要通过ADM的logcat显示调试内容;它还可以查看系统内存的占用情况,可以看到系统CPU的运行情况。

ADM可以在两个地方工作:

  1. 在Android Studio集成窗口:在Android Studio下方的窗口中,点击Android Monitor,就能在Android Studio中显示;

    在第一个框中,选中我们要调试的设备,第二个框中选中我们要调试的应用,

  2. ADM单独运行:通过Android Studio的菜单栏启动;

    独立运行后,就像这样,

2.1 Logcat功能

Logcat用来查看程序输出的log。我们可以选择log的类型(verbose debug info warning error)来过滤log。

开发者官网1

当选择verbose时,logcat会输出所有类型的log;
当选择debug时,logcat会输出debug info warning error等类型的log;
当选择info时,logcat会输出info warning error等类型的log;
当选择warning时,logcat会输出warning error等类型的log;
当选择error时,logcat会输出error等类型的log;

有时候log太多,会影响我们的判断,可以自定义过滤器。

  1. 选择编辑过滤器,

    开发者官网1
  2. 指定过滤器的名字,输入log中包含关键字的内容,

    开发者官网1

    以后logcat获取的log,就只有匹配过滤器中关键字的log了。

还有一个非常有用的功能是重启ADB。ADB有时候会因为种种原因而无法与设备相连,这时候通过下图的按钮重启ADB就能解决问题。

开发者官网1

2.2 Android Studio中的ADM

在Android Studio集成界面,ADM还提供了方便的设备截屏、设备录像带功能。

设备截屏能将设备上正在显示的内容以截取图片或视频的形式保存到电脑上。

开发者官网1
  • memory能够实时监测当前被调试的应用内存使用大小,

  • CPU能够实时监测当前被调试的应用CPU占用大小,

  • Network能够实时监测当前被调试的应用网络使用情况,

2.3 独立运行的ADM

除了logcat,独立运行的ADM提供了更多的调试工具。点击菜单栏的添加视图图标,可以为ADM添加上DDMSHierarchy ViewDebugPixel Perfect等高级的调试窗口。

DDMS是谷歌提供的一个非常全面的调试工具,它能和安卓虚拟机通信,获取最原始的调试数据。

  1. 选择要调试的设备和应用;
  2. 点击DDMS的菜单栏,启动不同的高级调试功能;

DDMS有很多高级的调试功能:

  • Debug功能:连接到debug版本的应用,可以使用打断点、逐步跟踪的静态调试方式;

  • heap功能:监测当前内存的使用,手动发起内存回收,保存内存分配的所有状态到电脑上,用其他高级工具做进一步分析,查找内存泄漏;

  • thread功能:查看应用所有的线程,获取线程当前的运行信息;

  • UI元素分析功能:分析显示界面指定窗口的UI元素布局信息,帮助开发者进行界面布局的调试;

  • OpenGL trace功能:记录应用中OpenGL调用的信息;

以上这些功能都是高级的调试功能,每一个都可以开设单独的专题进行深入的讲解。因为本文针对的同学是刚开始接触调试的新手,所以这里就不详细的介绍用法了。我们将在调试的高级篇章中逐个详细介绍。


/**************************************************************************/
* 版权声明
* 本教程只在CSDN安豆网发布,其他网站出现本教程均属侵权。
/
**************************************************************************/

程序调试 第1节 动态调试与静态调试

更新时间 修改意见
2016-08-02 陈敏

前言

安卓开发的过程中,需要对开发的程序进行调试。谷歌官方和非官方,提供了很多帮助我们调试代码的工具和方法。有的使用起来很简单,有的则功能强大,很少有机会接触。因此,我们打算由浅入深的向同学们介绍,知道针对不同的场景,使用合适的工具。

本文针对的读者是:

  1. 对安卓程序调试需要指导的新手;
  2. 对程序调试没有太多经验的开发者;

在开始以前,假设各位已经做好了如下准备:

  • 已经搭建好了安卓软件开发平台
  • 一部安卓系统设备(手机或平板电脑);
  • 一根连接电脑和安卓设备的数据线(通常是micro usb数据线);
  • 半天时间。
  • 耐心与求知欲。

本文将介绍到:

  1. 断点调试;
  2. 输出log调试;
  3. Android Device Monitor初步使用
  4. ADB工具
  5. wifi连接设备调试;

第1节 动态调试与静态调试

安卓系统上调试程序,主要通过两种形式:
1. 静态调试:程序在运行到某一个状态的时候,让它暂停,用工具查看程序此时的运行信息,比如某个变量的数值;查看完成后,让程序继续运行,恢复到正常的工作。
2. 动态调试:在程序中,添加日志信息(log),在程序运行的时候,将log指定的信息输出到调试的电脑上。整个过程不会打断程序的运行。

不管哪种调试方式,都需要手机与调试的电脑通过数据线相连,借此传递调试信息。

1.1 设备与电脑的连接

要在设备上进行调试,首先要打开设备的开发者选项,不同品牌的安卓设备界面虽然不尽相同,但使用方式都大同小异:

  1. 启动安卓设备上的“设置”应用,进入“关于手机”选项卡;
  2. 连续点击“版本号”,直到出现您现在处于开发者模式!的提示信息;

  3. 返回上级菜单,进入“开发者选项”,开启调试模式,钩上USB调试;


将手机和电脑用USB数据线连接起来。

在Windows系统,需要为连接上的设备安装ADB驱动:

  1. 安豆网资源下载下载ADB的Windows驱动到电脑本地;
  2. 在“我的电脑”上点鼠标右键,选择“管理”,打开“设备管理器”,可以看到没有安装驱动的设备;
  3. 为它更新驱动,选择“浏览计算机查找”,

  4. 指定下载的ADB驱动目录位置,点击确定后,驱动很快就安装成功了。

  5. 点击Android Studio的Android Monitor窗口,就能看到这个连接上的设备了,这个窗口还输出了手机端打印的运行信息。

1.2 部署应用

将应用程序通过Android Studio运行到设备上有两个方式:run appdebug app

debug app模式下,程序运行起来之后可以直接进入断点调试模式,对代码进行静态调试;而run app只能通过attach的方式进入断点调试模式。这两种方式可以通过菜单项启动,也可以通过快捷键开始。

  1. 点击菜单栏中的绿色的小三角,就是run app

    或者使用debug app的快捷按键shift+F10

  2. 在选定的设备上双击,

    此时就可以在设备上看到,我们的程序运行起来了。

1.3 静态调试方法

静态调试就是冻结应用运行的状态,仿佛时间停止了一般,然后我们逐一观察此时程序的各个参数是否符合我们的预期。这种调试方法适用于对时间不敏感的程序。也就是说被调试的程序线程不需要依赖别的线程,即使暂时停止工作也不会影响别的工作线程或者受别的工作线程影响。

  1. 在希望代码暂停运行的地方打断点——在代码前点击一下,出现一个红色的圆点,如果想取消,再点击一次即可。

  2. debug run的方式部署程序。当程序运行到这段代码的这个位置时,程序将停止下来,切换到Debug窗口。这时,我们就可以观察各个参数了。例如下图右半区域就列出了停止时,各个变量的值;左边区域展示了当时函数到调用栈(谁调用的这个函数)情况。我们可以逐一分析,详细观察,看这些值是否符合我们的预期。

  3. 下面的功能,将指定程序暂停后,执行下一步的走向。这些都是断点调试经常使用到的、由我们控制程序运行步骤的功能,所以尽量记住它们对应的快捷方式;

    Step Over:执行完成当前断点停留处的代码,然后停在下一行待执行的代码处。

    Step Into:如果当前断点执行处是一个函数,那么执行Step Into后,进入到该函数。

    Step Out:在当前断点执行处执行Step Out后,返回到调用该函数的地方等待执行。

    Resume Program:程序继续往下执行,直到遇到下一个断点。

有的调试功能带有force,例如force step over,它们可以在这种场景下使用:当你想进入不是你写的源代码查看调用过程,但是使用不带force的功能,却没有起作用。简单来说就是不带force的用来跟踪自己写的代码,带force的用来跟踪SDK里的源码。

1.4 动态调试方法

对于那些和时间相关的程序(不能让程序暂停,等你慢慢观察),我们就不能使用静态调试方法了,得采用动态调试,添加log的方式。

Log的中文名字叫做日志,在编程界表示程序运行过程中打印出的信息。根据log我们就知道现在程序运行到什么地方了,log还可以携带程序中某些变量的信息输出,让我们更精准的知道程序当前运行的状态。

1.4.1 代码中添加log

在代码中添加一段函数,就能通过特别的工具输出这些log。
在Android代码中添加log的方式如下:

这里面使用了Android提供的Log库。

1.4.2 log的查看

添加了log信息后,将程序通过debug app部署到设备上,就能在Android Monitor工具的logcat窗口中看到对应的信息了。

输出的调试信息如下:
03-22 03:22:39.778 8357-8357/com.anddle.calculator D/TAG: debug info: function=onCreate()

03-22 03:22:39.778:log产生的时间;
8357-8357:设备上运行这段代码的进程ID(PID)和线程ID(TID);
com.anddle.calculator:设备上运行这段代码的包名;
D:这条log的类型。我们输出这条log使用的是Log.d(),所以就显示D;如果使用Log.i()就显示I,以此类推;
TAG:就是Log.d()函数的第一个参数;
debug info: function=onCreate():就是Log.d()函数的第二个参数;

Android应用开发的Log库提供了几种不同等级的log:Verbose Debug Info Warning Error,我们可以根据自己log的需要加不同等级的log,使用的形式为:

我们在应用中调试程序,通常使用d。

1.4.3 log的添加规则

在应用的开发当中,我们对log的添加有一些不成文的技巧,可以提高程序的开发效率。

  1. 在调试应用的同一个功能时,为它定义同一个TAG。例如,一个应用有网络通信和本地文件读取两个大功能。那我们就可以为网络通信定义一个TAG叫做Network,为另一个本地文件读取定义一个TAG叫做FileAccess。这样当我们查看对应的log信息时,就很容易通过关键字把它们从log的海洋里区分开。将TAG定义成一个字符串常量,便于对log输出信息的修改。

  2. 使用Debug开关控制log信息是否输出。在调试应用的时候要添加很多log,当应用发布的时候,又要去掉这些log信息。添加或者删除这些log,会增加很多工作。所以我们需要使用Debug开关

  3. 输出函数的调用栈。有的时候,我们不仅关注程序执行到当前时各个变量的值是什么,还关心这个函数是怎么被调用到的。那么我们可以在代码中,添加输出调用栈的信息:

  4. Log.d()在调试代码时使用,用Debug开关控制;Log.e()在出现意外而重要的错误情况时使用,不用Debug开关控制;Log.v() Log.i()Log.w()在需要输出运行状态并且不涉及暴露应用实现信息的情况时使用,不必用Debug开关控制;当然,开发者想怎么用这些log类型就可以怎么用,并没有特别的约束。


/**************************************************************************/
* 版权声明
* 本教程只在CSDN安豆网发布,其他网站出现本教程均属侵权。
/
**************************************************************************/

开发环境搭建 第5节 项目导入

第5节 项目导入

5.1 导入成功

导入现有的Android Studio工程很简单。
点击“File”->”open”

结构说明

之后选择要导入的工程所在目录,Android Studio会自动编译刚导入的工程。

如果没有意外,新导入的工程就会编译成功。

5.2 编译失败

如果工程编译失败,原因一般是:被导入工程的gradle配置与现在开发环境能够提供的配置不匹配。

  1. 打开应用对应的build.gradle文件,

    结构说明

    重点检查该文件中buildToolsVersioncom.android.support:appcompat-v7两处。
    确定这两处的设置与自己开发环境的设置一致。

    注意:如果这个文件里面本来就没有com.android.support:appcompat-v7:,说明该应用可能就不需要Android兼容包,也就不需要检查这里的配置是否一致了。

  2. 获取环境设置版本的方法也很简单。

    首先,点击Android Studio工具栏的SDK Manager图标。

    结构说明

    然后,选择“Launch Standard alone SDK Manager”

    结构说明

    最后通过获取的列表,查看Android SDK Build-tools与gradle文件中的buildToolsVersion是否一致;Android Support Library与与gradle文件中的com.android.support:appcompat-v7是否一致。

    如果不一致,就按照SDK Manager列出的数值,修改一致就可以了。

    结构说明

/**************************************************************************/
* 版权声明
* 本教程只在CSDN安豆网发布,其他网站出现本教程均属侵权。
/
**************************************************************************/

开发环境搭建 第4节 平台验证

第4节 平台验证

4.1 创建最简单的Android应用

启动Android Studio,选择“start a new Android Studio project”

结构说明

输入应用的名称,存放路径,再到下一步,

结构说明

Android Studio可以创建不同类型设备的应用,例如手机、电视、手表等等,我们从最常见的设备手机开始,选择这个应用支持的最小SDK版本,

结构说明

选择这个新应用的初始界面布局,这里Google提供了多种布局,作为新手,我们就用最为简单的一个空白布局结构就好了。

结构说明

之后需要为新项目工程的代码文件指定名字,我们使用默认的名字,

结构说明

点击“finish”之后,Android Studio开始生成项目工程。
第一次创建的工程的时候,Android Studio会访问网络,下载一些组件(例如grandle),这个过程比较慢,需要多多等待一下。只要第一次下载以后,后面创建新的工程就不会再去下载了。

结构说明

至此,我们的第一个项目工程就被成功的创建了。

4.2 应用运行到设备

项目创建成功后,可以尝试一次,把生成的项目,编译成App,部署到设备上运行。

4.2.1 设备端的设置

要进行设备上的调试,需要修改设备上的原始设置。默认的情况下,设备端的调试模式是被关闭的,我们需要在设备的设置中,将这个功能打开。虽然各种品牌的手机不同,但是它们的设置菜单中都会有一个开发者选项。

我们首先要找到开发者选项,在Google Nexus设备上这个选项是被隐藏的,
需要进入到设置->关于手机,连续点击“版本号”,将隐藏的开发者模式打开,

结构说明

进入开发者模式,打开“USB调试”功能,

结构说明

之后将手机和电脑用USB数据线连接起来。

如果这是在MacOS系统中,手机就能直接被电脑识别了。

如果这是在Windows系统中,还要为连接上的设备安装ADB驱动。在“我的电脑”上点鼠标右键,选择“管理”,打开设备管理器,可以看到没有安装驱动的设备,

结构说明

为它更新驱动,选择“浏览计算机查找”,

结构说明

驱动存放在Android SDK所在目录的extras\google\usb_driver下面,

结构说明

点击确定后,驱动很快就安装成功了,

结构说明

此时我们点击Android Studio的Android Monitor窗口,就能看到这个连接上的设备了,这个窗口还输出了手机端打印的运行信息。

结构说明

4.2.3 部署应用

点击上方绿色的小三角,程序就开始编译并准备部署到我们的设备上了,

结构说明

让我选择要部署的设备,我们在选定的设备上双击,

结构说明

此时就可以在设备上看到,我们的程序运行起来了。

结构说明

至此,我们成功的创建了一个可以在设备上运行的程序。


/**************************************************************************/
* 版权声明
* 本教程只在CSDN安豆网发布,其他网站出现本教程均属侵权。
/
**************************************************************************/