ADB底层原理

介绍

adb的全称为Android Debug Bridge,就是起到调试桥的作用。通过adb我们可以在Eclipse/Android Studio中方便通过DDMS来调试Android程序,说白了就是debug工具。adb是android sdk里的一个工具, 用这个工具可以直接操作管理android模拟器或者真实的android设备(如xiaomi手机)。它的主要功能有:
运行设备的shell(命令行)
管理模拟器或设备的端口映射
计算机和设备之间上传/下载文件
将本地apk软件安装至模拟器或android设备
ADB是一个 客户端-服务器端 程序, 其中客户端是你用来操作的电脑, 服务器端是android设备, 它是开发安卓应用的程序员, 安卓测试开发及测试行业的同学必备的一个调试工具

adb的架构

1、电脑上的命令行客户端(你每次在命令行输入adb时),称为adb client进程
当我们在命令行输入adb命令时,实际启动的是这个进程,比如我们在命令行输入一个adb devices,adb client进程创建

2、电脑上还有另一个Server进程,称为adb server,它是一个守护进程(常驻内存)
adb client进程使用时,如果没有在5037端口找到adb server进程,它就会告知启动一个adb server进程,启动后的adb server进程会一直监听在5037端口上(默认),等待着adb client进程与它通信,当adb server进程启动后,adb client进程每次都会与adb server进程建立TCP连接(Network Socket),然后将具体的命令传给adb server,adb server可能自己直接处理,或者再通过usb或者tcp发送给手机上的adbd进程,比如我们在命令行输入adb devices,此时的devices是作为“命令”传给adb server进程的,adb server收到devices后,有两种可能性,一种是自己直接就地处理,另一种是再把"命令"传给手机上的adbd进行处理

3、手机上的adbd进程(开机自启)
adbd进程是手机启动后,由init进程fork出来的,内核启动后,会创建init进程,而init在启动过程中会读取一个init.rc文件,在init.rc文件中有一个Service List(表示需要启动的进程列表),里面记录着需要init进程启动的守护进程,其中就有个adbd进程。

解决adb调试失败

端口占用

netstat 主机:查看主机当前的tcp/ip连接状态,如端口的状态。

netstat   -aon|findstr  5037 查看端口号

TCP     127.0.0.1:5037         0.0.0.0:0               LISTENING       6820

端口“5037”被PID(进程号)为6820的进程占用。

查看进程“6820”被哪个应用占用,继续执行下面命令:

tasklist|findstr 6820 

studio64.exe                  2380 Console                    1    773,192 K

taskkill /pid 6820  删除对应的进程

adb命令

安卓的自动化测试通常需要获取测试应用的包名及测试所在的具体界面, adb命令正好提供了相应的获取方法:
打开需要测试的应用程序
打开CMD命令窗口, 输入adb命令
Mac/Linux平台命令格式:
adb shell dumpsys window windows | grep mFocusedApp
Windows平台命令格式:
adb shell dumpsys window windows | findstr mFocusedApp

参考我之前的文章:安卓系统开发的一些ADB命令_systemui tuner_ChampionDragon的博客-CSDN博客

dumpsys详解_ChampionDragon的博客-CSDN博客

如:查看所有应用包名

常用命令

1、查看adb工具的版本
adb version

2、帮助信息
adb --help或adb help或adb

3、再次开启ADB服务端,这个命令用的也有,多数情况下,5037端口的adb server如果不在,adb程序会再次启动
adb start-server

4、关闭adb server,发起这个命令,adb server进程会结束,注意,adb server进程不会自己重新启动
adb kill-server

5、检查手机的连接情况,还有个adbl的别名,可用可不用
简略信息:adb devices
详细信息:adb devices -l

6、安装App
普通安装:adb install xxx.apk
重新安装,保持数据不清除(也称覆盖安装) :adb install -r xxx.apk
允许debug包安装:adb install -t xxx.apk
授权AndroidManifest.xml文件的运行时权限并安装:adb install -g xxx.apk
将多个apk推送到设备,作为一个包安装:adb install-multiple xxx1.apk xxx2.apk

6、卸载App
普通卸载:adb uninstall com.xxx.package_name
保持数据卸载:adb uninstall -k com.xxx.package_name

7、Push文件到手机里
从本机推送到Android设备上:adb push local remote
local表示本机文件的路径
remote表示Android设备的路径

8、Pull文件到主机里
从Android设备上拉取到本机:adb pull remote local
remote表示Android设备的文件或目录的路径
local表示本机文件或目录的路径
9、使用日志程序,这个logcat牛逼,所以运行中进程写入的log,都能通过logcat看到
adb logcat

adb和adbd分析

在adb中有三个模块,分别是adbd,adb server,adb client,如下表所示:

