Android之ADB总结
本文内容如下:
1. makefile分析及总结
2. adb框架介绍
3. adbd源码分析
3.1 adbd初始化流程分析
3.2 adb shell流程分析
3.3 adb root流程分析
4. adb常用命令
一、makefile分析及总结
关键点总结:
二、adb框架介绍
ADB为 Android Debug Bridge(调试桥)的缩写,本质上是一个 C/S 架构的命令行工具。整个ADB模块由如下几部分组成(详细参见system/core/adb/OVERVIEW.txt和transports.txt):
- The ADB server(adb):运行在PC端的一个后台应用程序,用来检测Android Devices的连接或去除,进而维护设备状态列表。另外,ADB Server也会负责协调Client、Services和Android devices之间传输数据。
- The ADB daemon (adbd) : 运行在Android Devices或Emulator上的后台守护进程。该进程主要是用来连接ADB Server,并通过USB(或者TCP)为adb clients提供一些services服务。
- The ADB command-line client: 执行adb 命令的终端。具体来说,会连接adb server并向adb server发送请求命令。若是发现adb server没有启动,则会自动唤起adb server.
- Services: adb具备的一些能力可以抽象成服务(services),供The ADB command-line client访问。可以分为 Host Services和Local Services两种,简述如下:
注:本篇文章只分析ADBD的实现。
三、adbd源码分析
- adbd初始化流程分析
ADB分为usb adb和wifi adb两种方式,两者互斥存在,默认使用的是usb adb. 如果想默认启动wifi adb,需设置属性service.adb.tcp.port值为55555,然后重启adbd即可。ADB daemon(usb adb.)程序开机启动主要步骤如下图所示。
说明如下:
- DEFAULT_ADB_PORT为adb server的端口号,定义如下,一般取值为5037。有时PC上adb无法使用,可能就是由于该端口已经腾讯等手机助手等占用。
- 1.1.1-init_transport_registration()分析如下:
因此,接下来需要分析transport_registration_recv会接收数据,即transport_registration_send何时会发送数据。
- 1.1.2-adbd_cloexec_auth_socket()分析如下:
- 1.1.3-should_drop_privileges()分析如下:
- 1.1.4-usb_init()分析如下:
- 紧接着会调用transport_registration_func(int _fd, unsigned ev, void *data)
后续大概流程为:
至此,adbd的主要初始化过程已分析完毕。其中最为关键的是初始化了adb驱动节点,然后创建output_thread不断的读取节点内容变化
2. adb shell流程分析
由3.1节知,output_thread从adb驱动节点读取数据后,调用write_packet(t->fd, t->serial, &p))会触发调用transport_socket_events()函数进行数据处理。
3. adb root流程分析
四、adb常用命令
adb 命令一般格式为:adb [-e | -d | -s <设备序列号>] <子命令>
- adb version,查看adb版本
- adb tcpip 5555,设置属性ersist.adb.tcp.port=5555,重启adbd进入adb wifi模式。
- adb devices , 获取设备列表及设备状态
- adb get-state , 获取设备的状态,设备的状态有 3 钟,device , offline , unknown
- adb kill-server , adb start-server
- adb logcat , 打印 Android 的系统日志
- adb bugreport
- adb install
安装应用,覆盖安装是使用 -r 选项
- adb uninstall
- adb pull , 将 Android 设备上的文件或者文件夹复制到本地
- adb push , 推送本地文件至 Android 设备
- adb root , adb remount, 获取 root 权限,并挂载系统文件系统为可读写状态
- adb reboot , 重启 Android 设备
- adb reboot loader , 重启设备,进入 fastboot 模式,同 adb reboot-bootloader 命令
- adb reboot recovery , 重启设备,进入 recovery 模式
- adb connect <device-ip-address>/adb disconnect <device-ip-address>
上述为adb程序自带的命令,与android无关,而Android系统自身的命令,实现位于system/bin(pm,am,screenrecord,getprop,input,ime,wm,settings,monkey,dumpsys,logcat,log,uiautomator等)。除此之外,就是linux自带的命令,自行查阅。
后记:因adb实际开发需要,研究了下adb源码,上述算是一个总结。本着开源的精神,大家共同进步!
参考文章:
Android之ADB总结
本文内容如下:
1. makefile分析及总结
2. adb框架介绍
3. adbd源码分析
3.1 adbd初始化流程分析
3.2 adb shell流程分析
3.3 adb root流程分析
4. adb常用命令
一、makefile分析及总结
关键点总结:
二、adb框架介绍
ADB为 Android Debug Bridge(调试桥)的缩写,本质上是一个 C/S 架构的命令行工具。整个ADB模块由如下几部分组成(详细参见system/core/adb/OVERVIEW.txt和transports.txt):
- The ADB server(adb):运行在PC端的一个后台应用程序,用来检测Android Devices的连接或去除,进而维护设备状态列表。另外,ADB Server也会负责协调Client、Services和Android devices之间传输数据。
- The ADB daemon (adbd) : 运行在Android Devices或Emulator上的后台守护进程。该进程主要是用来连接ADB Server,并通过USB(或者TCP)为adb clients提供一些services服务。
- The ADB command-line client: 执行adb 命令的终端。具体来说,会连接adb server并向adb server发送请求命令。若是发现adb server没有启动,则会自动唤起adb server.
- Services: adb具备的一些能力可以抽象成服务(services),供The ADB command-line client访问。可以分为 Host Services和Local Services两种,简述如下:
注:本篇文章只分析ADBD的实现。
三、adbd源码分析
- adbd初始化流程分析
ADB分为usb adb和wifi adb两种方式,两者互斥存在,默认使用的是usb adb. 如果想默认启动wifi adb,需设置属性service.adb.tcp.port值为55555,然后重启adbd即可。ADB daemon(usb adb.)程序开机启动主要步骤如下图所示。
说明如下:
- DEFAULT_ADB_PORT为adb server的端口号,定义如下,一般取值为5037。有时PC上adb无法使用,可能就是由于该端口已经腾讯等手机助手等占用。
- 1.1.1-init_transport_registration()分析如下:
因此,接下来需要分析transport_registration_recv会接收数据,即transport_registration_send何时会发送数据。
- 1.1.2-adbd_cloexec_auth_socket()分析如下:
- 1.1.3-should_drop_privileges()分析如下:
- 1.1.4-usb_init()分析如下:
- 紧接着会调用transport_registration_func(int _fd, unsigned ev, void *data)
后续大概流程为:
至此,adbd的主要初始化过程已分析完毕。其中最为关键的是初始化了adb驱动节点,然后创建output_thread不断的读取节点内容变化
2. adb shell流程分析
由3.1节知,output_thread从adb驱动节点读取数据后,调用write_packet(t->fd, t->serial, &p))会触发调用transport_socket_events()函数进行数据处理。
3. adb root流程分析
四、adb常用命令
adb 命令一般格式为:adb [-e | -d | -s <设备序列号>] <子命令>
- adb version,查看adb版本
- adb tcpip 5555,设置属性ersist.adb.tcp.port=5555,重启adbd进入adb wifi模式。
- adb devices , 获取设备列表及设备状态
- adb get-state , 获取设备的状态,设备的状态有 3 钟,device , offline , unknown
- adb kill-server , adb start-server
- adb logcat , 打印 Android 的系统日志
- adb bugreport
- adb install
安装应用,覆盖安装是使用 -r 选项
- adb uninstall
- adb pull , 将 Android 设备上的文件或者文件夹复制到本地
- adb push , 推送本地文件至 Android 设备
- adb root , adb remount, 获取 root 权限,并挂载系统文件系统为可读写状态
- adb reboot , 重启 Android 设备
- adb reboot loader , 重启设备,进入 fastboot 模式,同 adb reboot-bootloader 命令
- adb reboot recovery , 重启设备,进入 recovery 模式
- adb connect <device-ip-address>/adb disconnect <device-ip-address>
上述为adb程序自带的命令,与android无关,而Android系统自身的命令,实现位于system/bin(pm,am,screenrecord,getprop,input,ime,wm,settings,monkey,dumpsys,logcat,log,uiautomator等)。除此之外,就是linux自带的命令,自行查阅。
后记:因adb实际开发需要,研究了下adb源码,上述算是一个总结。