当前位置: 首页 > news >正文

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博客

相关文章:

ADB底层原理

介绍 adb的全称为Android Debug Bridge,就是起到调试桥的作用。通过adb我们可以在Eclipse/Android Studio中方便通过DDMS来调试Android程序,说白了就是debug工具。adb是android sdk里的一个工具, 用这个工具可以直接操作管理android模拟器或者真实的and…...

etcd之读性能主要影响因素

1、Raft模块-线性读ReadIndex-节点之间的RTT延时、磁盘IO 线性读时Follower节点首先会向Raft 模块发送ReadIndex请求,此时Raft模块会先向各节点发送心跳确认,一半以上节点确认 Leader 身份后由leader节点将已提交日志索引 (committed index) 封装成 Rea…...

【Stable Diffusion】安装 Comfyui 之 window版

序言 由于stable diffusion web ui无法做到对流程进行控制,只是点击个生成按钮后,一切都交给AI来处理。但是用于生产生活是需要精细化对各个流程都要进行控制的。 故也就有个今天的猪脚:Comfyui 步骤 下载comfyui项目配置大模型和vae下载…...

Ansys Zemax | 如何建立二向分色分光镜

分光镜(Beam splitter)可被运用在许多不同的场合。一般而言,入射光抵达二向分色分光镜(dichroic beam splitter)时,会根据波长的差异产生穿透或反射的现象。这篇文章将说明如何在OpticStudio的非序列模式(non-sequential mode)中建立二向分色分光镜&…...

Mybatis学习笔记8 查询返回专题

1.返回实体类 2.返回List<实体类> 3.返回Map 4.返回List<Map> 5.返回Map<String,Map> 6.resultMap结果集映射 7.返回总记录条数 新建模块 依赖 目录结构 1.返回实体类 如果返回多条,用单个实体接收会出异常 2.返回List<实体类> 即使返回一条记…...

【测试开发】基础篇 · 专业术语 · 软件测试生命周期 · bug的描述 · bug的级别 · bug的生命周期 · 处理争执

【测试开发】基础篇 文章目录 【测试开发】基础篇1. 软件测试生命周期1.1 软件生命周期1.2 软件测试生命周期 2. 描述bug3. 如何定义bug的级别3.1 为什么要对bug进行级别划分3.2 bug的一些常见级别 4. bug的生命周期5. 产生争执这么怎么办&#xff08;处理人际关系&#xff09;…...

​bing许少辉乡村振兴战略下传统村落文化旅游设计images

​bing许少辉乡村振兴战略下传统村落文化旅游设计images...

第三十一章 Classes - 继承规则

第三十一章 Classes - 继承规则 继承规则 与其他基于类的语言一样&#xff0c;可以通过继承组合多个类定义。 类定义可以扩展&#xff08;或继承&#xff09;多个其他类。这些类又可以扩展其他类。 请注意&#xff0c;类不能继承 Python 中定义的类&#xff08;即 .py 文件中…...

华为云HECS安装docker并安装mysql

1、运行安装指令 yum install docker都选择y&#xff0c;直到安装成功 2、查看是否安装成功 运行版本查看指令&#xff0c;显示docker版本&#xff0c;证明安装成功 docker --version 3、启用并运行docker 3.1启用docker指令 systemctl enable docker 3.2 运行docker指令…...

MQ - 04 基础篇_存储_消息数据和元数据的存储设计

文章目录 导图概述元数据信息的存储消息数据的存储数据存储结构设计思路一 (Kafka的方案)思路二 (RocketMQ、RabbitMQ 和 Pulsar 的底层存储 BookKeeper 采用的方案)消息数据的分段实现根据偏移量定位根据索引定位 (RabbitMQ 和 RocketMQ的思路)使用场景消息数据存储格式…...

JavaScript:隐式转换、显示转换、隐式操作、显示操作

一、理解js隐式转换 JavaScript 中的隐式转换是指不需要显式地调用转换函数&#xff0c;而是在执行期间自动发生的数据类型的转换。即在使用不同类型的值进行操作时&#xff0c;JavaScript会自动进行类型转换。这种转换通常发生在不同数据类型之间进行运算或比较时。 序号分类…...

2023全新TwoNav开源网址导航系统源码 | 去授权版

2023全新TwoNav开源网址导航系统源码 已过授权 所有功能可用 测试环境&#xff1a;NginxPHP7.4MySQL5.6 一款开源的书签导航管理程序&#xff0c;界面简洁&#xff0c;安装简单&#xff0c;使用方便&#xff0c;基础功能免费。 TwoNav可帮助你将浏览器书签集中式管理&#…...

