USB ADB 简介

概念

  • ADB 是 Android 平台的 调试桥接协议,允许主机(PC)与 Android 设备通信。

  • 通过 ADB,开发者可以执行命令、调试应用、传输文件、访问 shell、调试 logcat 等。

  • ADB 运行在 USB 或 TCP/IP 上,但最常用的是 USB 连接。


USB 层实现

  • USB 模式:ADB 依赖 USB CDC 或自定义 USB Interface(Android Device Class)实现。

  • 端点类型:通常使用 Bulk IN / Bulk OUT 端点传输数据。

    • Bulk OUT:主机发送数据到设备

    • Bulk IN:设备发送数据到主机

  • USB 描述符:ADB 设备在 USB 枚举阶段提供自定义接口描述符,标识它支持 ADB 服务。


ADB 协议层

ADB 协议主要由 四种消息类型组成,每条消息长度固定(24 字节 header + 可选 payload):

  • CNXN(Connect)

    • 建立 ADB 连接,初始化主机和设备之间的会话。

  • AUTH(Authentication)

    • 认证主机和设备,确保安全通信。

    • 使用 RSA 公钥进行签名验证。

  • OPEN / OKAY / CLSE(Channel Management)

    • 管理逻辑通道,每个应用或服务可使用不同 channel ID。

    • OPEN:打开新 channel

    • OKAY:确认 channel 已打开或接收数据

    • CLSE:关闭 channel

  • WRTE(Write Data)

    • 用于在 channel 上传输实际数据。

    • 设备或主机将数据写入 channel 对应缓冲区,并等待 OKAY 确认。


数据传输流程

  • USB 枚举:设备连接 PC,枚举 USB 设备,识别 ADB 接口。

  • 连接建立:主机发送 CNXN 消息,设备响应 CNXN。

  • 认证:如果需要,设备发送 AUTH 消息进行公钥认证。

  • 通道管理:主机请求打开 channel(OPEN),设备返回 OKAY。

  • 数据传输:主机或设备通过 WRTE 发送数据,接收方返回 OKAY 确认。

  • 通道关闭:数据传输完成后发送 CLSE 关闭 channel。


ADB 特点

  • 多路复用:ADB 支持多个 channel 并行传输(例如 shell、文件传输、调试端口)。

  • 可靠传输:通过 ACK/OKAY 确保数据可靠送达。

  • 基于 USB Bulk 传输:确保大数据量传输稳定。

  • 安全机制:通过 RSA 公钥认证防止未授权主机访问设备。


应用场景

  • 调试应用(adb logcat, adb shell)

  • 文件传输(adb push / pull)

  • 远程安装 APK(adb install)

  • Bootloader 或 Recovery 模式调试

  • 跨平台开发和设备自动化测试

当你启动某个 adb 客户端时,该客户端会先检查是否有 adb 服务器进程正在运行,如果没有,它会先启动服务器进程,服务器在启动后会与本地 TCP 端口 5037 绑定,并监听 adb 客户端发出的命令(所有 adb 客户端均通过端口 5037 与 adb 服务器通信)

然后,服务器会与所有正在运行的设备建立连接,它通过扫描 5555 到 5585 之间(该范围供前 16 个模拟器使用)的奇数号端口查找模拟器,服务器一旦发现 adb 守护程序 (adbd),便会与相应的端口建立连接,请注意,每个模拟器都使用一对按顺序排列的端口(用于控制台连接的偶数号端口和用于 adb 连接的奇数号端口)例如

模拟器 1,控制台:5554

模拟器 1,adb:5555

模拟器 2,控制台:5556

模拟器 2,adb:5557

