用 Go 重写 adbkit:原理、架构与搭建实践

news/2025/9/17 15:48:39/文章来源:https://www.cnblogs.com/lxjshuju/p/19096926

本文介绍我如何用 Go 实现一套与 CoffeeScript 版 adbkit 等价且更易维护的 ADB 工具集,覆盖常用 Host/Device 服务、端口映射、抓屏、日志等能力,并提供命令行工具与可复用的传输层库。

  • 源项目(CoffeeScript):https://github.com/openstf/adbkit
  • 新实现(Go):https://github.com/airhandsome/go-adb-kit

背景与目标

  • 原项目使用 CoffeeScript,依赖老旧,现代 Node 环境下安装与调试成本高。
  • 目标:用 Go 实现一套同等功能、接口清晰、便于扩展和部署的 ADB 工具与库,提供跨平台 CLI。

总体架构

  • 传输层库:protocol/* + transport/*
  • 负责 ADB server 请求/响应编解码、连接管理、Host/Device 服务调用。
  • 领域服务:services/*
  • 将底层传输封装为更高层面 API(如 logcat 结构化输出、package 安装卸载)。
  • 命令行工具:cmd/adbkit/main.go
  • 使用 cobra 提供 adbkit 命令集,覆盖日常 ADB 操作。
  • TCP-USB 桥接:transport/tcpusb/*
  • 纯 Go 实现 ADB 端到端包处理,可把 USB 设备映射为本地 TCP 设备。

目录一览:

  • protocol/:请求编码、OKAY/FAIL 状态读取、十六进制长度、常量
  • transport/:Host/Device 服务封装(shell、sync、reverse、framebuffer、logcat 等)
  • services/:面向场景的函数封装(logcat 解析、pubkey 处理等)
  • cmd/adbkit/:CLI

协议原理速览

  • 核心包:CNXN、AUTH、OPEN、WRTE、OKAY、CLSE、SYNC
  • Host 服务:host:version、host:devices、host-serial:<serial>:、host:transport:<serial>
  • Device 服务:shell:...、sync:、framebuffer:、reverse:、forward:、log:...
  • 抓屏路径:
  • framebuffer:返回 52 字节头 + 原始像素流
  • screencap:shell:screencap -p 返回 PNG 流

核心实现模块

  • protocol/wire.go
  • EncodeRequest 负责发送 #### 长度 + payload
  • ReadStatus、ReadHexLength 使用 io.ReadFull 保证边界一致
  • transport/conn.go
  • 统一管理与 ADB server 的连接
  • Transport(serial) 处理设备选择,必要时 wait-for-device 重试
  • transport/shell.go
  • Shell(ctx, serial, args) 打开设备端 shell,并返回 io.ReadCloser 便于流式复制
  • transport/sync.go 与 services/sync/*
  • 实现 push/pull/stat 等 SYNC 子协议
  • transport/forward.go、transport/reverse.go
  • 端口映射:forward:... 与 reverse:...,支持 add/list/remove/all
  • transport/framebuffer.go 与 transport/screencap.go
  • framebuffer 解析 52 字节头,PNG 编码;不可用时自动回退到 screencap -p
  • transport/tcpusb/*
  • ADB 包结构、校验与 magic、包读写器、代理服务与 socket 状态机
  • 流控:A_WRTE 后等待对端 A_OKAY 再继续发送

TCP-USB 桥接(usb-device-to-tcp)

  • 目的:在本地监听端口,把 USB 设备映射为 TCP ADB 设备(adb connect 127.0.0.1:PORT)
  • 关键点:
  • A_AUTH 流程与 adb.exe 对齐:对 SIGNATURE 再发 TOKEN,促使对端发送 RSAPUBLICKEY
  • 正确的 magic(cmd) 计算:(cmd ^ 0xffffffff) & 0xffffffff
  • A_OPEN/WRTE/OKAY/CLSE 的双向转发与 needAck 流控,避免丢包与阻塞

CLI 设计

  • 使用 cobra 提供友好的子命令与参数:
  • devices、version、shell、push、pull
  • install、uninstall
  • forward add/list/remove/remove-all
  • reverse add/list/remove/remove-all
  • screencap、framebuffer(自动回退)
  • logcat(支持结构化 JSON 输出)
  • usb-device-to-tcp(桥接服务)
  • ADBKIT_DEBUG=1 时输出调试信息,便于排障。

性能与稳定性

  • Go 的 io.Copy + io.Pipe 简化了流式管道,开销低
  • 尽量避免复用破损连接:服务失败时新建连接重试
  • 对长链路(logcat、tcpusb)使用 goroutine + channel 管理生命周期

快速开始

  • 编译:
    go build -o adbkit.exe ./cmd/adbkit

  • 示例:

  • # 列设备
    ./adbkit devices
    # 执行命令
    ./adbkit shell -s  getprop
    # 抓屏(自动回退)
    ./adbkit framebuffer -s  -o fb.png
    # 端口反向映射
    ./adbkit reverse add -s  --local tcp:9001 --remote tcp:9000
    # TCP-USB 桥接
    ./adbkit usb-device-to-tcp -s  -p 6174
    adb connect 127.0.0.1:6174

    结语

    本项目以“协议清晰、实现简单、工程可维护”为目标,完整覆盖了 adbkit 的常用能力,并在 Go 生态下提供稳定的 CLI 与库接口。欢迎在实际自动化、测试、抓取、代理等场景中使用,提出反馈或参与扩展。

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

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

相关文章

C语言环境搭建之Linux子系统使用vscode连接子系统

安装准备工作查看当前系统版本确保高于16215.0开启WSL Windows Subsystem for Linux(简称WSL)是一个为在Windows 10上能够原生运行Linux二进制可执行文件(ELF格式)的兼容层。安装步骤微软商城Microsoft Store安装Ubuntu(本人安装的版本是22.04)点击等待安装完成输入用户名跟…

移远AT指令笔记

# 测试 AT - 测试AT指令功能是否正常# 模块相关 ATI - 查询模块信息 AT+CGMI - 查询模块制造商标识 AT+CGMM - 查询模块型号 AT+CGMR - 查询模块固件版本号# 网络相关 AT+QCCID - 查询集成电路卡识别码(ICCID) AT+GSN …

Chromium历史版本下载方式

首先,访问 https://chromiumdash.appspot.com/branches此链接,点击将要下载的chromium版本。我们点击想要下载的版本的Chromium列,这里我们以137为例。点击此处。会打开https://chromium.googlesource.com/chromium/src.git/+log/refs/branch-heads/7151网页。点击上图红框处…

【ACM出版】第三届物联网与云计算技术国际学术会议 (IoTCCT 2025)

第三届物联网与云计算技术国际学术会议(IoTCCT 2025)将于‌2025年9月26-28日‌在中国海口市盛大召开!【ACM独立出版 | 往届会后四个月EI检索! 】 【IEEE Fellow助力,行业内精彩报告!】 第三届物联网与云计算技术国际学术会议 (IoTCCT 2025) 2025 3rd International Confe…

2025年最全 Wiki 管理工具测评:ONES、Confluence、Notion......哪个更适合你?

随着技术和团队规模的不断发展,如何有效管理知识、文档和任务,成为了研发团队面临的重要挑战。Gartner 发布的《Top Strategic Predictions for 2024 and Beyond》报告指出,成功的研发领导者应该采用新的方法,构建数字化的研发生态系统,利用技术工具创造一个高绩效的研发环…

天下拍拍卖系统:二方系统也能扩展三方平台功能

过去很多年,大多数拍卖公司为了快速开展线上拍卖会,普遍选择入驻阿里拍卖、京东拍卖、公拍网等三方平台——功能齐全、流量大、上线快。但随着业务深入,企业逐渐发现三方平台存在一些限制,想要私有化搭建一套属于拍卖公司自己的拍卖系统,但同时可能也想保留一些三方平台的…

express使用redis

我用的pnpm pnpm add express redisconst express = require(express); const redis = require(redis); var app = express() var port = 3000 // 创建 Redis 客户端实例 const redisClient = redis.createClient({url: redis://172.17.0.185:6379 ,password: b7371d927aec647d…

day07 课程

day07 课程课程:https://www.bilibili.com/video/BV1o4411M71o?spm_id_from=333.788.videopod.episodes&p=148 7.1 字典的应用场景7.2 创建字典的语法7.3 字典常用操作之新增7.4 字典常用操作之删除7.5 字典常用操作之修改———————————————————————…

排序实现java - 教程

排序实现java - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; font-size: 14p…

.net core 发布到 iis 步骤

1. 打开服务器管理器,管理,添加角色和功能,把 IIS 相关的全勾上。 2. 安装.net core 环境,需要 ASP.NET Core 运行时的 Hosting Bundle 版本,其他版本没用。 3. 安装 webdeploy, 服务器防火墙打开8172端口。 4. 在 IIS 上创建站点, 配置的文件夹权限需要添加 everyone 的…

kylin SP2安装mysql8.4.5

环境:OS:kylin SP2mysql:8.4.5 glibc2.17,建议安装glibc.2.28版本 查看系统glibc版本[root@localhost soft]# ldd --version ldd (GNU libc) 2.28 Copyright (C) 2018 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There i…

微信社群机器人接口

微信个人号开发API/文档/教程 大家一般需求点无非是以下几个需求: 1.开发个人微信营销系统 2.开发自定义的微信机器人, 3.开发微信智能聊天客服系统 4.定制行业内的群数据分析功能需求很简单,业务代码贼好撸,但是如何和微信交互呢,如何取到微信数据调用相关聊天接口呢,具体…

C++的枚举类

语法:enum class 枚举类名 [: 底层类型] {枚举值1,枚举值2,... };一般形式(当然我们一般默认成员都显转int,因此底层类型一般不写) C++的枚举类: 在C++中,enum class是一种类型安全的枚举类型,它比传统的enum类型提供了更好的作用域控制和类型安全性。使用enum class可以…

Revit二次开发 钢筋生成API(一)

1、自由钢筋生成API创建不受约束的自由形式钢筋。以后不能将约束添加到此钢筋。public static Rebar CreateFreeForm(Document doc,RebarBarType barType,Element host,IList<CurveLoop> curves,out RebarFreeFormValidationResult error )通过此方法,可以创建一个或者多…

方法

什么是方法 方法是程序中最小的执行单位 实际开发中:重复的代码,具有独立功能的代码可以抽取到方法当中 实际开发中方法的好处:可以提高代码的复用性 提高代码的可维护性 最简单的方法定义和调用 方法的格式:把一些代码打包在一起,用到时候就调用 方法定义:把一些代码打包在…

详细介绍:PHP基础-语法初步(第七天)

详细介绍:PHP基础-语法初步(第七天)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !importan…

如何通过Python SDK 删除 Collection

本文介绍如何通过Python SDK删除一个已创建的Collection。 重要 删除Collection后,该Collection所有数据将删除且不可恢复,请谨慎操作。 前提条件已创建Cluster:创建Cluster已获得API-KEY:API-KEY管理已安装最新版SDK:安装DashVector SDK接口定义 Python示例: Client.del…

Inventor Professional 2026.1.1 产品设计与工程制图

描述 Autodesk Inventor提供了专业级机械设计、文档编制和产品仿真工具。参数化建模、直接建模、自由形状建模和基于规则的设计功能的强大组合。用于钣金、结构件设计、三维布管、电缆和线束、演示、渲染、仿真、机床设计等的集成工具。值得信赖的 DWG™ 兼容性,强大的基于模型…

叮当计步微信小程序系统

1. 概述总结 叮当计步小程序系统是基于微擎系统交付的应用,微擎系统是一款基于 PHP 开发的开源应用生态系统,主要用于快速搭建微信公众号、小程序等应用,同时支持 Web 系统开发与部署。该计步系统历经数月研发,投入 20 多万研发费用,注重数据可靠性、系统扩展性和高并发支…