Android 12 源码分析 —— 应用层 六(StatusBar的UI创建和初始化)

Android 12 源码分析 —— 应用层 六&#xff08;StatusBar的UI创建和初始化) 在前面的文章中,我们分别介绍了Layout整体布局,以及StatusBar类的初始化.前者介绍了整体上面的布局,后者介绍了三大窗口的创建的入口处,以及需要做的准备工作.现在我们分别来细化三大窗口的UI创建和…...

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

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

虚拟线上发布会带来颠覆性新体验,3D虚拟场景直播迸发品牌新动能

虚拟线上发布会是近年来在数字化营销领域备受关注的形式&#xff0c;而随着虚拟现实技术的不断进步&#xff0c;3D虚拟场景直播更成为了品牌宣传、推广的新选择。可以说&#xff0c;虚拟线上发布会正在以其颠覆性的新体验&#xff0c;为品牌带来全新的活力。 1.突破时空限制&am…...

Linux arm64 pte相关宏

文章目录 一、pte 和 pfn1.1 pte_pfn1.2 pfn_pte 二、其他宏参考资料 一、pte 和 pfn // linux-5.4.18/arch/arm64/include/asm/pgtable.h#define pte_pfn(pte) (__pte_to_phys(pte) >> PAGE_SHIFT) #define pfn_pte(pfn,prot) \__pte(__phys_to_pte_val((phys_addr_t)…...

MVCC:多版本并发控制案例分析(一)

&#xff08;笔记总结自b站马士兵教育课程&#xff09; 一、简介 MVCC&#xff1a;全称multi-version Concurency control&#xff0c;多版本并发控制&#xff0c;是为了解决并发读写问题存在的。MVCC的实现原理由三部分组成&#xff1a;隐藏字段、undolog、readview。 二、概…...

以数据为中心的安全市场快速增长

根据Adroit Market Research的数据&#xff0c;2021年全球以数据为中心的安全市场规模估计为27.6亿美元&#xff0c;预计到2030年将增长至393.48亿美元&#xff0c;2021年至2030年的复合年增长率为30.9%。 研究人员表示&#xff0c;以数据为中心的安全强调保护数据本身&#x…...

AUTOSAR汽车电子嵌入式编程精讲300篇-经典 AUTOSAR 安全防御能力的分析及改善(下)

目录 4.4.2 Security 攻击 4.4.3 Security 要求 4.4.4 SDSA 有效性验证 经典 AUTOSAR 安全防御能力分析...

AI绘图提示词Stable Diffusion Prompt 笔记

基础 提示词分为正向提示词&#xff08;positive prompt&#xff09;和反向提示词&#xff08;negative prompt&#xff09;&#xff0c;用来告诉AI哪些需要&#xff0c;哪些不需要词缀的权重默认值都是1&#xff0c;从左到右依次减弱&#xff0c;权重会影响画面生成结果。AI …...

xml元素值需要保留space

XmlReaderSettings.IgnoreWhitespace 属性 如果忽略空白&#xff0c;则为 true&#xff1b;否则为 false。 默认值为 false。 示例 下面创建一个设置对象&#xff0c;该对象可用于构造一个读取器&#xff0c;该读取器去除处理指令、注释和微不足道的空白。 StreamReader tex…...

Eclipse开源代码下载

当前插件开发&#xff0c;需要修改eclipse源码&#xff0c;如需要修改remote相关的代码&#xff0c;所以需要下载相关源码。网上大多资料都说的不清不楚的&#xff0c;也可能我太小白&#xff0c;不明白&#xff0c;反正就是折腾了一两天才感觉有点思路&#xff0c;改如何找源码…...

python多线程、进程

1、 并行和并发 &#xff08;1&#xff09;并发&#xff1a;一定周期内&#xff0c;多个任务来回切换执行&#xff0c;宏观上形成“该周期内有多个任务在同时进行”&#xff1b;但同一时间点&#xff0c;只有一个任务在执行。 举例&#xff1a; 你想在2小时内同时完成做饭、扫…...

Vue基础之模板语法介绍

前言 上篇我分享了关于Vue的入门&#xff0c;简单的入了个门。本篇文章将要分享的内容为Vue的模板语法。 一、插值 1.1、文本 1.2、html 1.3、属性 1.4、class、style绑定 1.5、表达式 在Vue的模板语法中&#xff0c;插值是一种常用的方式来动态地将数据渲染到视图中。Vue使用双…...

【SLAM】 前端-视觉里程计之特征点

前端-视觉里程计之特征点 参考资料&#xff1a; 以不变应万变&#xff1a;前端-视觉里程计之特征点 视觉SLAM——特征点法 task05 本次了解了特征点是由关键子和描述子组成&#xff0c;并且对比了SIFT、SURF等七种获取特征点的方法&#xff0c;同时对比了SIFT、SURF和ORB方法…...

