原文地址:Most complete ADB command manual
作者:larson
相信做 Android 开发的朋友都用过 ADB 命令,但是仅限于安装应用、推送文件、设备重启等,深层次的我就不清楚了,其实多了解一点就可以了,有一些不常见的场景我们至少应该知道它可以做到,比如我们知道adb install
,但是不知道adb shell am start
,前者是用来安装软件的,后者是用来打开软件的。后者的一个使用场景让我注意到了它:公司定制 Android 系统,在调试屏幕的时候要用 IDEA 来安装和打开,显然比接数据线用 adb 命令的驱动要复杂的多,所以多了解一下还是很有必要的。
什么是ADB
ADB 的全名是 Android Debug Bridge,下图是 Android 官方对 ADB 的介绍:
可以看出 Android 的初衷就是希望在开发 Android 应用的过程中,能够使用 adb 这样的工具来协助开发者更快很好的调试 apk,所以 adb 具备安装、卸载 apk、复制、推送文件、查看设备硬件信息、查看应用占用资源、在设备上执行 shell 命令等功能。
我们可以在 androidsdk 安装目录的 platform-tools 目录下找到 adb 工具。
现在的Android 系统的权限机制越来越完善,很多希望绕过权限管理机制的操作已经无法使用了,但是 ADB 却可以实现。其实 ADB 在某种程度上拥有很大的权利,即使在最新版本的 Android 系统上也是如此。因为 ADB 是为了方便开发者调试而设计的,所以需要暴露一些权限之外的接口。所以很多公司可以利用这个特性来绕过权限机制在非 Root 非定制的机器上做一些操作,当然也有各种方式,比如通过手机 OTG 连接等。
ADB 架构
为了方便理解,我们先从三个指令开始,我们常用的adb start-server
、adb devices
、adb kill-server
。
然后我们经常会看到这样的输出界面:
那么这里有三个疑问,为什么是服务端,服务端对应的是服务器还是服务端?如果手机是客户端,服务端是不是就是指电脑上开启的服务。还有这个守护进程又是什么?
ADB 是一个 C/S 架构的应用程序,由三部分组成:
- PC 端运行的 adb 客户端:命令行程序"adb"用于从 shell 或者脚本中运行 adb 命令。首先,"adb"程序会尝试定位主机上的 adb 服务器,如果找不到 adb 服务器,"adb"程序会自动启动一个 adb 服务器。接下来,当设备的 adbd 和 pc 端的 adb 服务器建立连接后,adb 客户端就可以向 adb server 发送服务请求;
- 运行在 PC 端的 adb server:ADB Server 是运行在主机上的后台进程,其功能是检测 USB 口传感设备的连接与移除,以及模拟器实例的启动或停止。ADB Server 还需要将 adb client 的请求通过 usb 或者 tcp 发送给相应的 adbd;
- 设备端运行的常驻进程 adb demon(adbd):程序"adbd"作为后台进程运行在 Android 设备或模拟器系统中,它的功能是连接 ADB 服务器,并未运行在主机上的客户端提供一些服务;
ADB 端口被占用
我猜肯定很多人都遇到过这个问题。5037 是 adb 的默认端口,如果 5037 端口被占用的话,我们在使用 adb 命令的时候会遇到找不到设备的困扰,这个问题对于不太熟悉 adb 朋友是经常会遇到的,因为我将这种用法放在文章的开沟,方便朋友们可以方便找到。
解决这类端口占用问题的思路都是一样的,三步
- 找到使用该端口的进程的 Pid
yaml
C:\Windows\system32>netstat -aon|findstr 5037
TCP 127.0.0.1:5037 0.0.0.0:0 LISTENING 3172
- 通过 Pid 找到对应的进程名
arduino
C:\Windows\system32>tasklist /fi "PID eq 3172"
Image name PID session name session# memory usage
========================= ======== ================ = ========== ============
360MobileLink.exe 3172 Console 4 40,208 K
- 使用该命令来终止该命令的运行
vbnet
C:\Users\wwx229495>taskkill /pid 3172 /f
Success: The process with PID 3172 has been terminated.
arduino
有时候,有些流氓程序会把Adb.exe复制一份到windows环境变量中,比如C://Windows/system32,此时我们可以用Where
Adb命令找出adb所在的路径并将其删除。
基本用法
adb 能做什么?答案是,手机上能进行的所有操作,都可以用 adb 实现。也就是说,如果你玩的厉害,你的触摸屏彻底坏了、显示器彻底坏了、只要给你一个主板,你还能完成你想做的动作。当然,一般场景下不建议这么做,效率才是首要的。
命令语法
adb 命令的基本语法如下:
css
adb [-d|-e|-s]
如果仅连接了一个设备/模拟器,则可以省略部分[-d|-e|-s ] 并直接使用 adb。
指定命令的目标设备
如果连接了多个设备/模拟器,则需要未命令指定目标设备。
参数 | 意义 |
---|---|
-d | 指定当前通过 USB 连接的唯一 Android 设备作为命令目标 |
-e | 指定当前运行的唯一模拟器作为命令目标 |
-s <serialNumber> | 指定相应 serialNumber 号的设备/模拟器作为命令目标 |
当连接多个设备/模拟器时,一般会用到-s参数,通过 adb devices 命令可以获取 serialNumber,如
arduino
$ adb devices
List of devices attached
cf264b8f device
emulator-5554 device
10.129.164.6:5555 device
输出中的cf264b8f、emulator-5554和10.129.164.6:5555是序列号。
例如你想指定设备cf264b8f来运行adb命令获取屏幕分辨率:
arduino
adb -s cf264b8f shell wm size
再比如在设备10.129.164.6:5555上安装一个应用(该形式的serialNumber格式为:,一般是无线连接的设备或者第三方的Android模拟器如Genymotion):
adb -s 10.129.164.6:5555 install test.apk
在多设备/模拟器的情况下,这些参数用于指定命令的目标设备。
开始停止
启动 adb 服务器命令:
sql
adb start-server
(一般情况下不需要手动执行该命令,如果运行 adb 命令时发现 adb 服务器没有启动,会自动启动)
停止 adb 服务器命令:
perl
adb kill-server
查看 adb 版本
adb version
示例输出
arduino
Android Debug Bridge version 1.0.36
Revision 8f855a3d9b35-android
以 root 身份运行 adbd
adb 的运行原理是 PC 端的 adb 服务器与手机端的守护进程 adbd 建立连接,然后 PC 端的 adb 客户端通过 adb 服务器转发命令,adbd 收到命令后解析并运行。
所以如果 adbd 以普通权限执行的话,一些需要 roor 权限才能执行的命令是没法直接用 adb xxx 执行的,这时候可以先 adb shell 再 su 之后执行命令,也可以让 adbd 以 root 权限执行,这样就可以随意执行高权限的命令了。
命令
adb root
正常输出:
csharp
restarting adbd as root
现在再次运行 adb shell,看看命令行提示符是否变成#?
部分手机 root 后无法通过 adb root 命令以 root 权限执行,比如部分三星机型会提示 adbd isn't run as root in production builds
,可以先安装adbd Insecure,然后在 adb root 试试。
相应的,如果想要 adbd 回复到非 root 权限,那么可以使用adb unroot命令。
指定 adb server 的网络端口
css
adb -P <port> start-server
默认端口为 5037