ADB源码分析(一)——ADB模块简述

2023-05-16

原文地址

 http://www.apkbus.com/blog-50331-54609.html

感谢作者的分享


1、Adb 源码路径(system/core/adb)。

2、要想很快的了解一个模块的基本情况,最直接的就是查看该模块的Android.mk文件,下面就来看看adb模块的Android.mk文件:


 ……


 ifeq ($(HOST_OS),linux) //用HOST_OS这个宏来兼容不同的操作系统的adb可执行程序(windows、Linux……)

USB_SRCS := usb_linux.c

EXTRA_SRCS := get_my_path_linux.c

LOCAL_LDLIBS += -lrt -lncurses -lpthread


 endif

 ……

 LOCAL_MODULE := adb  //编译生成adb可执行程序。运行于PC端,通过HOST_OS这个宏来兼容不同的操作系统

 ……

 include $(BUILD_HOST_EXECUTABLE)

 ……

 ……

 LOCAL_MODULE := adbd //运行在手机端或模拟器等终端设备的adbd daemon进程

 LOCAL_FORCE_STATIC_EXECUTABLE := true

 LOCAL_MODULE_PATH := $(TARGET_ROOT_OUT_SBIN)

 LOCAL_UNSTRIPPED_PATH := $(TARGET_ROOT_OUT_SBIN_UNSTRIPPED)

 LOCAL_STATIC_LIBRARIES := libcutils libc

 include $(BUILD_EXECUTABLE)

 ……

 ifneq ($(SDK_ONLY),true)

 LOCAL_MODULE := adb //编译sdk时生成一个adb可执行程序sdk/platform-tools/adb

 LOCAL_STATIC_LIBRARIES := libzipfile libunz libcutils

 include $(BUILD_EXECUTABLE)。

 通过查看system/core/adb模块的Android.mk文件,我们队adb有了一个初步的印象: “adb的工作是由两个可执行文件完成的”。

 a)、adb/adb.exe:运行于PC端(包括Linux、Windows、MacOS等操作系统之中),通常是x86架构之上。也就是我们常用的 Android开发工具

SDK中(platform/tools/adb),我们在命令提示行执行adb命令时,就是通过这个adb程序执行的。

 b)、adbd:运行于Android设备的底层Linux之中,ARMv5架构上。构建不同文件,通过传入Android.mk的$(BUILD_SIMULATOR)变量是否为真。

源码中由ADB_HOST宏用来区分本地主机(adb)和目标机(adbd)。区分不同OS,通过传入Android.mk的$(HOST_OS)。它的有效取值包括linux、  

darwin、freebsd和windows。不同平台的主要差异是USB的控制方法和文件路径。


3、直接编译该模块,可以看到会生成如下一些内容:

ADB源码分析(一)——ADB模块简述_android adb

ADB源码分析(一)——ADB模块简述_android adb_02


  编译生成的也就是我们上面讲到的adb模块的两个可执行文件(adb和adbd daemon)。我们进入adb shell下,在sbin/目录下存在一个adbd可执行程序,这就是就是ADB模块编译生成的这个adbd可执行程序。而我们在安装Android开发环境的时候有指定过sdk的环境变量,因此我们在命令行下面输入的adb命令,就是通过sdk中的adb这个可执行程序进行响应的。 我们通过ps命令可以看到adb和adbd也分别运行于PC端和Adb设备中,也就是说我们执行的所有的adb命令都是通过adb进程与adbd 守护进程之间进行数据交换的结果。

ADB源码分析(一)——ADB模块简述_android adb_03

ADB源码分析(一)——ADB模块简述_android adb_04



4、 通过上面的介绍,相信我们对ADB模块已经有了一个初步的印象了,要想更进一步了解adb模块,就需要深入的去分析一些整个adb模块的实现的方式了。在分析整个模块代码之前,我们先看一下Google对整个ADB模块的介绍(在system/core/adb目录下有一个OVERVIEW.txt文件),这个文件介绍了这个adb模块的工作过程。英文好的同学可以详细的阅读一下OVERVIEW.txt这个文件,这个文件对整个ADB模块的工作原理讲的比较透彻。  

简单的看看这个文件的描述,整个ADB模块由如下几个模块组成:

