Android ADB详解

ADB

Android 调试桥 (adb) 是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试应用,并提供对 Unix shell(可用来在模拟器或连接的设备上运行各种命令)的访问。该工具作为一个客户端-服务器程序,包括三个组件:

  • 客户端,该组件发送命令。客户端在开发计算机上运行。您可以通过发出 adb 命令从命令行终端调用客户端。
  • 后台程序,该组件在设备上运行命令。后台程序在每个模拟器或设备实例上作为后台进程运行。
  • 服务器,该组件管理客户端和后台程序之间的通信。服务器在开发计算机上作为后台进程运行。

ADB 工作方式

启动一个 adb 客户端时,此客户端首先检查是否有已运行的 adb 服务器进程。如果没有,它将启动服务器进程。当服务器启动时,它与本地 TCP 端口 5037 绑定,并侦听从 adb 客户端发送的命令—所有 adb 客户端均使用端口 5037 与 adb 服务器通信。

然后,服务器设置与所有运行的模拟器/设备实例的连接。它通过扫描 5555 到 5585 之间(模拟器/设备使用的范围)的奇数号端口查找模拟器/设备实例。服务器一旦发现 adb 后台程序,它将设置与该端口的连接。请注意,每个模拟器/设备实例将获取一对按顺序排列的端口 — 用于控制台连接的偶数号端口和用于 adb 连接的奇数号端口。例如:

模拟器 1,控制台:5554
模拟器 1,adb:5555
模拟器 2,控制台:5556
模拟器 2,adb:5557
以此类推...

如上所示,在端口 5555 与 adb 连接的模拟器实例与侦听端口 5554 的控制台的实例相同。

当服务器已设置与所有模拟器实例的连接后,您可以使用 adb 命令访问这些实例。由于服务器管理与模拟器/设备实例的连接,并处理来自多个 adb 客户端的命令,因此,您可以从任意客户端(或从某个脚本)控制任意模拟器/设备实例。

ADB CS模式解读

ADB 主要存放在SDK安装目录下的platform-tools文件夹中,它是一个非常强大的命令行工具,通过这个工具你能够与你的Android设备进行交互。同时这是一个包含了以下三部分的CS模式的程序:

adb client

从图中,我们知道Client是运行在PC端的,每当我们发起一个adb命令的时候,就会开启一个Client程序。当然,当我们开启DDMS或者ADT的时候,也会自动创建Client。

当我们开启一个Client的时候,它首先会去检测后台是否已经有一个Server程序在运行着,否则会开启一个adb-server进程。

所有的Client都是通过5037端口与adb-server进行通信的。

adb daemon(adbd)

从图中,我们知道daemon是作为一个后台进程运行在模拟器/真实Android设备中的。

daemon使用端口的范围是5554-5585,每个模拟器/设备连接到PC端时,总会开启这么一个后台进程,并且为其分配了两个连续的端口,比如:Emulator 1, console: 5554 Emulator 1, adb: 5555

也正因为每个设备都分一组两个端口,也已adb连接手机的最大数量为16。

说回端口的作用,在这两个端口中,其中偶数端口是用于server 与设备进行交互的,可以让server直接从设备中读取数据,而奇数端口是用来与设备的adbd进行连接通信的。

adb server

从图中,我们同样可以知道,Server也是作为一个后台的程序运行在PC端的,他负责管理Client进程以及adb daemon之间的通信。

当一个Server开启的时候,他会自动绑定并且监听5037端口,接收Client通过该端口发送过来的命令。同时Server还会对5555-5585间的奇数端口进行扫描,进行对已连接设备的定位。

Android adb命令大全

通过ADB命令查看wifi密码、MAC地址、设备信息、操作文件、查看文件、日志信息、卸载、启动和安装APK等。

  1. 获取序列号:
    adb get-serialno

  2. 查看连接计算机的设备:
    adb devices

  3. 重启机器:
    adb reboot

  4. 查看log:
    adb logcat

  5. 终止adb服务进程:

adb kill-server

  1. 重启adb服务进程:

