前言

因为工作需要,需要对ADB进行分析分析;对adb的一般操作我们Android开发人员肯定是不陌生的。但是觉adb是怎么工作的,估计很多人了解的不多,那我们就对adb的工作原理进行一下分析。

ADB的概述

我一开始想的是直接从源码入手,看看ADB的源码结构是怎么样的,为此我花了大概一天的时间,从main()函数一路往下看,在函数的调用中我都不知道我想分析的是什么了,加上C/C++语言风格比较晦涩,我承认我还是很弱,最终没搞清楚到底是怎么回事。

所以,还是需要先对ADB有比较全局的认识,这样才能比较清晰的知道自己想分析什么和能哪里入手。对此,在源码路径下,google的天使们给我们提供了说明文件:android/system/core/adb/OVERVIEW.txt
在OVERVIEW.txt文件对ADB进行整体的定位,主要是从组成部分和不同部分之间的通信协议上进行了概述。(英语棒棒的请直接阅读原文)

Android Debug Brigdge (ADB) 主要用于以下场景
  • 追踪的Android设备和模拟器和开发者主机(开发时使用的电脑)的连接,或者运行在开发主机上面
  • 实现各种控制指令(“adb shell”,“adb pull”)这些指令在ADB中被称为service。
一.ADB的主要组成部分
1. ADB Server

这是在开发者主机上运行的后台程序,目的是用来检测USB端口,以了解什么时候有设备的连接和移除。已经仿真器实例什么时候开启和停止。他会维护一个列表,保存有已连接设备及其状态。然后adb server实际上也是用多路复用的环路,主要是为了连接client,service和Android device之间的数据交换。

2. ADB Daemon(adbd)

这是运行在Android device或者仿真器上面的后台程序。主要作用是连接ADB Server 和android device或者仿真器并为在开发者主机上的client提供一些服务.

3.ADB Command-line client

这通常被用来从shell或者脚本执行adb 指令.它首先会尝试连接位于开发主机上面的ADB Server,如果ADB Server还没有起来则会自动启动ADB Server,然后Client会发送service请求到ADB Server.

4. Serviece

这里指的client交互的service有两个意思.

  1. Host Service
    这个service运行在ADB Server中所以不需要和Android Device进行通信,一个典型的例子就是"adb devices",就会返回一个当前一直设备和他们状态的列表.
  2. Local Service
    这些服务是运行在adbd中,有Android设备启动的.ADB server 用于在客户端和adbd中运行的Server之间多路传输流。在这种情况下,它的作用是启动连接,然后作为数据的传递.
二. 各组成部分通信
1. client <-> Server

在ADB client 和ADB Server之间也是需要进行通信的,ADB Server会监听TCP:localhost:5037.
一个client 发送数据的格式为:

  • 一个4字节的十六进制字符串,给出有效负载的长度
  • 数据不超过有效载荷本身。

然后client会连接到tcp loaclhost:5037,接着通过当前套接字中发送字符串"000Chost:version"。这个“host”前缀标志申请链接的地址是ADB Server。传递的消息编码采用的是便于调试的ASCII编码。

ADB Server 接受到请求会回复client

  • 如果成功,则返回回复4个字节的“OKAY”字符串
  • 如果失败,则返回4字节的“FAIL”字符串,后跟4字节的十六进制长度字符串说明失败原因
  • 如果是有特殊的异常,对于“host:version”,会回复一个与服务器的内部版本号相对应的4字节十六进制字符串

这其中更多的SERVER 可以参考同级目录下的SERVICE.txt文件。

2. Transports

Transports主要发生ADB Server 和Android device【Emulator】之间;目前有两种方式

  • 通过USB,连接Android device
  • 通过TCP,进行本地传输,用于主机上运行的模拟器,通过TCP连接到ADB Server,当然也可以通过TCP将Android device和ADB Server连接。
三. Android.mk

ADB 只有是一套代码,server , client等不同的功能部分被分别编译出程序,所以我们就要去看看它的Makefile文件。
system/core/adb/Android.mk
除去一些运行需要的库和一下test程序,整个ADB源码会编译出两个主要的程序,

  1. adb/adb.exe:运行于PC端(包括Windows、Linux、MacOS等操作系统之上),位于platform/tools/adb目录下,透过adb命令可以唤起。
  2. adbd:运行于Android设备上,开机时自动启动