a)、The ADB server(adb): 运行在PC端的一个后台应用程序,用来检测Android Devices的连接或去除。ADB Server是一个时刻协调交换Client、Services和Android devices之间的数据。

b)、The ADB daemon (adbd) : 运行于一个Android Devices/Emulator的后台守护进程,该进程主要是用来连接ADB Server通过USB(模拟器通过TCP协议)为adb clients提供一些运行于PC端的services。

c)、The ADB command-line client: 执行adb 命令的终端,它会找出PC端的运行的adb server如果没有找到就会自动的启动adb server,然后向adb server发送请求命令。

d)、Services: 由此服务给adbd提供功能,即由这个模块完成,主要分为Host Services及 Local Services两类

 Host Services: 运行于ADB Server,不需要和devices进行数据交换。典型的就是执行adb devices命令时,只需要adb server端返回当前的adb devices的状态即可。

Local Services: 运行于adbd守护进程,ADB Server 在adb clients和Local Services之间复用Streams。Local Services 用来初始化传递数据的连接。

ADB 通讯模型图(欲了解更详细的情况可以查看system/core/adb/transports.txt文件中的介绍)

ADB源码分析(一)——ADB模块简述_android adb_05


                                    (adb 通讯模型图)

ADB源码分析(一)——ADB模块简述_android adb_06


5、要想进一步了解adb命令的工作方式,就需要我们进一步研究adb模块的源码。Adb运行的入口在system/core/adb/adb.c中,下面来初步看看adb.c的main()方法:

int main(int argc, char **argv)

{

#if ADB_HOST //前面讲到在Android.mk中定义了这个宏,如果编译adb ADB_HOST = 1否则ADB_HOST = 0

   adb_sysdeps_init();

   adb_trace_init();

   D("Handling commandline()\n");

   return adb_commandline(argc - 1, argv + 1); //运行PC端的adb/adb.exe可执行程序

#else

   /* If adbd runs inside the emulator this will enable adb tracing via

    * adb-debug qemud service in the emulator. */

   adb_qemu_trace_init();

   if((argc > 1) && (!strcmp(argv[1],"recovery"))) {

       adb_device_banner = "recovery";

       recovery_mode = 1;

   }

   start_device_log();

   D("Handling main()\n");

return adb_main(0, DEFAULT_ADB_PORT); //运行Android devices/emulator 的adbd可执行程序

#endif

}。

小结:本篇文档主要讲解了以下内容:

1、adb模块的源码路径,源码编译生成的结果。

2、adb模块分为adb client、adb server、services、adbd daemon几个模块。

3、adb通讯模型。

4、adb与 adbd daemon的入口函数


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ADB源码分析(一)——ADB模块简述 的相关文章

