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等。
-
获取序列号:
adb get-serialno
-
查看连接计算机的设备:
adb devices
-
重启机器:
adb reboot
-
查看log:
adb logcat
-
终止adb服务进程:
adb kill-server
- 重启adb服务进程:
adb start-server
-
获取机器MAC地址:
adb shell cat /sys/class/net/wlan0/address
-
获取CPU序列号:
adb shell cat /proc/cpuinfo
-
安装APK:
adb install <apkfile> //比如:adb install baidu.apk
10 .保留数据和缓存文件,重新安装apk:
adb install -r <apkfile> //比如:adb install -r baidu.apk
- 安装apk到sd卡:
adb install -s <apkfile> // 比如:adb install -s baidu.apk
-
卸载APK:
adb uninstall <package> //比如:adb uninstall com.baidu.search
-
卸载app但保留数据和缓存文件:
adb uninstall -k <package> //比如:adb uninstall -k com.baidu.search
-
启动应用:
adb shell am start -n <package_name>/.<activity_class_name>
-
查看设备cpu和内存占用情况:
adb shell top
-
查看占用内存前6的app:
adb shell top -m 6
-
查询各进程内存使用情况:
adb shell procrank
-
杀死一个进程:
adb shell kill [pid]
-
查看进程列表:
adb shell ps
-
查看后台services信息:
adb shell service list
-
查看当前内存占用:
adb shell cat /proc/meminfo
-
从本地复制文件到设备:
adb push <local> <remote>
-
从设备复制文件到本地:
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