...
## 编译一些adb和adbd运行是需要的库和一些test程序
...
# adb host tool
# =========================================================
include $(CLEAR_VARS)LOCAL_LDLIBS_linux := -lrt -ldl -lpthreadLOCAL_LDLIBS_darwin := -lpthread -framework CoreFoundation -framework IOKit -framework Carbon -lobjc# Use wmain instead of main
LOCAL_LDFLAGS_windows := -municode
LOCAL_LDLIBS_windows := -lws2_32 -lgdi32
LOCAL_SHARED_LIBRARIES_windows := AdbWinApi
LOCAL_REQUIRED_MODULES_windows := AdbWinUsbApiLOCAL_SRC_FILES := \adb_client.cpp \bugreport.cpp \client/main.cpp \console.cpp \commandline.cpp \file_sync_client.cpp \line_printer.cpp \services.cpp \shell_service_protocol.cpp \LOCAL_CFLAGS += \$(ADB_COMMON_CFLAGS) \-D_GNU_SOURCE \-DADB_HOST=1 \LOCAL_CFLAGS_windows := \$(ADB_COMMON_windows_CFLAGS)
women
LOCAL_CFLAGS_linux := \$(ADB_COMMON_linux_CFLAGS) \LOCAL_CFLAGS_darwin := \$(ADB_COMMON_darwin_CFLAGS) \-Wno-sizeof-pointer-memaccess -Wno-unused-parameter \LOCAL_MODULE := adb
LOCAL_MODULE_TAGS := debug
LOCAL_MODULE_HOST_OS := darwin linux windowsLOCAL_SANITIZE := $(adb_host_sanitize)
LOCAL_STATIC_LIBRARIES := \libadb \libbase \libcrypto_utils \libcrypto \libdiagnose_usb \liblog \libmdnssd \libusb \# Don't use libcutils on Windows.
LOCAL_STATIC_LIBRARIES_darwin := libcutils
LOCAL_STATIC_LIBRARIES_linux := libcutilsLOCAL_CXX_STL := libc++_static# Don't add anything here, we don't want additional shared dependencies
# on the host adb tool, and shared libraries that link against libc++
# will violate ODR
LOCAL_SHARED_LIBRARIES :=include $(BUILD_HOST_EXECUTABLE)$(call dist-for-goals,dist_files sdk win_sdk,$(LOCAL_BUILT_MODULE))
ifdef HOST_CROSS_OS
# Archive adb.exe for win_sdk build.
$(call dist-for-goals,win_sdk,$(ALL_MODULES.host_cross_adb.BUILT))
endif# adbd device daemon
# =========================================================include $(CLEAR_VARS)LOCAL_SRC_FILES := \daemon/main.cpp \daemon/mdns.cpp \services.cpp \file_sync_service.cpp \framebuffer_service.cpp \remount_service.cpp \set_verity_enable_state_service.cpp \shell_service.cpp \shell_service_protocol.cpp \LOCAL_CFLAGS := \$(ADB_COMMON_CFLAGS) \$(ADB_COMMON_linux_CFLAGS) \-DADB_HOST=0 \-D_GNU_SOURCE \-Wno-deprecated-declarations \LOCAL_CFLAGS += -DALLOW_ADBD_NO_AUTH=$(if $(filter userdebug eng,$(TARGET_BUILD_VARIANT)),1,0)ifneq (,$(filter userdebug eng,$(TARGET_BUILD_VARIANT)))
LOCAL_CFLAGS += -DALLOW_ADBD_DISABLE_VERITY=1
LOCAL_CFLAGS += -DALLOW_ADBD_ROOT=1
endifLOCAL_MODULE := adbdLOCAL_FORCE_STATIC_EXECUTABLE := trueLOCAL_SANITIZE := $(adb_target_sanitize)
LOCAL_STRIP_MODULE := keep_symbols
LOCAL_STATIC_LIBRARIES := \libadbd \libasyncio \libavb_user \libbase \libqemu_pipe \libbootloader_message \libfs_mgr \libfec \libfec_rs \libselinux \liblog \libext4_utils \libsquashfs_utils \libcutils \libbase \libcrypto_utils \libcrypto \libminijail \libmdnssd \libdebuggerd_handler \
include $(BUILD_EXECUTABLE)
四. 源码结构

经过上面的叙述。至少是从整体上对adb 有个一个比较全局的认识,不至于一套扎进代码里面出不来了。接着我就就要在次进入源码中,看看add的源码层面是怎么样的。

我们从目录结构上看,主要有四个部分,

  • client目录,这主要就是编译运行在PC端的adb程序需要的专有代码。
  • deamon目录,这里面主要就是编译运行在Android device中的adbd程序需要的专有代。
  • sysdeps目录,这里面主要是和系统相关的,比如adb 在linux 和window系统需要的api不同。
  • 公共的代码文件,在编译不同的模块可能都会用到的代码就会放在这个下面。

这篇文章主要从整体层面对adb进行简单的分析,接下来我会就源码内容,对adbd的启动流程进行梳理,请参考

ADB(二)_ADBD_main()函数代码梳理

