Android系统在平台的开放性上是领先iOS的,凭借自身的可扩展性和定制性,不同的厂商推出了独具品牌特色的ROM,比如小米的MIUI,华为的EMUI,魅族的FlyMe等等。Android的日常开发中,业务功能的实现重要,而对程序如何如何调试也很重要。这其中就避免不了接触Android的核心调试工具:ADB(Android Debug Bridge,Android 调试桥),本文通过结合具体的实例来展示如何通过ADB控制Android手机。
ADB是什么?
ADB是一个基于C/S架构的命令行工具,它允许用户与模拟器或者连接的Android设备进行通信,这其中就包括Android Studio中的AVD(Android Virtual Device,Android模拟器)和通过USB线以及WIFI进行连接的Android设备。除此之外,ADB还可以对Unix Shell进行访问,即提供进入设备内部,并对内部的系统进行操作的能力。
ADB由三部分构成:
客户端(Client):即发送指令的终端设备,在windows上一般使用windows powershell进行操作,顺便强推一下windows最新的Windows Terminal,在windows应用商店即可下载,非常实用。
后台程序(ADBD):ADBD是ADB守护进程Android Debug Bridge Daemon的缩写,运行在Android设备上。
服务器(Services):在开发的计算机上运行,用来管理客户端和后台程序之间的通信。
ADB如何工作?
以windows terminal为例,当我们在PC上开启adb命令时,首先会检查是否已经存在运行的adb服务器进程,如果没有,那么将启动服务器进程。
adb的服务器进程可以通过windows任务管理器中的进程进行查看。
上面两图可以看出,刚开始的时候进程并未开启,随后便开启了该进程,从任务管理器中可以看出adb进程的确被启动了。
adb启动后,会与本地TCP端口5037进行绑定,所有的adb客户端均使用5037端口与adb的服务器进行通信的。随后,服务器将检测所有连接的设备状态,在这个检测过程中,服务器将扫描5555和5585端口中的奇数号端口,这些端口范围是设备连接的范围。如果在检测过程中发现有adb后台程序,那么服务器进程就会设置与该端口的连接。上图中电脑并没有连接任何设备,所以显示没有设备参与了连接。
在服务器与所有的设备连接完成后,就可以使用adb命令进行访问。但为什么多个设备连接而命令不会出现混淆呢?因为adb命令中允许自己定义指向某一台设备进行访问,这个在后面会谈及。
如何使用?
通过USB连接Android设备前,先必须手动的打开 开发者选项
这个设置。在Android 4.2版本后,该设置被系统隐藏,因此要打开这些设置,需要结合设备自身的品牌对于该选项的设定,这个过程可以在网上搜索的到,就不一一赘述了。
开启该设置后,首先要打开 开发者选项
的开关,为了避免调试过程中手机锁屏导致的不便,一般也会将 保持唤醒
的功能开启。并打开USB调试功能,这一步没有开启,将无法进行调试。完成上述步骤后,便可以使用USB连接手机到电脑上。
在电脑端,需要安装好Android SDK套件,这个在Android开发中是必须的,如果安装了Android Studio,那么就可以在SDK安装目录下的 platform-tools
文件夹中找到 adb.exe
这个可执行文件。
当然,要在命令行中直接使用adb命令,就需要将该路径放到系统的环境变量中的 Path
路径中,在terminal下输入 adb
回车,看到如下内容,即说明配置成功。
部分adb命令
adb devices
:该命令将列出adb连接的全部设备
其中,第一列的数字表示设备的id号,但并非一定为数字,也有一串字母的表示,与设备有关;第二列表示设备的状态,有 device
、 offline
和 unknown
这三种,一般连接后会显示 device
状态。这个命令还可以在后面加上后缀 -l
,可以自行试验一下会出现什么信息。
adb connect[ip]:[port]
:通过IP地址和端口号连接,这种情况常见与通过WIFI进行adb调试的方法中,在一些远程平台上,这种方式的连接是最常见的。
adbget-state
:获取设备状态,设备的最新状态:device
、 offline
和 unknow
进行展示。
adb-s[设备标识]+[operation]
:选择某一个特定设备进行操作。其中的 -s+[设备标识]
表示选择特定设备。在连接多个设备的情况下,这个命令参数是必需的,否则将会报错,指出存在多个设备。
adb kill-server
:结束adb进程服务。在某些环境下,如果出现异常情况,可以使用该命令结束服务。
adb start-server
:开启adb进程服务,一般与 adb kill-server
联合使用。
adb logcat
:打印Android系统操作日志,这个指令在应用程序出现 crash
或者 anr
的时候非常有用,通过打印log,查找出现问题的异常来源,从而解决问题。如果需要将日志保存到本地,采用 adb logcat>XXX/XXX.log(本地路径)
,就可以在本地路径下找到log文件。推荐 .log
文件用 visual studio code
打开,定位问题更快捷。
adb install XXX/XXX.apk
:安装应用程序命令,路径为本地PC上的安装包路径,例如 adb install D://temp/demo.apk
回车,便会将apk文件安装到设备中。
adb uninstall[packagename]
:卸载应用程序指令。这里有一个坑,就是卸载并不是像安装那样卸载apk名称,而是需要找到apk对应的包名(package name),包名的查找需要通过pm(package manager)命令执行。
adb push[PC文件路径][设备文件路径]
:将PC端的文件转移至Android设备中,例如PC上有一个文件 MyDemo.txt
,需要移入手机的 sdcard
目录下,那么命令应该为 adb push D://temp/MyDemo.txt /sdcard/
,回车,打开手机的文件管理器中的 sdcard
目录,就会找到 MyDemo.txt
文件。
adb pull[设备文件路径][PC文件路径]
:与上述的 push
相反, pull
用来将设备中的文件拉取到PC本地目录中,例如设备的 sdcard
路径下有一个 crash.log
的文件,需要保存到本地的 temp
文件夹中,那么命令应为 adb pull/sdcard/crash.log D://temp/
,这个命令在获取设备出现 crash
的时候十分有用。
adb reboot
:重启Android设备
adb shell
:该命令将进入设备端,对设备内部的信息进行操作。
在 shell
下的命令是十分庞大的,一般主要是对Android的 AM(ActivityManager)
和 PM(PackageManager)
进行操作。例如如果需要查看设备中所有程序的包信息,那么可以进入 shell
端,输入 pm listpackage
,出现如下结果
这个列表的长度取决于手机设备安装的应用个数,结合卸载指令,当找到需要卸载的安装包的包名后,复制到卸载指令中,回车,便完成卸载操作。
shell
中还可以进行调起指定的Activity的操作,这需要在AM指令下进行。例如,需要打开微信主界面,那么输入的指令应该为 adb shell am start-n com.tencent.mm/.ui.LauncherUI
,回车,微信的主页面就会自动的打开。这个命令方式在打开APP指定页面时十分有用,直达相关页面,抛弃了繁琐的点按设置,提升了操作效率。
退出 shell
环境的命令十分简单,在后面输入 exit
回车就可以了。
小结
adb工具是Android开发中常用的工具,它的应用面很广泛,目前市场上各种手机助手的原理也是通过封装adb指令来完成应用的安装、卸载、清理、复制文件等操作。并且adb的命令非常的多,本文也只截取了部分命令进行解释。很多人会觉得指令的方式没有在手机上操作来的直接,但是在实际的工作环境中,adb指令的使用十分频繁,频繁的在设备和IDE之间切换操作方式是低效的,命令行的方式使得开发和调试形成了统一。本文作为对adb的初探,抛砖引玉,有兴趣的可以在Android官网进行更深入的学习。
相关资源
Android Developer ADB
个人博客