依此类推

  • 我们通过Android Studio工具或者命令行界面直接或间接的调用某个adb命令,比如adb install或者adb devices

  • 这时候adb进程会fork出一个子进程作为adb server,而这个fork出的进程将常驻PC端,监听来自Client端的请求

  • adb server查找当前连接的真机或者模拟器,并接收来自Client端发出的请求

  • adb server处理请求:如果是本地能直接处理的请求比如:adb devices就直接处理,如果是本地处理不了的请求就会转发给连接的真机或者模拟器来进行处理,可以通过数据线和TCP/IP的方式通信

  • 位于真机或者模拟器后台的adbd进程接收到请求后,通过JDWP协议转发给对应的Java虚拟机进程处理

  • adbd将处理后的结果返回给adb server

  • adb server再将结果返回给Client,这时候我们就在命令行界面中看到展示结果了

基本使用方法

  • 安装ADB:在电脑上安装Android SDK,其中包含了ADB工具。确保将其添加到系统环境变量中,以便在命令行中直接访问。

  • 连接设备:通过USB将Android设备连接到电脑。确保设备开启了开发者选项和USB调试模式。

  • 识别设备:在命令行中输入adb devices,如果设备正确连接,会显示设备的序列号。

  • 安装应用:使用adb install <应用路径>命令,可以安装应用到设备上。

  • 查看日志:通过adb logcat命令,可以查看设备的日志信息。

  • 无线连接:通过adb tcpip 5555命令,可以将设备从USB模式切换到无线模式,通过TCP/IP进行连接。之后可以使用adb connect <设备IP>进行连接。

  • 安装APK:除了从本地文件系统安装APK,还可以从网络下载并安装APK。使用adb shell wget <APK URL>命令即可。

  • 清除应用数据:使用adb uninstall <应用包名>命令可以卸载应用,但如果你想保留应用及其数据,可以使用adb uninstall -k <应用包名>命令。

  • 截屏和录屏:使用adb shell screencap <截图路径>可以截取设备的屏幕,而adb shell screenrecord <录屏路径>则可以录制屏幕。

  • 管理权限:使用adb shell pm grant <应用包名> <权限名称>可以为应用添加权限,使用adb shell pm revoke <应用包名> <权限名称>则可以移除权限。

  • 模拟按键事件:使用adb shell input keyevent <键值>可以模拟按键事件,如模拟按下Home键、电源键等。

  • 文件管理:使用adb pull <设备路径>可以从设备上拉取文件,使用adb push <源路径> <目标路径>则可以将文件推送到设备上

  • 调试服务:使用adb shell service list可以查看设备上可用的服务列表,使用adb shell service <服务名称> <操作>可以对服务进行操作。

  • 安装测试脚本:可以使用adb shell sh <脚本路径>来运行存储在设备上的脚本文件。

  • 查看电池状态:使用adb shell dumpsys batterystats可以查看电池的详细使用情况。 四、常见问题与解决方案

  • 设备未正确连接:检查USB连接是否稳定,重新插拔USB线或更换USB端口尝试。确保设备开启了开发者选项和USB调试模式。

  • ADB未识别设备:尝试重启ADB服务,或在命令行中输入adb kill-server后再次尝试连接设备。确保驱动程序已正确安装。

  • 应用安装失败:检查APK文件是否完整无损,尝试使用不同的APK安装工具或重新下载APK文件。

  • 日志输出异常:检查日志输出是否被其他程序干扰,或尝试重启设备和电脑后再查看日志。

  • 无线连接问题:确保设备已开启无线调试功能,并正确输入验证码进行连接。

  • 权限问题:检查应用的权限是否正确配置,或尝试使用root权限执行相关操作。

  • 其他问题:查看ADB的错误提示信息,根据提示查找解决方案或查阅相关文档和论坛获取帮助。 总结:ADB是一个强大且灵活的工具,通过掌握其基本原理和使用方法,开发者可以更高效地进行Android开发与调试。通过不断实践和探索高级技巧,可以更好地应对各种复杂的问题和需求。

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

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

相关文章

【Golang】:数据类型

