Android 开发中, adb 是开发者常用的工具,是 Android 开发者必须掌握的。html
Android Debug Bridge,Android 调试桥接器,简称 adb ,该工具位于 <sdk>/platform-tools/
目录下,其源码位于 <path-to-sourcecode>/system/core/adb
目录下,是用于管理模拟器或真机状态的万能工具。 adb 采用了客户端-服务器模型,包括三个部分:linux
adb 工具模型示意图以下:
android
当启动 adb 客户端时,客户端首先检查 adb 服务端进程是否运行,若是没有运行,则启动服务端。当服务端启动时,它会绑定到本地的 TCP5037 端口,而且监遵从 adb 客户端发来的命令——全部 adb 客户端都使用 5037 端口与 adb 服务端通讯。shell
接下来服务端与全部正在运行的模拟器或手机链接。它经过扫描 5555-5585 之间的奇数号端口来搜索模拟器或手机,一旦发现 adb 守护进程,就经过此端口进行链接。须要说明的是,每个模拟器或手机使用一对有序的端口,偶数号端口用于控制台链接,奇数号端口用于 adb 链接,例如:缓存
Emulator 1, console: 5554 Emulator 1, adb: 5555 Emulator 2, console: 5556 Emulator 2, adb: 5557 ...
即若是模拟器与 adb 在 5555 端口链接,则其与控制台的链接就是 5554 端口。服务器
当服务端与全部的模拟器创建链接以后,就可使用 adb 命令来控制或者访问了。由于服务端管理着链接而且能够接收到从多个 adb 客户端的命令,因此能够从任何一个客户端或脚原本控制任何模拟器或手机设备。网络
补充:less
设置——>关于手机
,而后连续点击七次版本号便可。返回上层就能够在底部看见 开发者模式 了。固然有些定制的 ROM 开启方式会有点不同,这个就要去问 ROM 的开发者了。关于 USB 调试与计算机的 RSA 密钥指纹配对。Google 官方原文以下:socket
When you connect a device running Android 4.2.2 or higher to your computer, the system shows a dialog asking whether to accept an RSA key that allows debugging through this computer. This security mechanism protects user devices because it ensures that USB debugging and other adb commands cannot be executed unless you're able to unlock the device 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 device running Android 4.2.2 or higher.tcp
大意就是,你想使用 USB调试 就得启用 USB调试 模式下的 RSA密钥指纹。否则我就不给你用。
了解 adb 服务端链接的模拟器或手机能够帮助更好的使用 adb 命令,这能够经过 devices 命令来列举当前链接的设备:
adb devices
执行结果是 adb 为每个设备输出如下状态信息:
序列号(serialNumber):由 adb 建立用于惟一标识设备的字符串,格式是 <设备类型>-<端口号>,例如: emulator-5554 链接状态(state),其值是多是下面的任意一种: offline — 未链接或未响应 device — 表示设备已经链接到服务端。但须要注意的是,这个状态并不表示 Android 系统已经彻底启动起来而且可操做,由于系统在启动的过程当中就已经链接 adb ,但这个状态是正常的可操做状态。 no device - 表示没有任何设备链接(楼主测试过程当中没有碰到过 no device 的状况,没链接设备就没任何输出)
每个设备的输出形如:
[serialNumber] [state]
下面是 adb devices 命令和其执行结果:
$ adb devices List of devices attached emulator-5554 device emulator-5556 device emulator-5558 device
若是没有模拟器或手机在运行,运行 adb devices 命令的执行结果以下:
$ adb devces List of devices attached
若是有多个模拟器或手机正在运行,当使用 adb 命令的时候就须要指定目标设备,这能够经过使用 -s
选项参数实现,用法以下:
adb -s <serialNumber> <command>
你可使用 adb 命令指定序列号在特定的设备上执行命令,这里能够先使用前面提到的 adb devices
命令查询设备的序列号信息。
例如:
adb -s emulator-5556 install helloWorld.apk
须要注意的是,若是使用了 -s
而没有指定设备的话, adb 会报错。
补充:
这是 Google 官方给出在多设备的状况下,不用 -s
参数指定目标设备的快捷方式,原文以下:
If you have multiple devices 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 devices but only one hardware device attached, use the -d option to send commands to the hardware device.
大意就是:若是你有多个设备,即既有模拟器,又有真机,可是模拟器只有一个,那么你可使用 -e
参数想模拟器发送命令,用法以下:
$ adb -e install helloWorld.apk //同理,若是有多个设备,但只有一个真机,可使用以下命令快速发送命令 $ adb -d install 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: 安装完默认授予全部运行时权限,这个应该对 Android 6.0 及以后的版本才有效吧)
更多关于建立 apk 文件可参考:Build And Running
既然有安装应用的命令,那固然有卸载应用的命令。卸载应用命令的格式以下:
//<package> 表示要卸载应用的包名 adb uninstall [-k] <package> (-k:不删除程序运行所产生的数据和缓存目录)
使用 adb forward
命令转发端口 — 将特定端口上的请求转发到模拟器或手机的不一样的端口上。下例是从 6100端口 转到 7100端口 :
adb forward tcp:6100 tcp:7100
也可使用UNIX命名的socket标识:
adb forward tcp:6100 local:logd
补充:关于 adb forward
命令的做用不是很明白,网上搜了下,大部分文章都是转载了 浅析 adb 命令 - adb forward ,不知道这是否是原文,反正看不得不是很明白。有哪位大神能跟我讲讲嘛?
使用 adb 命令 pull
和 push
能从 Android 设备拷贝或复制文件到 Android 设备。跟 install
命令不一样,pull
和 push
命令容许拷贝和复制文件到任何位置。
从模拟器或手机拷贝文件或文件夹(包括文件夹的子目录)
adb pull [-a] <remote_path> <local_path> (-a:保留文件时间戳及属性)
将文件或文件夹(包括文件夹的子目录)拷贝到模拟器或手机
adb push <local_path> <remote_path>
好比,我想把桌面的 log.txt 复制到手机的 dev 目录下,则命令以下:
$ adb push /Users/littlejie/Desktop/log.txt /dev
有时候,使用该命令复制文件到手机或从手机复制文件,会碰到以下提示:
failed to copy 'log.txt' to '/dev/log.txt': Permission denied
备注: Permission denied 这个问题之前在使用 Windows 系统的时候碰到过,如今转 Mac 后就没有再遇到,难道是我打开方式不对嘛?再补充一点, Mac 上我运行 adb root
命令真的有点一头雾水,由于居然提示:
$ adb root adbd is already running as root
这是由于当前用户没有相应的权限或者是 /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系统64四、75五、777权限详解
这里简单讲一下 adb shell
的使用,由于 adb shell
的用法太多,功能太强,彻底能够专门分出一篇文章来记录~不出意外,下周应该能写完~有兴趣的同窗能够本身先去看 Google 的官方文档:ADB Shell Commands
adb shell 有两种使用方式,一种是不进入 remote shell 直接执行命令行,格式以下:
adb [-d|-e|-s <serialNumber>] shell <shell_command>
还有一种是,进入模拟器或手机的 remote shell 执行,格式以下:
adb [-d|-e|-s <serialNumber>] shell
在某些状况下须要重启 adb 服务来解决问题,好比 adb 无响应。这时你能够经过 adb kill-server
来实现这一操做。
以后,经过 adb start-server
或者任意 adb 命令来重启 adb 服务。
$ adb kill-server $ adb start-server * daemon not running. starting it now on port 5037 * * daemon started successfully * $ adb kill-server $ adb devices List of devices attached * daemon not running. starting it now on port 5037 * * daemon started successfully * emulator-5556 device emulator-5554 device
平时咱们都是使用 USB调试,可是如今也支持经过 WIFI 进行调试了。使用方式以下:
shell $ adb tcpip 5555
设置——>关于手机——>状态——>IP地址
。在 Androir Wear 上,你能够经过以下方式查看:设置——>Wi-Fi设置——>高级——>IP地址
shell adb connect <device_ip_address>
shell $ adb devices List of devices attached <device-ip-address>:5555 device
经过以上步骤,就能够开心的享用 WiFi 调试了。若是没有正常链接,能够按照下面的步骤检查:
adb connect <device_ip_address>
命令这是一篇关于 Android 设备 USB调试 和 WiFi调试 相互切换 的博文,博主写了一个脚原本实现这个过程,有兴趣的同窗能够去看看。
shell $ adb shell emulator-5554
shell //直接在终端输出 $ adb bugreport //将 bugreport 输出到指定文件 $ adb bugreport > file_path
adb bugreport
这个命令很是简单,可是在实际应用中很是有用,它会输出从开机以后详细的 dumpsys 、 dumpstate 和 logcat 信息,是一份完整的日志记录。对分析用户行为、异常信息、系统状态有很大的参考做用。通常咱们会把 bugreport 导出到电脑上分析。
bugreport 的详细使用能够参考 Baniel01 的这篇 Android adb bugreport工具分析和使用 文章,里面有很详细的介绍。
shell $ adb logcat
shell $ adb help
shell adb reboot
shell //此命令会重启守护进程 $ adb root //不以 root 权限开启 adb 守护进程 $ adb unroot
以上就是 adb 命令的常见用法,大部分翻译自 Android Debug Bridge ,其中加了一些我的总结。有些不经常使用的 adb 命令没有介绍,更多 adb 用法请见:Adb Command Summary。文中若有纰漏,欢迎你们留言指出。
微博:厉圣杰