具体的沟通交流层次如下图所示:

原文链接:adb和adbd分析-CSDN博客

Android 系统内的守护进程 - core类中的服务 (1) : adbd_android 守护进程_小馬佩德罗的博客-CSDN博客

adb server与adbd进程的通信

1、adb client进程通过Socket(网络Socket)告知adb server进程需要执行的命令(adb后面的参数称为命令,比如adb devices,这个devices就是命令)

2、adb server进程发送cmd(命令)到手机(写到Usb Driver文件中,Linux中一切都是文件,usb驱动程序操作的是文件)

3、adbd(adb daemon)的output thread(1根线程)会一直从/dev/android_usb文件中读取发送过来的cmd(命令) 

      备注:由于adbd进程读取了/dev/android_usb(设备结点文件),此时相当于和Linux内核中的usb driver驱动程序进行数据交互!

4、adbd中的output thread将解析到的cmd(命令)写到1个socketpair的A端(这是Unix Domain Socket通信,简称UDS)

5、fdevent_loop(文件描述符事件循环线程,看来到处都是事件循序)会不断的通过使用Linux内核提供的select()系统调用(IO多路复用机制) ,在socketpair的B端读取到cmd(命令)

6、fdevent_loop发出的命令会在adbd的子进程中执行,子进程返回的结果往往是标准输出和标准错误,此时的结果会再写到socketpair的B端

7、Input thread(一个读线程)一直阻塞式(没有数据,只会休眠阻塞在这里,并不占用cpu时间片)读取socketpair的A端

8、Input thread从socketpair的A端读取到数据后,写入设备结点文件/dev/android_usb

9、此时usb driver驱动程序发现设备结点文件改变,会再将response发给pc端的adb server进程

10、adb server进程收到响应后,会再将响应返回给adb client进程,此时你就能在命令行看到命令的输出了(标准输出和标准错误)

adb devices的工作过程讲解

1、在命令行输入adb devices

2、adb client进程创建并开始执行,它先根据约定好的标准去本地的5037端口,检查adb Server进程是否已经启动,发现5037端口并没有进程绑定,此时的adb Client进程会去启动一个守护进程,即adb Server进程(备注:不确定adb Server是先与adbd建立关系,还是先和adb client建立连接,但我觉得它的线程一直在读取usb的情况)

3、接着adb client进程与adb server进程建立TCP连接(网络Socket)

4、adb client进程会将devices命令(字符串)传送到adb server进程中,adb server进程与adbd可以建立usbable连接或者TCP连接

5、devices命令(字符串)到达adbd进程后,adbd发起处理,根据命令的不同分为两种情况,内部处理或者交给Android内部的bash处理,处理结束后会再将消息告知adb server进程,adb server进程再把结果告诉adb client进程,结果一般是某个命令的标准输出与标准错误(向屏幕写入的内容),devices应该算时个内部处理的命令,不用交给bash处理

6、adb client进程将收到的adb server返回的结果展示到标准输出上,就在你的黑窗口上(屏幕),同时adb client进程也会结束掉,同时断掉于adbserver的TCP连接
备注:TCP连接,内核中的标准称为Network Socket,不同主机之间的进程可以建立,本机中的不同进程间也可以建立!


Linux内核中的socketpair()函数

socketpair()函数可以创建1对无名、相互连接的Socket,也被称为Unix Domain Socket,简称UDS,如果socketpair()函数执行成功,则返回值为0(0代表成功,也称退出状态码),创建好的Socket分别是sv[0]和sv[1];执行失败则会返回-1,错误码保存在标准错误中

1. 这一对Socket支持全双工通信,每一个Socket在同一时刻即可读也可写
2. 读、写操作可以是位于同一个进程的不同线程,或者位于不同的进程。如父子进程、兄弟进程(注意:UDS只能用于具有血缘关系的进程,跟PIPE一样,但socketpair全双工)

若是父子进程,一般会做功能分离,一个进程读,另一个进程写。因为文件描述符sv[0]和sv[1]为进程共享,所以读进程需关闭写描述符, 反之,写进程需关闭读描述符

UDS与Network Socket

UDS(Unix Domain Socket)的创建与Network Socket的创建类似,它是Socket中的一种,现在你知道一共有两种Socket,都是进程通信的方式,最大的区别如下

1、UDS只能在单机中通信,操作的双方可以是同一个进程的不同线程,也可以是不同的进程

2、Network Socket则能在不同的主机中通信,当然也能在同一个主机中的进程中使用

原文链接:https://blog.csdn.net/cadi2011/article/details/104720741​​​​​​​

adb client与adb server进程之间的通信