目录 1. 基本数据类型 1.1 布尔类型 1.2 整数类型 1.3 浮点数类型 1.4 复数类型 1.5 字符类型 1.6 字符串类型 2. 类型转换 2.1 基本数据类型 → string 2.2 string → 基本数据类型 3. 常量 1. 基本数据类型 1.1 布尔类型 Go中的布尔类型取值为true或false&#…

旋钮键盘项目---foc讲解(开环)

这里就不过多的讲解什么原理&#xff0c;公式的变换了&#xff0c;感兴趣的可以看灯哥开源&#xff0c;讲解的非常好的。当然&#xff0c;更细致的讲解&#xff0c;也可以看b站其他教学。 我这里主要讲解我对于开环部分的理解&#xff0c;以及stm32代码的实现逻辑。可以看作是…

数据科学与计算:爬虫和数据分析案例笔记

案例 1&#xff1a;中国大学排名爬取与分析 一、任务描述 目标&#xff1a;爬取高三网中国大学排名一览表&#xff0c;提取学校名称、总分、全国排名、星级排名、办学层级等数据&#xff0c;并保存为 CSV 文件。 网址&#xff1a;2021中国的大学排名一览表_高三网 二、任务…

华测科技的3D GPR数据分析

很高兴得到了张总的支持&#xff0c;获得了他们雷达的数据&#xff0c;并写了雷达数据读取和转换文件。1 背景搜索后发现华测实力很强&#xff0c;因为他们可达到100km/h的时速&#xff0c;以前我只知道中电众益可以达到这个速度。2数据格式分析2.1 华测数据因为长时间不编程&a…

最长链(二叉树直径DFS)

题目描述现给出一棵N个结点二叉树&#xff0c;问这棵二叉树中最长链的长度为多少&#xff0c;保证了1号结点为二叉树的根。输入第1行为包含了一个正整数N&#xff0c;为这棵二叉树的结点数&#xff0c;结点标号由1至N。 接下来N行&#xff0c;这N行中的第i行包含两个正整数l[i]…

802.11 Wi-Fi 竞争机制深度分析:CSMA/CA 与 DCF

802.11 Wi-Fi 竞争机制深度分析&#xff1a;CSMA/CA 与 DCF 一、核心机制&#xff1a;CSMA/CA&#xff08;载波侦听多路访问/冲突避免&#xff09; 传统以太网使用 CSMA/CD&#xff08;冲突检测&#xff09;&#xff0c;但无线环境中无法实现冲突检测&#xff0c;因此802.11采用…

【Go语言-Day 36】构建专业命令行工具:`flag` 包入门与实战

Langchain系列文章目录 01-玩转LangChain&#xff1a;从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块&#xff1a;四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain&#xff1a;从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…

C语言——深入理解指针(四)

C语言——深入理解指针&#xff08;四&#xff09; 数组名的意义sizeof&#xff08;数组名&#xff09;&#xff0c;且数组名单独放在sizeof内部&#xff0c;则这里的数组名表示整个数组&#xff0c;计算的是整个数组的大小&数组名&#xff0c;这里的数组名表示的是整个数组…

LeetCode 刷题【42. 接雨水】

42. 接雨水 自己做 解&#xff1a;双指针左右分割容器 class Solution { public:int trap(vector<int>& height) {int res 0;int len height.size();if(len < 2) //构不成一个容器了&#xff0c;直接返回return res;int end len - 1; //右边界int…

网络的基本概念、通信原理以及网络安全问题

目录 1、 什么是网络&#xff1f; &#xff08;1&#xff09;网络的概念与本质 &#xff08;2&#xff09;电压信号的合并与抵消 &#xff08;3&#xff09;电压的本质 2、中转设备 &#xff08;1&#xff09;背景 &#xff08;2&#xff09;中转设备的处理能力与编程能…

Windows下使用WSL2创建Ubuntu子系统(更改安装位置与启动图形桌面)