随机推荐

  • 机器学习毕业设计 大数据股票数据量化分析与预测系统 - python

    文章目录 0 前言1 课题背景2 实现效果UI界面设计web预测界面RSRS选股界面 3 软件架构4 工具介绍Flask框架MySQL数据库LSTM 0 前言 x1f525 这两年开始毕业设计和毕业答辩的要求和难度不断提升 xff0c 传统
  • HTML Parsing Error: Unable to modify the parent co

    HTML Parsing Error Unable to modify the parent container element before the child element is closed KB927917 主要是因为页面没有加载
  • 解决PowerShell无法使用conda的问题

    目录 1 问题描述2 解决办法2 1 将Anaconda添加至系统环境变量2 2 初始化PowerShell2 3 设置ExecutionPolicy的值 3 避免PowerShell默认激活base环境 1 问题描述 由于新版本的Anac
  • [RK3288][Android6.0] 调试笔记 --- 录音apk无权限录音问题

    Platform Rockchip OS Android 6 0 Kernel 3 10 92 现象 xff1a 写了个apk测试录音 xff0c 提示 xff1a 01 22 00 59 40 795 215 948 W ServiceM
  • 【Linux】Ubuntu 使用指南

    content 1 换清华源2 更新三步走3 1 换清华源 备份 Ubuntu 的软件源配置文件 etc apt sources list span class token function sudo span span class tok
  • ubuntu下解决不能识别外部设备的方法

    首先确认手机连接上电脑 xff0c lsusb查看下设备记录 matthew 64 matthew 1230 laptop lsusb Bus 007 Device 009 ID 18d1 4e12 Bus 007 Device 001 I
  • android json解析及简单例子

    JSON的定义 xff1a 一种轻量级的数据交换格式 xff0c 具有良好的可读和便于快速编写的特性 业内主流技术为其提供了完整的解决方案 xff08 有点类似于正则表达式 xff0c 获得了当今大部分语言的支持 xff09 xff0c 从
  • Ubuntu 16.04 如何安装 Python 3.6

    在Ubuntu 16 04版本中 xff0c 系统默认安装 了python 2 7和3 5版本 xff0c 此次安装的是新版本Python 3 6 13 由于系统已经默认安装了Python xff0c 所以相关的依赖文件已经安装妥善 xff
  • ubnutu桌面环境Gnome 配置tweak tool时看不到extension插件选项

    问题 xff1a tweak tool中没用extension选项 xff0c 这是因为没有开启gnome xff0c 解决方法是注销当前用户 然后在登录窗口的右上角 xff0c 选择gnome xff0c 如下图所示 然后在弹出的窗口中选
  • C# 内存与性能优化

    C 内存与性能优化 https www jianshu com p d56f79d83ebd 前两周分享了资源配置与资源管理 xff0c 今天分享一种特殊的资源脚本数据 在Unity项目中 xff0c 我们通常使用C 编写脚本 xff0c
  • 转发——从搭建小系统到架构分布式

    从搭建小系统到架构分布式 从搭建小系统到架构分布式 SpringBoot是目前Spring技术体系中炙手可热的框架之一 既可用于构建业务复杂的企业应用系统 xff0c 也可以开发高性能和高吞吐量的互联网应用 Spring Boot 框架降低
  • 2018-8-30华为机试第三题

    一个很明显的递归问题 package cn csu ksh import java util ArrayList import java util List import java util Scanner public class Mai
  • Android学习之Sensor

    转自http javatest blog 163 com blog static 20865106420126216118757 只需要五步 xff0c 你就能搞定Sensor 让你的程序变的更酷 java view plain copy
  • 虚拟现实技术vr可以用来干什么?虚拟现实技术vr有什么特征

    科技行业的不断蓬勃发展 xff0c 每天会出现一些新的科技产品 xff0c 例如现在很火的虚拟现实技术vr xff0c 虚拟现实技术用的领域很多 xff0c 就拿游戏行业来说 xff0c 玩家可以通过vr眼镜 vr手柄等体验vr游戏 xff
  • Ubuntu18.04安装Qt5.14.2

    1 去官网 xff08 https download qt io archive qt xff09 下载对应的 run版本 这里是5 14 2 2 进入下载后的路径 xff0c 先赋予权限 xff0c 再安装 span class toke
  • Python归并排序

    归并排序 数据科学家每天都在处理算法 然而 xff0c 数据科学学科作为一个整体已经发展成为一个不涉及复杂算法实现的角色 尽管如此 xff0c 从业者仍然可以从建立对算法的理解和知识库中受益 在本文中 xff0c 对排序算法归并排序进行了介
  • Android ADB 源码分析总结

    Android之ADB总结 本文内容如下 xff1a 1 makefile分析及总结 2 adb框架介绍 3 adbd源码分析 3 1 adbd初始化流程分析 3 2 adb shell流程分析 3 3 adb root流程分析 4 adb
  • android4.0新控件Switch方法解析

    就是很像开关的那种控件 xff0c 它只有两个状态 xff1a on和off xff1a 在IOS中 xff0c 有个UISwitch控件 xff0c 其效果图 xff0c 如下 xff1a 在android4 0里面 xff0c 添加了一
  • Android Adb 源码分析(一)

    扭起屁股得意洋洋 最近 xff0c 我负责的项目因为临近量产 xff0c 把之前的userdebug版本关闭 xff0c 转成了user版本 xff0c 增加selinux的权限 xff0c 大家都洋溢在项目准备量产的兴奋和喜悦之中不能自拔
  • ADB源码分析(一)——ADB模块简述

    原文地址 http www apkbus com blog 50331 54609 html 感谢作者的分享 1 Adb 源码路径 system core adb 2 要想很快的了解一个模块的基本情况 xff0c 最直接的就是查看该模块的A