ADB(一)_概况了解相关推荐

  1. android 停用应用的命令,免Root使用ADB命令_停用手机系统应用

    菜鸟教程,老鸟勿喷! 对于未解锁的手机,总存在那么一些我们用不到,甚至看都不想看到的应用,但是没办法卸载,在这里提供一些禁用掉这些应用的方法供参考: 1. 开发者模式打开ADB调试 2. 连接电脑,在 ...

  2. linux adb工具_这是一个可以显示Linux命令的工具

    Progress进度查看器是一个简单的程序,可用于显示Coreutils命令的进度.它使用来自文件描述符的信息来确定命令的进度.Progress的优点在于它可以与其他Linux命令一起使用,比如wat ...

  3. python3调用adb命令_如何使用Python执行adb命令?

    我不得不修改一些函数,让它在Python2.7上运行,并使用subprocess代替.这里是我的版本中修改过的代码:def __build_command__(self,cmd): if self._ ...

  4. java adb命令_从Java程序执行ADB命令

    我正在使用的程序使用ADB(Android调试桥)将文件发送到手机: for (String s : files) String cmd = "adb -s 0123456789ABCDEF ...

  5. ios手机怎么连接adb命令_手机连接电脑,使用adb命令

    手机连接电脑使用adb命令,主要是有2种方式,其中最常见的就是第一种,用usb连线使用 1:adb usb - restarts the adbd daemon listening on USB ad ...

  6. ios手机怎么连接adb命令_手机蓝牙怎么连接汽车蓝牙放音乐,车载蓝牙播放器怎么用...

    手机蓝牙怎么连接汽车蓝牙音乐?车载蓝牙播放器怎么用?针对这两个问题,我们为大家分享下操作指南,如下: 1.把手机蓝牙和车载蓝牙都打开,且处于可发现状态: 2.在手机的蓝牙界面,点击"搜索设备 ...

  7. google提供的adb工具包_开源化学信息学工具包(Open Access Cheminformatics Toolkits)

    1. CDK (Chemistry Development Kit) 官网:https://cdk.github.io/点击打开链接 CDK是结构化学信息学和生物信息学的开源Java库. 该项目由Ch ...

  8. ios手机怎么连接adb命令_没有 mac 的福音,windows 下对 ios 进行操作 (类似 android 的 adb 操作)...

    第一步 Download Quamotion iMobileDevice for Windows(地址:http://docs.quamotion.mobi/en/latest/imobiledevi ...

  9. 安卓手机端运行的adb工具_苹果、安卓手机端 移动营销、办公+华为云

    企业欠帐.业务员手机下单收款 管理软件试用18092778127王肖 华为云+速达天耀S3: 给您稳定的软件使用环境,24小时的随时使用,极速的扫码出货速度,严谨的客户权限控制: 让您的移动营销.办公 ...

最新文章

  1. 【转载】C#编码标准━━项目设置和项目结构
  2. 【待继续研究】如何运用机器学习技术构建可行的反欺诈检测方案?
  3. Most socially-distanced subsequence CodeForces - 1364B(贪心)
  4. IO口复用时钟的配置
  5. ssm整合之配置applicationContext-service.xml
  6. Python帮助文档
  7. win7 64BIT下使用VC2005的问题
  8. win10系统可以登录微信,但浏览器不能打开网页
  9. android的otg功能,android怎么打开otg功能
  10. Appium桌面版连接Android手机定位页面元素
  11. 自动驾驶技术-环境感知篇:V2X技术的介绍
  12. 软考中级 真题 2014年下半年 系统集成项目管理工程师 基础知识 上午试卷
  13. 启动3ds Max报 d3dx9_43.dll丢失 解决方法
  14. HTML控件事件一览表
  15. 计算机状态oxcoooooe9,解决win7 system文件损坏修复的办法
  16. [Linux 基础] -- Linux input 子系统要点总结
  17. Ubuntu下的kdbg安装和VSCode安装与简单使用
  18. 诺基亚5310XM基本属性
  19. 基于肌电信号(sEMG) 的深度学习手势分类-2
  20. 主module不能引用子module资源文件

热门文章

  1. AlexNet网络复现
  2. 什么是scrum中的3355
  3. 区块链竞赛中国加速超越美国 迅雷链在自主创新上贡献了“4个第一”
  4. Linux系统基础总结
  5. Linux原理与应用郑鹏,计算机科学与技术系列教材:Linux原理与应用
  6. 2021 MIT || 麻省理工机器学习导论(二)RNN LSTMs循环神经网络
  7. 程序员怎么样可以快速成为高薪架构师?
  8. Android Socket 连接设备接收H264裸流数据并解码播放 Demo
  9. LaTeX中如何引用label所标记内容的名字而不是生成标签数字
  10. 《人机交互的软件工程视角》知识点总结