ADB(一)_概况了解

前言

因为工作需要,需要对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 -lpthread

LOCAL_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 := AdbWinUsbApi

LOCAL_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 windows

LOCAL_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 := libcutils

LOCAL_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
endif

LOCAL_MODULE := adbd

LOCAL_FORCE_STATIC_EXECUTABLE := true

LOCAL_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()函数代码梳理

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值