Android 工具

Android 工具-adb

版权声明:本文为博主原创文章,未经博主允许不得转载。

Android 开发中, adb 是开发者经常使用的工具,是 Android 开发者必须掌握的。

/platform-tools//system/core/adb
  1. 客户端部分,运行在开发用的电脑上,可以在命令行中运行adb命令来调用该客户端,像 DDMS 这样的 Android 工具也可以调用 adb 客户端。
  2. 守护进程部分,运行于模拟器或手机的后台。
  3. 服务端部分,是运行在开发用电脑上的后台进程,用于管理客户端与运行在模拟器或真机的守护进程通信。

adb 工具模型示意图如下:

adb 的工作原理

当启动 adb 客户端时,客户端首先检查 adb 服务端进程是否运行,如果没有运行,则启动服务端。当服务端启动时,它会绑定到本地的 TCP5037 端口,并且监听从 adb 客户端发来的命令——所有 adb 客户端都使用 5037 端口与 adb 服务端通信。

接下来服务端与所有正在运行的模拟器或手机连接。它通过扫描 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 客户端的命令,所以可以从任何一个客户端或脚本来控制任何模拟器或手机设备。

补充

设置——>关于手机

adb 用法

查询模拟器或手机状态

了解 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<br/>
List of devices attached<br/>
emulator-5554  device<br/>
emulator-5556  device<br/>
emulator-5558  device<br/>
</code></pre>
<p>如果没有模拟器或手机在运行,运行 adb devices 命令的执行结果如下:</p>
<pre><code>\) adb devces
List of devices attached

操作指定模拟器或手机

-s
adb -s &lt;serialNumber&gt; &lt;command&gt;
adb devices

例如:

adb -s emulator-5556 install helloWorld.apk
-s
-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<br/>
//同理,如果有多个设备,但只有一个真机,可以使用如下命令快速发送命令<br/>
\) adb -d install helloWorld.apk

安装应用

adb installadb install
adb install [-lrtsdg] &lt;path_to_apk&gt;
(-l: 锁定该程序)
(-r: 重新安装该程序,保留应用数据)
(-t: allow test packages)
(-s: 将应用安装到 SD卡,不过现在手机好像都没有 SD卡 了吧)
(-d: 允许降版本号安装,当然只有 debug 包才能使用)
(-g: 安装完默认授予所有运行时权限,这个应该对 Android 6.0 及之后的版本才有效吧)

更多关于创建 apk 文件可参考:Build And Running

卸载应用

既然有安装应用的命令,那当然有卸载应用的命令。卸载应用命令的格式如下:

//&lt;package&gt; 表示要卸载应用的包名
adb uninstall [-k] &lt;package&gt;
(-k:不删除程序运行所产生的数据和缓存目录)

端口转发

adb forward
adb forward tcp:6100 tcp:7100

也可以使用UNIX命名的socket标识:

adb forward tcp:6100 local:logd
adb forward

与模拟器或手机传输文件

pullpushinstallpullpush

从模拟器或手机拷贝文件或文件夹(包括文件夹的子目录)

adb pull [-a] &lt;remote_path&gt; &lt;local_path&gt;
(-a:保留文件时间戳及属性)

将文件或文件夹(包括文件夹的子目录)拷贝到模拟器或手机

adb push &lt;local_path&gt; &lt;remote_path&gt;

比如,我想把桌面的 log.txt 复制到手机的 dev 目录下,则命令如下:

\( adb push /Users/littlejie/Desktop/log.txt /dev<br/>
</code></pre>
<p>有时候,使用该命令复制文件到手机或从手机复制文件,会碰到如下提示:</p>
<pre><code>failed to copy &#39;log.txt&#39; to &#39;/dev/log.txt&#39;: Permission denied<br/>
</code></pre>
<pre><code>adb root</code></pre>
<pre><code>\) adb root
adbd is already running as root

这是因为当前用户没有相应的权限或者是 /dev 目录不可写。解决方法如下:

//方法一
//已 root 权限启动 adb 服务
\( adb root<br/> //adb remount (重新挂载系统分区,使系统分区重新可写)<br/> \) adb remount
//将文件复制到 /dev 目录下
\( adb push /Users/littlejie/Desktop/log.txt /dev<br/> </code></pre> <pre><code>//方法二:修改文件的读写权限<br/> \) adb shell

su

chmod 777 /dev

关于 Linux 下文件权限的更多内容请参考:linux系统644、755、777权限详解

adb shell

adb shelladb shell

adb shell 有两种使用方式,一种是不进入 remote shell 直接执行命令行,格式如下:

adb [-d|-e|-s &lt;serialNumber&gt;] shell &lt;shell_command&gt;

还有一种是,进入模拟器或手机的 remote shell 执行,格式如下:

adb [-d|-e|-s &lt;serialNumber&gt;] shell

开启或关闭 adb 服务

adb kill-server
adb start-server
\( adb kill-server<br/>
\) adb start-server

  • daemon not running. starting it now on port 5037 *
  • daemon started successfully * \( adb kill-server<br/> \) 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 进行调试了。使用方式如下:

\( adb tcpip 5555<br/>
</code></pre><pre><code>adb connect &lt;device_ip_address&gt;<br/>
</code></pre><pre><code>\) adb devices
List of devices attached
&lt;device-ip-address&gt;:5555 device

通过以上步骤,就可以开心的享用 WiFi 调试了。如果没有正常连接,可以按照下面的步骤检查:

adb connect 

这是一篇关于 Android 设备 USB调试 和 WiFi调试 相互切换 的博文,博主写了一个脚本来实现这个过程,有兴趣的同学可以去看看。

补充

\( adb shell<br/>
emulator-5554<br/>
</code></pre><pre><code>//直接在终端输出<br/>
\) adb bugreport
//将 bugreport 输出到指定文件
\( adb bugreport &gt; file_path<br/> </code></pre><pre><code>\) adb logcat
\( adb help<br/>
</code></pre><pre><code>adb reboot<br/>
</code></pre><pre><code>//此命令会重启守护进程<br/>
\) adb root
//不以 root 权限开启 adb 守护进程
$ adb unroot

总结

以上就是 adb 命令的常见用法,大部分翻译自 Android Debug Bridge ,其中加了一些个人总结。有些不常用的 adb 命令没有介绍,更多 adb 用法请见:Adb Command Summary。文中如有纰漏,欢迎大家留言指出。

参考: