一、ADB工作原理

ADB(安卓调试桥Android debug Bridge),包含ADB client、ADB server 和adbd 三部分。

ADB client:运行在PC 上,通过在命令行执行ADB,就启动了ADB Client 程序。比如 Eclipse DDMS,Windows 终端命令行,豌豆荚等。Client本质上就是 Shell, 用来发送命令给Server。

ADB server:运行在PC 上,作为ADB client 的server 端,也作为adbd 服务进程的客户端。

adbd 服务进程:作为daemon进程运行在Android 系统上,以服务进程运行,当Android 系统启动时,由init 程序启动adbd。

在 PC HOST 端,ADB 会fork 出一个守护进程(不是adbd),即ADB Server,而父进程(ADB Client)继续处理Client 请求,所有的Client 通过TCP 端口号5037 进行与Server 通信,而Server 创建local socket 与 remote socket,前者用于和Client 通信,后者用与远端进行通信,emulator 通过TCP,real device 则通过usb。ADB工作原理图:

adt android 设置 android adbd_android

                                                  (图1:ADB工作原理图)

当启动某个ADB客户端时,客户端会先检查是否有ADB服务器进程正在运行。如果没有,它将启动服务器进程。服务器在启动后会与本地TCP 端口5037 绑定,并监听ADB客户端发出的命令-所有ADB客户端均通过端口5037 与ADB服务器通信。然后,服务器会与所有正在运行的设备建立连接。它通过扫描5555 到5585 之间(该范围供前16 个模拟器使用)的奇数号端口查找模拟器。服务器一旦发现ADB守护进程(adbd),便会与相应的端口建立连接。

adt android 设置 android adbd_重启_02

                                         (图2: 尚未有ADB shell 连接时 5037端口的状态)

adt android 设置 android adbd_Server_03

                                   (图3:有ADB shell 连接时5037商品的状态)

ADB client 与ADB server 之间是通过tcp 进行通信,adb server 和adbd 通过usb 或者tcp 进行通信。ADB Server 对本地的TCP 5037 端口进行监听,等待ADB Client 的命令。如上截图(图2,图3),TCP商品状态,可参考:

二、ADB 常见命令及选项

adb devices [-l] 列举所有设备,-l 表示长输出,包含设备名称等信息。

adb help 查看帮助

adb version 显示adb 版本

adb -a 命令针对所有的设备,需要与命令一起使用,例如adb -a push <local> <remote>

-d:真机(多个设备中只有一个真机时适用)

-e:模拟器(多个设备中只有一个模拟器时适用)

adb -s <specific device> 命令指定设备,有多个模拟器或手机,当使用adb 命令的时候就需要指定目标设备。

adb install [-lrtsdg] <file>

adb install-multiple [-lrtsdpg] <file...>

- push this package file to the device and install it

(-l: 直接锁定app)

(-r: 替换已存在的app)

(-t: 允许安装测试包)

(-s: 安装到sdcard 中)

(-d: 允许降版本安装(只在针对调试版本的app 有用))

(-g: 安装时获取所有权限,(只有6.0 系统可用))

adb uninstall -k <package_name>

可选参数-k 的作用为卸载软件但是保留配置和缓存文件

调试命令:

adb bugreport [<zip_file>] - 生成bugreport 文件

adb logcat 直接输出android 系统的log 日志

scripting:

adb start-server 确保启动adb server(注意,不是adbd)

adb kill-server 杀死adb server

adb get-serialno : 获取设备唯一序列号(如打卡app 通过该值判断是否重复打卡)

adb get-state : 获取设备的状态设备的状态有3 种,device , offline , unknown

l device:设备正常连接

l offline:连接出现异常,设备无响应

l unknown:没有连接设备

adb remount: 重新将设备中/system,/vendor (if present) and /oem (if present) 重新挂载为可读写

adb reboot [bootloader|recovery|sideload|sideload-auto-reboot]

adb reboot bootloader, 重启进入bootloader, 一般会进入fastboot 模式,Android 可以在fastboot 模式下进行烧录镜像。部分平台会进入特定的loader 模式。

l adb reboot recovery :重启到Recovery 界面

l adb reboot sideload :线刷升级包,需要先进入到recovery 模式

l adb reboot sideload-auto-reboot:线刷升级包之后自动重启,不管刷机是否成功。

adb root 以root 权限重启adbd, adb shell 进入之后,就是以root 身份操作了,一般是在镜像为userdebug 版本下。

adb unroot 取消root 权限来重启adbd

adb usb 重启adbd 并监听USB 连接

adb tcpip <port> 重启adbd 并监听指定TCP/IP 端口的连接

基于以上命令衍生出来的常见操作:

adb shell pm list packages: 列举系统已安装的app

adb shell pm list packages -s # 系统应用

adb shell pm list packages -3 # 第三方应用

adb shell pm list packages smart # 包名包含smart 字符串的应用

adb shell dumpsys package <package_name> | grep version :查看某个包的版本信息

adb shell am start -n <package_name>/.<activity_class_name> :手动启动某个activity

adb shell getprop | grep version: 获取系统版本号

adb shell wm size :获取系统分辨率

adb shell dumpsys meminfo : 获取系统进程占用内存情况