(点击上方公众号,可快速关注)
来源:伯乐在线专栏作者 - 踏歌行
链接: *** ://android.jobbole *** /84804/
点击 → 了解如何加入专栏作者
Android 开发中, adb 是开发者经常使用的工具,是 Android 开发者必须掌握的。
Android Debug Bridge,Android 调试桥接器,简称 adb ,该工具位于 sdk/platform-tools/ 目录下,其源码位于 path-to-sourcecode/ *** /core/adb 目录下,是用于管理模拟器或真机状态的万能工具。 adb 采用了客户端-服务器模型,包括三个部分:
客户端部分,运行在开发用的电脑上,可以在命令行中运行adb命令来调用该客户端,像 DDMS 这样的 Android 工具也可以调用 adb 客户端。
守护进程部分,运行于模拟器或手机的后台。
服务端部分,是运行在开发用电脑上的后台进程,用于管理客户端与运行在模拟器或真机的守护进程通信。
adb 工具模型示意图如下:
adb 的工作原理
当启动 adb 客户端时,客户端首先检查 adb 服务端进程是否运行,如果没有运行,则启动服务端。当服务端启动时,它会绑定到本地的 TCP5037 端口,并且 *** 从 adb 客户端发来的命令——所有 adb 客户端都使用 5037 端口与 adb 服务端通信。
接下来服务端与所有正在运行的模拟器或手机连接。它通过扫描 5555-5585 之间的奇数号端口来搜索模拟器或手机,一旦发现 adb 守护进程,就通过此端口进行连接。需要说明的是,每一个模拟器或手机使用一对有序的端口,偶数号端口用于控制台连接,奇数号端口用于 adb 连接,例如:
Emulator1,console: 5554
Emulator1,adb: 5555
Emulator2,console: 5556
Emulator2,adb: 5557
即如果模拟器与 adb 在 5555 端口连接,则其与控制台的连接就是 5554 端口。
当服务端与所有的模拟器建立连接之后,就可以使用 adb 命令来控制或者访问了。因为服务端管理着连接并且可以接收到从多个 adb 客户端的命令,所以可以从任何一个客户端或脚本来控制任何模拟器或手机设备。
补充:
1. 使用 adb 命令调试需要手机开启 开发者模式 下的 USB 调试,在 Android 4.2 及更高的版本中,开发者选项默认是隐藏的,你可以去 设置——关于手机 ,然后连续点击七次版本号即可。返回上层就可以在底部看见 开发者模式 了。当然有些定制的 ROM 开启方式会有点不一样,这个就要去问 ROM 的开发者了。
2. 关于 USB 调试与计算机的 RSA 密钥指纹配对。Google 官方原文如下:
When you connect a dev *** running Android 4.2.2 or higher to your computer, the *** shows a dialog asking whether to accept an RSA key that allows debugging through this computer. This security mechani *** protects user dev *** s because it ensures that USB debugging and other adb commands cannot be executed unless you’re able to unlock the dev *** and acknowledge the dialog. This requires that you have adb version 1.0.31 (available with SDK Platform-tools r16.0.1 and higher) in order to debug on a dev *** running Android 4.2.2 or higher.
大意就是,你想使用 USB调试 就得启用 USB调试 模式下的 RSA密钥指纹。不然我就不给你用。
3. 关于使用真机调试的更多信息可参考:Run Apps on a Hardware Dev *** 。
adb 用法
查询模拟器或手机状态
了解 adb 服务端连接的模拟器或手机可以帮助更好的使用 adb 命令,这可以通过 dev *** s 命令来列举当前连接的设备:
adb dev *** s
执行结果是 adb 为每一个设备输出以下状态信息:
序列号(serialNumber):由 adb 创建用于唯一标识设备的字符串,格式是 设备类型-端口号,例如: emulator-5554
连接状态(state),其值是可能是下面的任意一种:
offline — 未连接或未响应
dev *** — 表示设备已经连接到服务端。但需要注意的是,这个状态并不表示 Android *** 已经完全启动起来并且可 *** 作,因为 *** 在启动的过程中就已经连接 adb ,但这个状态是正常的可 *** 作状态。
no dev *** – 表示没有任何设备连接(楼主测试过程中没有碰到过 no dev *** 的情况,没连接设备就没任何输出)
每一个设备的输出形如:
[serialNumber][state]
下面是 adb dev *** s 命令和其执行结果:
$adb dev *** s
List of dev *** s attached
emulator-5554dev ***
emulator-5556dev ***
emulator-5558dev ***
如果没有模拟器或手机在运行,运行 adb dev *** s 命令的执行结果如下:
$adb devces
List of dev *** s attached
*** 作指定模拟器或手机
如果有多个模拟器或手机正在运行,当使用 adb 命令的时候就需要指定目标设备,这可以通过使用 -s 选项参数实现,用法如下:
adb-sserialNumber command
你可以使用 adb 命令指定序列号在特定的设备上执行命令,这里可以先使用前面提到的 adb dev *** s 命令查询设备的序列号信息。
例如:
adb-semulator-5556install helloWorld.apk
需要注意的是,如果使用了 -s 而没有指定设备的话, adb 会报错。
补充:
这是 Google 官方给出在多设备的情况下,不用 -s 参数指定目标设备的快捷方式,原文如下:
If you have multiple dev *** s available (hardware or emulated), but only one is an emulator, simply use the -e option to send commands to the emulator. Likewise if there’s multiple dev *** s but only one hardware dev *** attached, use the -d option to send commands to the hardware dev *** .
大意就是:如果你有多个设备,即既有模拟器,又有真机,但是模拟器只有一个,那么你可以使用 -e 参数想模拟器发送命令,用法如下:
$adb-einstall helloWorld.apk
//同理,如果有多个设备,但只有一个真机,可以使用如下命令快速发送命令
$adb-dinstall helloWorld.apk
安装应用
使用 adb install 命令可以从开发用电脑中复制应用程序并且安装到模拟器或手机上,adb install 命令必须指定待安装的.apk文件的路径:
adb install[-lrtsdg]path_to_apk
(-l: 锁定该程序)
(-r: 重新安装该程序,保留应用数据)
(-t: allow test packages)
(-s: 将应用安装到SD卡,不过现在手机好像都没有SD卡了吧)
(-d: 允许降版本号安装,当然只有debug包才能使用)
(-g: 安装完默认授予所有运行时权限,这个应该对Android6.0及之后的版本才有效吧)
更多关于创建 apk 文件可参考:Build And Running
卸载应用
既然有安装应用的命令,那当然有卸载应用的命令。卸载应用命令的格式如下:
//package 表示要卸载应用的包名
adb uninstall[-k]package
(-k:不删除程序运行所产生的数据和缓存目录)
端口转发
使用 adb forward 命令转发端口 — 将特定端口上的请求转发到模拟器或手机的不同的端口上。下例是从 6100端口 转到 7100端口 :
adb forward tcp:6100tcp:7100
也可以使用UNIX命名的socket标识:
adb forward tcp:6100local:logd
补充:关于 adb forward 命令的作用不是很明白,网上搜了下,大部分文章都是转载了 浅析 adb 命令 – adb forward ,不知道这是不是原文,反正看不得不是很明白。有哪位大神能跟我讲讲嘛?
与模拟器或手机传输文件
使用 adb 命令 pull 和 push 能从 Android 设备拷贝或复制文件到 Android 设备。跟 install 命令不同,pull 和 push 命令允许拷贝和复制文件到任何位置。
从模拟器或手机拷贝文件或文件夹(包括文件夹的子目录)
adb pull[-a]remote_path local_path
(-a:保留文件时间戳及属性)
将文件或文件夹(包括文件夹的子目录)拷贝到模拟器或手机
adb pushlocal_path remote_path
比如,我想把桌面的 log.txt 复制到手机的 dev 目录下,则命令如下:
$adb push/Users/littlejie/Desktop/log.txt/dev
有时候,使用该命令复制文件到手机或从 *** 文件,会碰到如下提示:
failed tocopy'log.txt'to'/dev/log.txt': Permission denied
备注:Permission denied 这个问题以前在使用 Windows *** 的时候碰到过,现在转 Mac 后就没有再遇到,难道是我打开方式不对嘛?再补充一点, Mac 上我运行 adb root 命令真的有点一头雾水,因为竟然提示:
$adb root
adbd isalready running asroot
这是因为当前用户没有相应的权限或者是 /dev 目录不可写。解决 *** 如下:
// *** 一
//已 root 权限启动 adb 服务
$adb root
//adb remount (重新挂载 *** 分区,使 *** 分区重新可写)
$adb remount
//将文件复制到 /dev 目录下
$adb push/Users/littlejie/Desktop/log.txt/dev
// *** 二:修改文件的读写权限
$adb shell
# su
# chmod 777 /dev
关于 Linux 下文件权限的更多内容请参考:linux *** 644、755、777权限详解
adb shell
这里简单讲一下 adb shell 的使用,因为 adb shell 的用法太多,功能太强,完全可以专门分出一篇文章来记录~不出意外,下周应该能写完~有兴趣的同学可以自己先去看 Google 的官方文档:ADB Shell Commands
adb shell 有两种使用方式,一种是不进入 remote shell 直接执行命令行,格式如下:
adb[-d|-e|-sserialNumber]shellshell_command
还有一种是,进入模拟器或手机的 remote shell 执行,格式如下:
adb[-d|-e|-sserialNumber]shell
开启或关闭 adb 服务
在某些情况下需要重启 adb 服务来解决问题,比如 adb 无响应。这时你可以通过 adb kill-server 来实现这一 *** 作。
之后,通过 adb start-server 或者任意 adb 命令来重启 adb 服务。
$adb kill-server
$adb start-server
*daemon notrunning.starting it now on port5037*
* daemon started successfully *
$adb kill-server
$adb dev *** s
List of dev *** s attached
*daemon notrunning.starting it now on port5037*
* daemon started successfully *
emulator-5556dev ***
emulator-5554dev ***
无线调试
平时我们都是使用 USB调试,但是现在也支持通过 WIFI 进行调试了。使用方式如下:
首先,你要将 Android 设备和 装有 adb 的电脑连接到同一 Wi-Fi *** 。其次,你需要配置好防火墙,否则很有可能导致 Wi-Fi 调试不能使用。
使用 USB数据线 将手机连接到电脑。
设置目标设备 *** 5555端口 的 TCP/IP 连接。
$adb tcpip5555
断开手机与电脑的 USB 连接。
查看手机的 IP *** 。例如,在 Nexus 设备上,你可以通过如下方式查看: 设置——关于手机——状态——IP *** 。在 Androir Wear 上,你可以通过如下方式查看:设置——Wi-Fi设置——高级——IP ***
通过 IP 连接手机
adb connectdev *** _ip_address
确认手机是否连接到电脑上
$adb dev *** s
List of dev *** s attached
dev *** -ip-address:5555dev ***
通过以上步骤,就可以开心的享用 WiFi 调试了。如果没有正常连接,可以按照下面的步骤检查:
1. 检查电脑和手机是否还在同一个 WiFi *** 下
2. 重新执行一次 adb connect dev *** _ip_address 命令
3. 重启 adb 服务,然后重头再来
4. 检查是否是防火墙的设置问题
这是一篇关于 Android 设备 USB调试 和 WiFi调试 相互切换 的博文,博主写了一个脚本来实现这个过程,有兴趣的同学可以去看看。
补充
获取设备序列号
$adb shell
emulator-5554
查看 bugreport 报告
//直接在终端输出
$adb bugreport
//将 bugreport 输出到指定文件
$adb bugreport file_path
adb bugreport 这个命令非常简单,但是在实际应用中非常有用,它会输出从开机之后详细的 dumpsys 、 dumpstate 和 logcat 信息,是一份完整的日志记录。对分析用户行为、异常信息、 *** 状态有很大的参考作用。一般我们会把 bugreport 导出到电脑上分析。
bugreport 的详细使用可以参考 Baniel01 的这篇 Android adb bugreport工具分析和使用 文章,里面有很详细的介绍。
查看设备的 log
$adb logcat
查看 adb 的帮助
这个命令很简单,但是也很实用,如果你不知道该使用哪个命令,那么使用 adb 帮助命令你能查看到大部分 adb 命令的作用和使用 *** 。
$adb help
重启手机
有时候,手动关机太麻烦,那就来个命令行吧~
adb reboot
以 root 权限开启 adb 守护进程
//此命令会重启守护进程
$adb root
//不以 root 权限开启 adb 守护进程
$adb unroot
总结
以上就是 adb 命令的常见用法,大部分翻译自 Android Debug Bridge ,其中加了一些个人总结。有些不常用的 adb 命令没有介绍,更多 adb 用法请见:Adb Command Summary。文中如有纰漏,欢迎大家留言指出。
参考:
1. Android Debug Bridge
2. 浅析 adb 命令 – adb forward
3. Android_ADB_通过WIFI或USB方式完成调试
4. Android adb bugreport工具分析和使用
专栏作者简介( 点击 → 加入专栏作者)
踏歌行 :希望有一天我能够很坦然地说:\"让我来告诉你,在我眼中,这是一个怎样的世界。\"
打赏支持作者写出更多好文章,谢谢!
关注「安卓开发精选」
看更多精选安卓技术文章
↓↓↓