admin 管理员组

文章数量: 887021


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号,但并非一定为数字,也有一串字母的表示,与设备有关;第二列表示设备的状态,有 deviceofflineunknown这三种,一般连接后会显示 device状态。这个命令还可以在后面加上后缀 -l,可以自行试验一下会出现什么信息。

adb connect[ip]:[port]:通过IP地址和端口号连接,这种情况常见与通过WIFI进行adb调试的方法中,在一些远程平台上,这种方式的连接是最常见的。

adbget-state:获取设备状态,设备的最新状态:deviceofflineunknow进行展示。

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

个人博客

本文标签: 命令 手机 几行 简单 文件