ADB 原理(第二篇:证实adb client与adb server进程之间的通信)_叫我王员外就行的博客-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/112252.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络地址转换技术NAT以及路由器LAN口与WAN口的数据交换

NAT技术 网络地址转换(NAT)技术可以帮助局域网设备通过私有IP地址访问互联网。以下是NAT技术如何实现这一功能的基本原理: 私有IP地址:在一个局域网中,通常使用私有IP地址来为设备分配网络标识。私有IP地址范围包括以…

Python网络编程:构建网络应用与通信

💂 个人网站:【工具大全】【游戏大全】【神级源码资源网】🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】💅 寻找学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 Python是一门强大的编程…

S1FD40A180H-ASEMI快恢复二极管S1FD40A180H

编辑&#xff1a;ll S1FD40A180H-ASEMI快恢复二极管S1FD40A180H 型号&#xff1a;S1FD40A180H 品牌&#xff1a;ASEMI 封装&#xff1a;TO-247 特性&#xff1a;大功率、快恢复二极管 正向电流&#xff1a;40A 反向耐压&#xff1a;1800V 恢复时间&#xff1a;<300n…

kubernetes进阶 (三) 基础练习

前两天朋友给了我几道题&#xff0c;看着挺简单的&#xff0c;但实际做的时候发现坑不少&#xff0c;这里做下笔记 一、镜像构建部署lnmp 1、构建镜像 nginx、php、mysql 要求使用centos7作为基础镜像 2、使用deployment部署上面的容器,要求3个服务要放到一个pod中(虽然这样是…

大数据学习1.1-Centos8网络配置

1.查看虚拟网卡 2.配置网络信息 打勾处取消 记住箭头的数字 3.修改 网络连接 4.进入虚拟网络 5.进入属性 6.修改IPv4 5.将iIP和DNS进行修改 6.配置网络信息-进入修改网络配置文件 # 进入root用户 su root # 进入网络配置文件 cd /etc/sysconfig/network-scripts/ # 修改网络配…

淘天集团联合爱橙科技开源大模型训练框架Megatron-LLaMA

9月12日&#xff0c;淘天集团联合爱橙科技正式对外开源大模型训练框架——Megatron-LLaMA&#xff0c;旨在让技术开发者们能够更方便地提升大语言模型训练性能&#xff0c;降低训练成本&#xff0c;并保持和LLaMA社区的兼容性。测试显示&#xff0c;在32卡训练上&#xff0c;相…

使用Scrapy构建高效的网络爬虫

&#x1f482; 个人网站:【工具大全】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 Scrapy是一个强大的Pyth…

Vue2+Vue3基础入门到实战项目全套教程的学习笔记

内容的视频链接点击此处可进入 这套笔记是按照视频和视频笔记总结的笔记&#xff0c;主要是方便vue的学习或温习&#xff0c;基本抛弃css样式的添加&#xff0c;专注于vue的使用。 第一天 Vue 快速上手 Vue的概念 Vue 是一个用于 构建用户界面 的 渐进式 框架 创建实例 …

IntelliJ IDEA使用——常用快捷键(Windows版)

文章目录 版本说明搜索操作层级关系查看光标选择代码定位代码操作Git操作编辑器操作 版本说明 当前的IntelliJ IDEA 的版本是2021.2.2&#xff08;下载IntelliJ IDEA&#xff09; ps&#xff1a;不同版本一些图标和设置位置可能会存在差异&#xff0c;但应该大部分都差不多。…

华为云ROMA Connect亮相Gartner®全球应用创新及商业解决方案峰会,助力企业应用集成和数字化转型

9月13日-9月14日 Gartner全球应用创新及商业解决方案峰会在伦敦举行 本届峰会以“重塑软件交付&#xff0c;驱动业务价值”为主题&#xff0c;全球1000多位业内专家交流最新的企业应用、软件工程、解决方案架构、集成与自动化、API等企业IT战略和新兴技术热门话题。 9月13日…

双节履带机械臂小车实现蓝牙遥控功能

1.功能描述 本文示例所实现的功能为&#xff1a;采用蓝牙远程遥控双节履带机械臂小车进行运动。 2.结构说明 双节履带机械臂小车&#xff0c;采用履带底盘&#xff0c;可适用于任何复杂地形。 前节履带抬起高度不低于10cm&#xff0c;可用于履带车进行爬楼行进。 底盘上装有一…

【Java 基础篇】Java标准输入流详解:读取用户输入的完整指南

Java是一门流行的编程语言&#xff0c;常用于开发各种类型的应用程序&#xff0c;包括控制台应用、桌面应用、Web应用等。在这些应用中&#xff0c;与用户进行交互是一项重要的任务。本文将重点介绍Java标准输入流&#xff0c;它是Java程序中用于从用户获取输入的关键组成部分。…