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有两个意思.
- Host Service
这个service运行在ADB Server中所以不需要和Android Device进行通信,一个典型的例子就是"adb devices",就会返回一个当前一直设备和他们状态的列表. - 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源码会编译出两个主要的程序,
- adb/adb.exe:运行于PC端(包括Windows、Linux、MacOS等操作系统之上),位于platform/tools/adb目录下,透过adb命令可以唤起。
- 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(一)_概况了解相关推荐
- android 停用应用的命令,免Root使用ADB命令_停用手机系统应用
菜鸟教程,老鸟勿喷! 对于未解锁的手机,总存在那么一些我们用不到,甚至看都不想看到的应用,但是没办法卸载,在这里提供一些禁用掉这些应用的方法供参考: 1. 开发者模式打开ADB调试 2. 连接电脑,在 ...
- linux adb工具_这是一个可以显示Linux命令的工具
Progress进度查看器是一个简单的程序,可用于显示Coreutils命令的进度.它使用来自文件描述符的信息来确定命令的进度.Progress的优点在于它可以与其他Linux命令一起使用,比如wat ...
- python3调用adb命令_如何使用Python执行adb命令?
我不得不修改一些函数,让它在Python2.7上运行,并使用subprocess代替.这里是我的版本中修改过的代码:def __build_command__(self,cmd): if self._ ...
- java adb命令_从Java程序执行ADB命令
我正在使用的程序使用ADB(Android调试桥)将文件发送到手机: for (String s : files) String cmd = "adb -s 0123456789ABCDEF ...
- ios手机怎么连接adb命令_手机连接电脑,使用adb命令
手机连接电脑使用adb命令,主要是有2种方式,其中最常见的就是第一种,用usb连线使用 1:adb usb - restarts the adbd daemon listening on USB ad ...
- ios手机怎么连接adb命令_手机蓝牙怎么连接汽车蓝牙放音乐,车载蓝牙播放器怎么用...
手机蓝牙怎么连接汽车蓝牙音乐?车载蓝牙播放器怎么用?针对这两个问题,我们为大家分享下操作指南,如下: 1.把手机蓝牙和车载蓝牙都打开,且处于可发现状态: 2.在手机的蓝牙界面,点击"搜索设备 ...
- google提供的adb工具包_开源化学信息学工具包(Open Access Cheminformatics Toolkits)
1. CDK (Chemistry Development Kit) 官网:https://cdk.github.io/点击打开链接 CDK是结构化学信息学和生物信息学的开源Java库. 该项目由Ch ...
- ios手机怎么连接adb命令_没有 mac 的福音,windows 下对 ios 进行操作 (类似 android 的 adb 操作)...
第一步 Download Quamotion iMobileDevice for Windows(地址:http://docs.quamotion.mobi/en/latest/imobiledevi ...
- 安卓手机端运行的adb工具_苹果、安卓手机端 移动营销、办公+华为云
企业欠帐.业务员手机下单收款 管理软件试用18092778127王肖 华为云+速达天耀S3: 给您稳定的软件使用环境,24小时的随时使用,极速的扫码出货速度,严谨的客户权限控制: 让您的移动营销.办公 ...
最新文章
- 【转载】C#编码标准━━项目设置和项目结构
- 【待继续研究】如何运用机器学习技术构建可行的反欺诈检测方案?
- Most socially-distanced subsequence CodeForces - 1364B(贪心)
- IO口复用时钟的配置
- ssm整合之配置applicationContext-service.xml
- Python帮助文档
- win7 64BIT下使用VC2005的问题
- win10系统可以登录微信,但浏览器不能打开网页
- android的otg功能,android怎么打开otg功能
- Appium桌面版连接Android手机定位页面元素
- 自动驾驶技术-环境感知篇:V2X技术的介绍
- 软考中级 真题 2014年下半年 系统集成项目管理工程师 基础知识 上午试卷
- 启动3ds Max报 d3dx9_43.dll丢失 解决方法
- HTML控件事件一览表
- 计算机状态oxcoooooe9,解决win7 system文件损坏修复的办法
- [Linux 基础] -- Linux input 子系统要点总结
- Ubuntu下的kdbg安装和VSCode安装与简单使用
- 诺基亚5310XM基本属性
- 基于肌电信号(sEMG) 的深度学习手势分类-2
- 主module不能引用子module资源文件