Android之ADB总结


本文内容如下:

1. makefile分析及总结

2. adb框架介绍 

3. adbd源码分析

       3.1 adbd初始化流程分析

        3.2 adb shell流程分析

        3.3 adb root流程分析

4. adb常用命令


一、makefile分析及总结

关键点总结:

二、adb框架介绍

Android系统源码adb服务流程 adb 源码_linux

ADB为 Android Debug Bridge(调试桥)的缩写,本质上是一个 C/S 架构的命令行工具。整个ADB模块由如下几部分组成(详细参见system/core/adb/OVERVIEW.txttransports.txt):

  1. The ADB server(adb):运行在PC端的一个后台应用程序,用来检测Android Devices的连接或去除,进而维护设备状态列表。另外,ADB Server也会负责协调Client、Services和Android devices之间传输数据。
  2. The ADB daemon (adbd) : 运行在Android Devices或Emulator上的后台守护进程。该进程主要是用来连接ADB Server,并通过USB(或者TCP)为adb clients提供一些services服务。
  3. The ADB command-line client: 执行adb 命令的终端。具体来说,会连接adb server并向adb server发送请求命令。若是发现adb server没有启动,则会自动唤起adb server.
  4. Services: adb具备的一些能力可以抽象成服务(services),供The ADB command-line client访问。可以分为 Host Services和Local Services两种,简述如下:

注:本篇文章只分析ADBD的实现。

三、adbd源码分析

  1. adbd初始化流程分析  

    ADB分为usb adb和wifi adb两种方式,两者互斥存在,默认使用的是usb adb. 如果想默认启动wifi adb,需设置属性service.adb.tcp.port值为55555,然后重启adbd即可。ADB daemon(usb adb.)程序开机启动主要步骤如下图所示。

 

Android系统源码adb服务流程 adb 源码_java_02

说明如下:

  • 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)

后续大概流程为:

Android系统源码adb服务流程 adb 源码_apache_03

至此,adbd的主要初始化过程已分析完毕。其中最为关键的是初始化了adb驱动节点,然后创建output_thread不断的读取节点内容变化

2. adb shell流程分析

由3.1节知,output_thread从adb驱动节点读取数据后,调用write_packet(t->fd, t->serial, &p))会触发调用transport_socket_events()函数进行数据处理。

Android系统源码adb服务流程 adb 源码_apache_04

3. adb root流程分析

Android系统源码adb服务流程 adb 源码_java_05

Android系统源码adb服务流程 adb 源码_java_06

Android系统源码adb服务流程 adb 源码_Android系统源码adb服务流程_07

Android系统源码adb服务流程 adb 源码_android_08

Android系统源码adb服务流程 adb 源码_apache_09

Android系统源码adb服务流程 adb 源码_apache_10

 

Android系统源码adb服务流程 adb 源码_Android系统源码adb服务流程_11

 

四、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框架介绍

Android系统源码adb服务流程 adb 源码_linux

ADB为 Android Debug Bridge(调试桥)的缩写,本质上是一个 C/S 架构的命令行工具。整个ADB模块由如下几部分组成(详细参见system/core/adb/OVERVIEW.txttransports.txt):

  1. The ADB server(adb):运行在PC端的一个后台应用程序,用来检测Android Devices的连接或去除,进而维护设备状态列表。另外,ADB Server也会负责协调Client、Services和Android devices之间传输数据。
  2. The ADB daemon (adbd) : 运行在Android Devices或Emulator上的后台守护进程。该进程主要是用来连接ADB Server,并通过USB(或者TCP)为adb clients提供一些services服务。
  3. The ADB command-line client: 执行adb 命令的终端。具体来说,会连接adb server并向adb server发送请求命令。若是发现adb server没有启动,则会自动唤起adb server.
  4. Services: adb具备的一些能力可以抽象成服务(services),供The ADB command-line client访问。可以分为 Host Services和Local Services两种,简述如下:

注:本篇文章只分析ADBD的实现。

三、adbd源码分析

  1. adbd初始化流程分析  

    ADB分为usb adb和wifi adb两种方式,两者互斥存在,默认使用的是usb adb. 如果想默认启动wifi adb,需设置属性service.adb.tcp.port值为55555,然后重启adbd即可。ADB daemon(usb adb.)程序开机启动主要步骤如下图所示。

 

Android系统源码adb服务流程 adb 源码_java_02

说明如下:

  • 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)

后续大概流程为:

Android系统源码adb服务流程 adb 源码_apache_03

至此,adbd的主要初始化过程已分析完毕。其中最为关键的是初始化了adb驱动节点,然后创建output_thread不断的读取节点内容变化

2. adb shell流程分析

由3.1节知,output_thread从adb驱动节点读取数据后,调用write_packet(t->fd, t->serial, &p))会触发调用transport_socket_events()函数进行数据处理。

Android系统源码adb服务流程 adb 源码_apache_04

3. adb root流程分析

Android系统源码adb服务流程 adb 源码_java_05

Android系统源码adb服务流程 adb 源码_java_06

Android系统源码adb服务流程 adb 源码_Android系统源码adb服务流程_07

Android系统源码adb服务流程 adb 源码_android_08

Android系统源码adb服务流程 adb 源码_apache_09

Android系统源码adb服务流程 adb 源码_apache_10

 

Android系统源码adb服务流程 adb 源码_Android系统源码adb服务流程_11

 

四、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源码,上述算是一个总结。