adb start-server

  1. 获取机器MAC地址:
    adb shell cat /sys/class/net/wlan0/address

  2. 获取CPU序列号:
    adb shell cat /proc/cpuinfo

  3. 安装APK:
    adb install <apkfile> //比如:adb install baidu.apk

10 .保留数据和缓存文件,重新安装apk:

adb install -r <apkfile> //比如:adb install -r baidu.apk

  1. 安装apk到sd卡:

adb install -s <apkfile> // 比如:adb install -s baidu.apk

  1. 卸载APK:
    adb uninstall <package> //比如:adb uninstall com.baidu.search

  2. 卸载app但保留数据和缓存文件:
    adb uninstall -k <package> //比如:adb uninstall -k com.baidu.search

  3. 启动应用:
    adb shell am start -n <package_name>/.<activity_class_name>

  4. 查看设备cpu和内存占用情况:
    adb shell top

  5. 查看占用内存前6的app:
    adb shell top -m 6

  6. 查询各进程内存使用情况:
    adb shell procrank

  7. 杀死一个进程:
    adb shell kill [pid]

  8. 查看进程列表:
    adb shell ps

  9. 查看后台services信息:
    adb shell service list

  10. 查看当前内存占用:
    adb shell cat /proc/meminfo

  11. 从本地复制文件到设备:
    adb push <local> <remote>

  12. 从设备复制文件到本地:
    adb pull <remote> <local>

发出 shell 命令

可以使用 shell 命令通过 adb 发出设备命令,可以进入或不进入模拟器/设备实例上的 adb 远程 shell。要在不进入远程 shell 的情况下发出一个命令,请使用如下 shell 命令:
adb [-d|-e|-s serial_number] shell shell_command
或者,使用如下命令进入模拟器/设备实例上的远程 shell:
adb [-d|-e|-s serial_number] shell
shell 命令二进制文件存储在模拟器或设备的文件系统中,其路径为 /system/bin/

调用 Activity Manager

在 adb shell 中,您可以使用 Activity Manager (am) 工具发出命令以执行各种系统操作,如启动 Activity、强行停止进程、广播 intent、修改设备屏幕属性及其他操作。在 shell 中,此语法为:
am command
您也可以直接从 adb 发出 Activity Manager 命令,无需进入远程 shell。例如:
adb shell am start -a android.intent.action.VIEW

调用软件包管理器

在 adb shell 中,您可以使用软件包管理器 (pm) 工具发出命令,以对设备上安装的应用软件包进行操作和查询。在 shell 中,此语法为:
pm command
您也可以直接从 adb 发出软件包管理器命令,无需进入远程 shell。例如:
adb shell pm uninstall com.example.MyApp

进行屏幕截图

screencap 命令是一个用于对设备显示屏进行屏幕截图的 shell 实用程序。在 shell 中,此语法为:
screencap filenam
要从命令行使用 screencap,请输入以下命令:
$ adb shell screencap /sdcard/screen.png
以下屏幕截图会话示例向您展示使用 adb shell 捕获屏幕截图,并使用 pull 命令从设备下载此文件:

$ adb shell
shell@ $ screencap /sdcard/screen.png
shell@ $ exit
$ adb pull /sdcard/screen.png

推荐阅读更多精彩内容

  • 从周一开始,每天码几个字,一周我就不信会凑不够500。 那么我想说点什么呢。说说自己从生活中积攒的小tips吧。这...
    王亚亚阅读 43评论 2 2
  • 高考过后报志愿,稀里糊涂的选了汉语言文学专业,我本不是个擅长写作热爱写作的人,但既然选择了汉语言文学,不能到...
    哦嗨阅读 39评论 0 0
  • 4月8日,星期天,晴 昨天晚上睡不好,白天无精打采。上午补觉,中午去地里把老掉的菜拔掉,要种辣椒茄子了。 下午出去...
    潘根春阅读 483评论 0 4
  • 今天下午,准确的是3点半左右,车在高速路上行驶。我坐在后面也睡不着便觉四处张望。刚刚好我朝前面望去,一团白色的东西...
    风重阅读 187评论 3 3