Windows下使用WSL2创建Ubuntu子系统&#xff08;更改安装位置与启动图形桌面&#xff09; 本文介绍如何使用WSL2创建Ubuntu子系统&#xff0c;并更改安装位置到其他磁盘&#xff0c;并启动图形桌面Xfce4。 WSL 版本: 2.5.7.0 系统版本: Windows11 23H2 相关工具&#xff1a;Mo…

时间泄漏 TemporalLeakage

时间泄漏 TemporalLeakage: 就是后续有事件发生&#xff0c;然后才有了这个结果&#xff0c;但是在该事件发生之前&#xff0c;不应该预测该结果。 Temporal Leakage 问题是往往导致纵向Planning不“果断”。 解决方案&#xff1a;人工标注出时间发生的时刻 真值只监督时间发生…

独立书店数字化转型:绝版书修复档案系统与读者阅读行为分析营销平台

在电商冲击与阅读习惯变迁的双重压力下&#xff0c;独立书店正遭遇 “旧书修复难、新书卖不动” 的生存困境。传统模式中&#xff0c;绝版书修复依赖老师傅经验&#xff0c;单本修复周期长达 2 周&#xff0c;损耗率超 30%&#xff1b;营销缺乏数据支撑&#xff0c;导致客流年均…

const修饰指针用法详解

目录 一、const修饰变量 绕过const限制的问题 二、const修饰指针变量 1、无const修饰的指针 2、const放在*左边 3、const放在*右边 4、*两边都有const 三、使用建议 四、记忆技巧 一、const修饰变量 在C语言中&#xff0c;变量默认是可修改的。如果我们希望某个变量不能…

pcl法线估计的踩坑

1&#xff0c;normalestimation对点云法线的评估&#xff0c;只输出法线向量&#xff0c;并不输出xyz值。如果输出类型是pointnormal&#xff0c;那么这点云的法向量有值&#xff0c;xyz值都是02&#xff0c;添加点云xyz数据。可以使用 pcl::concatenatefields(*a,*b,*c)函数p…

利用Minicsv库解析csv文件的c程序及读入测试

上午的c程序写入xlsx较快但不正确&#xff0c;python程序虽正确但过慢。所以找了一个全部源程序加起来不到4K字节的C语言csv解析库Minicsv&#xff0c;来改写&#xff0c;改写结果如下&#xff1a; #include <stdio.h> #include <stdlib.h> #include <string.h…

企微用户部门同步HRS系统

企微用户导入HR系统流程说明 概述 本文档详细说明了WechatUserImportServiceImpl.importWechatUsersToHrs()方法的业务流程和实现逻辑。该方法负责将企业微信用户数据同步导入到HR管理系统中&#xff0c;包括员工信息、工作信息和任职记录的创建与更新。 主要功能 数据同步…

告别传统SEO!拥抱下一代流量密码:生成式引擎优化(GEO)实战指南

前言&#xff1a;为什么你的“最佳实践”SEO正在失效&#xff1f;你是否发现&#xff0c;即使严格遵循了谷歌自2019年以来的所有“最佳实践”&#xff0c;你的技术博客或产品文档的流量依旧增长乏力&#xff0c;甚至不升反降&#xff1f;你不是一个人。问题在于&#xff0c;游戏…

week1-[一维数组]传送

week1-[一维数组]传送 题目描述 有 nnn 个传送门&#xff0c;从第 iii 个传送门进去后会被传送到第 aia_iai​ 个传送门&#xff0c;进而被传送到第 aaia_{a_i}aai​​ 个传送门&#xff0c;如此一直下去……小 A 想知道从第 kkk 个传送门进去后&#xff0c;能不能回到第 kkk 个…

【18】目心智能——目心智能 嵌入式一面 ,校招,面试问答记录

目心智能——目心智能 嵌入式一面 &#xff0c;校招&#xff0c;面试问答记录 1 简单自我介绍2 你做了这么多算法&#xff0c;为什么不找算法的&#xff1f;3 我们主要还是软件开发&#xff0c;不做结构设计4 模电知识6 CSDN应该附链接在简历上&#xff0c;稍后发给我&#xff…