1 Android调试桥介绍
ADB,即AndroidDebug Bridge,它是Android提供的一个通用的调试工具,借助这个工具,我们可以很好地调试应用程序,adb.exe在安装的android的sdk开发包platform-tools目录下。
当我们使用各种手机助手的时候,它们其实都用到了这个工具,使得PC能够和Android设备来进行通信,它是一个客户端/服务器架构的命令行工具,主要由3个部分构成。
(1)adb客户端,一个在用户用于开发程序的电脑上运行的客户端。可以通过命令行控制台使用adb命令来启动客户端。其他的一些基于Android系统的工具,如ADT插件和DDMS同样可以产生adb客户端。
(2)adb服务器,一个在用户用于开发的机器上作为后台进程运行的服务器,该服务器负责管理客户端与运行于模拟器或设备上的adb守护程序(daemon)之间的通信。
(3)adb daemon(守护进程),一个以后台进程的形式运行于模拟器或物理手机设备上的守护程序(daemon)。
当用户启动一个adb客户端,客户端首先确认是否已有一个adb服务进程在运行。如果没有,则启动服务进程。当服务器运行,adb服务器就会绑定本地的TCP端口5037并监听adb客户端发来的命令,所有的adb客户端都是使用端口5037与adb服务器进行对话的。接着服务器将所有运行中的模拟器和设备实例建立连接。它通过扫描所有5555到5585范围内的奇数端口来定位所有的模拟器或设备。一旦服务器找到了adb守护程序,它将建立一个到该端口的连接。注意任何模拟器或设备实例会取得两个连接的端口,一个偶数端口用来控制与控制台的连接,和一个奇数端口用来控制与adb连接。一旦服务器与所有模拟器或设备实例建立连接,我们就可以使用adb命令控制这些实例了。因为服务器管理模拟器/设备实例连接,用户可以通过任何客户端(或脚本)来控制任何模拟器或设备实例。
2 ADB指令
2.1 adb devices
通过该命令可以了解目前连接的设备/模拟器的状态的相关信息。
输出信息主要包括2列内容,第一列内容为设备的序列号信息,第二列为设备的状态信息。
l 设备的序列号是用来唯一表示一个模拟器或者物理设置的一串字符,通常模拟器是以“”“<设备类型>-<端口号>”的形式。
l 状态信息包含以下3中不同的状态:
1) device状态:表示设备或者模拟器已经连接到adb服务器上。但是这个状态并不代表物理设备或者模拟器已经启动完毕并可以进行操作,因为Android系统在启动时会先连接到adb服务器,但android系统启动完成后,设备或者模拟器通常是这个状态。
2) offline状态:表示设备或者模拟器没有连接到adb服务器或者没有响应。
3) no device状态:表示没有物理设备或者模拟器连接。
2.2 adb install
首先把需要安装的应用程序(apk文件)放到android sdk对应platform-tools的目录下,在platform-tools的目录下打开命令行控制台(在目录下shift+右键,选择在此处打开命令行窗口);只有一个设备或模拟器时,命令为:adb install 文件名.apk;如下,在手机上安装微信应用。
如果已经安装了该应用,再次运行安装时,会给出安装失败的信息,如果重新安装该包,则需要先将其以前的包卸载,再次进行安装。
如果已经安装了该应用,又不想卸载后再安装,可以加“-r”参数,会覆盖原来安装的软件并保留数据。
如果一个模拟器和一个物理手机设备都处于已连接状态,运行安装命令,会提示如下错误:
2.3 adb uninstall
2.4 adb pull
将手机上的文件传送到电脑上。例:adb pull /sdcard/tmp/error_fs.dat d:/
可以使用“-s”参数来指定从哪个手机设备传送文件到电脑上。
2.5 adb push
2.6 adb shell
安卓系统是基于Linux系统开发的,支持常见的Linux命令,这些命令都保存在手机的“/system/bin”文件下,可以通过使用“adb shell”指令后直接加上相关的指令及其参数来执行这些指令。如查看手机当前目录的所有内容:adb shell ls
也可以在命令行控制台先输入“adb shell”指令,之后再输入“ls”命令来查看手机当前目录的所有内容。
还可以输入“exit”来退出“adbshell”提示符,回到Windows命令行控制台。
可以使用“adb shell”命令来访问手机系统“/data/data”目录查看手机上安装了哪些应用,在操作的过程中需要切换为“root”用户,具体的操作指令如下。
如果在操作过程中,没有切换为“root”用户,则会出现访问权限问题。
2.7 adb shell dumpsys battery
查看电池电量的相关信息
l AC powered:是否连接电源供电
l USB powered:是否使用USB供电
l status:电池充电状态
l health:电池的健康状态
l present:手机上是否有电池
l level:当前剩余的电量信息;模拟器永远为50,表示剩余电量为50%
l scale:电池电量的最大值,通常该值都是100,因为这里的电池电量是按百分比显示的
l voltage:当前电池的电压,模拟器上的电压是0
l temperature:当前电池的温度,它是一个整数值,其单位为0.1度
l technology:电池使用的技术,Li-ion表示锂电池
2.8 adb shell dumpsys wifi
查看无线网络的信息,因为运行该指令后输出信息内容很多,所以加“| more”参数,当输出信息在显示满一页时就暂停输出,若需要查看后续输出内容,可以按空格键继续显示下页内容,或按“Q”键停止显示后续输出信息。
在安卓系统中,包含了5种不同的WiFi连接状态,各自表示如下:
l WIFI_STATE_DISABLED(WiFi已关闭)
l WIFI_STATE_DISABLING(WiFi正在关闭中)
l WIFI_STATE_ENABLED(WiFi已启动)
l WIFI_STATE_ENABLING(WiFi正在启动中)
l WIFI_STATE_UNKNOWN(未知WiFi状态)
2.9 adb shell dumpsys power
查看电源管理的相关信息
在Windows系统加入“findstr”或者“grep”,在Linux系统只能加入“grep”可以过滤输出的信息。例:“adb shell dumpsys power | findstr “mScreenOffTimeoutSetting””仅输出屏幕关闭时间的设置信息。
2.10 adb shell dumpsys telephony.registry
查看电话相关信息
l mCallState:呼叫状态。0表示待机状态;1表示来电尚未接听状态;2表示电话占线。
l mCallIncomingNumber:最近一次来电的电话号码
l mServiceState:服务状态。0表示正常使用状态;1表示电话没有连接到任何电信运营网络;2表示电话只能拨打紧急呼叫号码;3表示电话已关机。
l mSignalStrength:信号强度信息
l mMessageWaiting:是否在等待无线电消息
l mCallForwarding:是否启动了呼叫转移
l mDataActivity:无线数据通话情况。0表示没有通话;1表示正在接收IP PPP信号;2表示正在发送IP PPP信号;3表示正在发送和接收IP PPP信号。
l mDataConnectionState:无线数据连接情况。0表示无数据连接;1表示正在创建数据连接;2表示已连接;3表示挂起连接状态,已经创建好连接,但是IP数据通信暂时无法使用。
l mDataConnectionPossible:是否有数据连接
l mDataConnectionReason:数据连接的原因
l mDataConnectionApn:APN(Access Ponit Name),即“接入点名称”。
l mDataConnectionLinkProperties:数据连接的链路属性
l mDataConnectionLinkCapabilities:数据链路连接的能力
l mCellLocation:基站相关信息
l registrationa:登记记录计数
2.11 adb shell cat /proc
Android系统的“/proc”分区保存的系统各种实时信息,如CPU、内存等信息。
2.12 获取手机的一些详细信息
2.13 adb shell df
获取手机系统各个分区的相关信息
2.14 adb shell dmesg
输出Linux内核的环形缓冲区信息,从中获得诸如系统架构、CPU、挂载的硬件、RAM等多个运行级别大量的系统信息。该命令对于设备故障的诊断是非常重要的。
由于输出内容非常多,一闪而过,十分不方便阅读和分析,因此,最好将其通过定向放到一个文件中进行分析。
2.15 adb shell dumpstate
获取手机系统当前状态的相关信息,输出的信息很多,可以应用定向将其输出到一个文件中。该命令输出信息包括:
1) 系统构建的版本信息
2) 网络相关信息
3) 系统内核的相关信息
4) 正常运行时间信息
5) 内存使用情况信息
6) CPU使用情况信息
7) 进程的相关信息
8) 正在运行的应用列表相关信息
9) 正在运行的服务列表相关信息
10) 系统中已安装的应用包相关信息
11) ……
2.16 adb get-serialno
获取设备的序列号
2.17 adb get-state
查看模拟器/设备的当前状态
状态信息包含以下3中不同的状态:
1) device状态:表示设备或者模拟器已经连接到adb服务器上。但是这个状态并不代表物理设备或者模拟器已经启动完毕并可以进行操作,因为Android系统在启动时会先连接到adb服务器,但android系统启动完成后,设备或者模拟器通常是这个状态。
2) offline状态:表示设备或者模拟器没有连接到adb服务器或者没有响应。
3) no device状态:表示没有物理设备或者模拟器连接。
2.18 adb logcat
查看和跟踪系统日志缓冲区的信息,每一条日志消息都有一个标记和优先级与其相关。标记是一个简短的字符串,用于标识原始消息的来源。日志的优先级为每一行的首字母,其可能为“V、D、I、W、E”这几个字符,它们代表的属性内容如下。
1) V:冗余级别的日志信息
2) D:调试级别的日志信息
3) I:信息级别的日志信息
4) W:警告级别的日志信息
5) E:错误级别的日志信息
上述不同级别的日志信息,由上至下级别越来越高;假如要输出警告级别的日志(adb logcat *:W),那么将会输出警告级别的日志及高于本身级别的错误级别的日志。如果想要减少输出的内容,可以加上过滤器表达式进行限制。
Android日志系统为日志消息保持了多个循环缓冲区,而且不是所有的消息都被发送到默认缓冲区,想要查看这些附加的缓冲区,可以使用“-b”参数选项,其内容如下:
1) radio:查看包含无线/电话相关的缓冲区消息
2) events:查看事件相关的消息
3) main:查看主缓冲区相关的消息
2.19 adb bugreport
查看Android启动过程中的日志信息,以及启动后的系统状态,包括进程列表、内存信息、VM信息等。
2.20 adb jdwp
列出指定设备的JDWP相关的进程ID。JDWP的全写是JavaDebug Wire Protocol,即JAVA调试器无线协议,它定义了调试器(Debugger)和被调试的JAVA虚拟机(Target VM)之间的通信协议。
2.21 adb start-server
有的时候adb服务器可能会出现异常,这时就需要对adb服务进行关闭和重启。“adb start-server”命令用于启动adb服务。
2.22 adb kill-server
关闭adb服务
2.23 adb forward
将本机的端口重定向到模拟器或者设备端口上。例:将本机的2211端口重定向到设备上的5566端口上,“adb forward tcp: 2211 tcp: 5566”,这样所有发往2211端口的数据将会被转发到5566端口上。
2.24 am
am全称ActivityMannager,可以使用am去模拟各种系统行为,例如启动一个Activity、强制停止进程、发送广播进程、修改设备屏幕属性等。
2.25 pm
pm全称packagemanager,可以使用pm命令去模拟android行为或者查询设备上的应用等。例:adb shell pm list package 查看所有包列表信息。
还可以加一下参数:
5) -3:查看第三方package