Android笔记(二十九):利用python自动生成多语言

背景 项目需要支持十几种多语言&#xff0c;而且每个版本的新功能ui都有很多地方需要多语言&#xff0c;如果手动添加非常耗时&#xff0c;于是设计了一个python脚本&#xff0c;通过excel表格转化多语言到项目values/strings文件内 步骤 android工程项目结构 脚本位于langu…...

【C++STL基础入门】list的运算符重载和关于list的算法

文章目录 前言一、list运算符1.1 逻辑运算符1.2 赋值运算符 二、list相关算法2.1 查找函数总结 前言 C标准模板库&#xff08;STL&#xff09;是一组强大而灵活的工具&#xff0c;用于处理数据结构和算法。其中&#xff0c;std::list是STL中的一个重要容器&#xff0c;它实现了…...

查找内轮廓(孔洞)

一 说明 findContours( InputOutputArray image, OutputArrayOfArrays contours,OutputArray hierarchy, int mode,int method, Point offset=Point());参数列表中有个数据结构参数:hierarchy(译层次结构),hierarchy是一个向量,其元素个数与查找到的轮廓总数相同,每一个…...

Git(6)——GitHub

目录 一、简介 二、概要 三、注册 ​四、创建仓库 五、推送本地代码 六、拉取远端代码 一、简介 在Git&#xff08;5&#xff09;中&#xff0c;我们已经对Git分支的概念和用法有了一定了解&#xff0c;对于在本地进行代码版本管理&#xff0c;其实当前所学的东西基本已经…...

【RocketMQ专题】快速实战及集群架构原理详解

目录 课程内容一、MQ简介基本介绍*作用&#xff08;解决什么问题&#xff09; 二、RocketMQ产品特点2.1 RocketMQ介绍2.2 RocketMQ特点2.3 RocketMQ的运行架构 三、RocketMQ快速实战3.1 快速搭建RocketMQ服务3.2 快速实现消息收发3.3 搭建Maven客户端项目3.4 搭建RocketMQ可视化…...

站酷设计网站官网入口下载/seo网站监测

&&,||,(),{},& 五个符号的运用shell脚本执行命令的时候&#xff0c;有时候会依赖于前一个命令是否执行成功。而&&和||就是用来判断前一个命令执行效果的。1 && 使用方法&#xff1a;cmd1 && cmd2 这个方式简单明了&#xff0c;cmd1如…...

网站源码整站下载/营销手段和营销方式

本文讲的是云计算对IT构架的变革 开放式VS封闭式,开放式云计算好&#xff0c;还是封闭式云计算平台好”的话题业内一直没有停止过争论&#xff0c;毕竟在这种新型的商业模式中开放构架与否并不决定着云计算落地和用户的体验。开放架构和封闭式的本质区别不在于软件开源与否。简…...

网站上怎么做返回主页链接/爱站网关键词长尾挖掘

航空ISR影像深度多模式车辆检测 Wesam Sakla Goran Konjevod T.Nathan Mundhenk 计算机工程部 劳伦斯利弗莫尔国家实验室 2017年3月24日至2017年3月31日 摘要 自引入深度卷积神经网络&#xff08;CNN&#xff09;以来&#xff0c;图像中的物体检测在最先进的性能方面取得了…...

网页设计大赛策划案的背景/seo搜索引擎优化推广专员

作者&#xff1a;朱金灿来源&#xff1a;http://blog.csdn.net/clever101指针是C语言中的精髓。《高质量C编程指南》的作者林锐就曾说过&#xff1a;不会正确使用指针&#xff0c;肯定算不上是合格的程序员。昨晚我思考了一宿&#xff0c;自认找到了理解指针的正确途径。本文试…...

织梦做英文网站/青岛网络优化代理

输入vim /etc/sysconfig/network-scripts/ifcfg-eth0命令&#xff0c;编辑该文件的信息&#xff1a; DEVICE"eth0" #IPV6INIT"yes" #从dhcp改成static BOOTPROTO"static" UUID"*********" #从no改成yes ONBOOT"yes" #这…...

wordpress 秀米/深圳seo公司排名

首先我们打开引擎&#xff0c;引擎窗口——文件——新建——55ide客户端——新建一个工程 一般新建在引擎根目录下面的&#xff0c;游戏作品里面。当然&#xff0c;你要放到其他位置&#xff0c;也可以&#xff0c;谁叫你这么叼 这就是进入主程序的界面。 加载&#xff1a;初始…...