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

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

本文介绍我如何用 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 与库接口。欢迎在实际自动化、测试、抓取、代理等场景中使用,提出反馈或参与扩展。

相关文章:

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

用 Go 重写 adbkit:原理、架构与搭建实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !impor…...

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 …...

数据类型

数据类型bool string byte int,uint,int8,int16,uint16,int32,uint32,int64,uint64 float32,float64,complex,complex64,complex128 rune uintptr 无符号整型,用于存放一个指针,该类型用于指针计算 结构类型 指针类型 数组 切片 map 集合 interface{} 接口 通道类型 函数类型 时…...

iphone运行windows系统

如何让iPhone运行Windows系统? 一、引言与背景介绍 随着科技的发展,用户对于设备的需求日益多样化。作为智能手机市场的领导者之一,iPhone拥有着强大的硬件性能和优秀的软件生态。然而,有些用户可能会好奇,是否有可能在iPhone上安装并运行Windows操作系统呢?本文将详细介…...

NVR接入录像回放平台EasyCVR视频融合平台语音对讲配置指南

NVR接入录像回放平台EasyCVR视频融合平台语音对讲配置指南国标GB28181视频平台EasyCVR视频融合平台可拓展性强、视频能力灵活,平台可提供视频监控直播、云端录像、云存储、录像检索与回看、告警、平台级联、云台控制、语音对讲、智能分析接入等功能。 其中,在语音对讲方面,N…...

Ubuntu filebrowser网盘工具安装

第一步,本地部署 FileBrowser 1,本教程使用 Linux Ubuntu 系统进行演示,首先输入以下命令更新软件包列表。 sudo apt-get update 2,访问 FileBrowser 的 GitHub 页面找到最新版本,并根据你的系统架构下载相应的二进制文件。例如,对于 64 位 Linux 系统,可以使用如下 wge…...

图片结构 - voasem

图片分析简介 图像文件有多种复杂的格式,可以用于各种涉及到元数据、信息丢失和无损压缩、校验、隐写或可视化数据编码的分析解密,都是 Misc 中的一个很重要的出题方向。涉及到的知识点很多(包括基本的文件格式,常见的隐写手法及隐写用的软件),有的地方也需要去进行深入的…...

ESP32做AP,ESP8266做station,遥控

ESP8266 (Station模式) → 发送数据 → ESP32 (AP模式) → 接收并处理数据 ESP32 (AP接收端) 代码#include <WiFi.h> #include <WiFiClient.h> #include <WiFiAP.h>// 设置AP的网络名称和密码 const char *ssid = "ESP32_AP"; const char *passwor…...

实用指南:25年高联:一试填空题解析(下篇)

实用指南:25年高联:一试填空题解析(下篇)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !im…...

Spring AOP 面向切面编程 - 浪矢

目录概念应用例子:在不修改源代码的前提下,对请求链路上的目标方法进行运行耗时的统计。 概念 用于将与业务无关,但是对多个对象产生影响的公共逻辑,抽取并封装为可用模块,模块命名为“切面”(Aspect),减少重复代码,降低耦合度。 应用例子:在不修改源代码的前提下,对…...

jvm内存泄漏的排查tips总结

以下是对这篇原文的总结,部分内容不够详细,请参考原文地址:https://juejin.cn/post/7255634554987020343 内存问题排查方法论 1. 问题定位流程确定进程:使用 ps aux --sort=-%mem 找出内存占用最高的进程 分层排查:按照堆内 → 堆外的顺序逐步分析 量化分析:通过计算得出…...

鼠你爱称重

<!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>小鼠体重语音录入工具 - 数字鼠号版</t…...

详细介绍:用户争夺与智能管理:定制开发开源AI智能名片S2B2C商城小程序的战略价值与实践路径

详细介绍:用户争夺与智能管理:定制开发开源AI智能名片S2B2C商城小程序的战略价值与实践路径pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&…...

PlorarD(WEB中等)

到底给不给flag呢先看代码 get和post里面必须只有一个发送了flag 如果两个都发送了会是true然后运行exit直接结束代码 再下一个是发送的flag不能是===flag 不然也是一样 之后就是一个循环遍历,把post传的参数当作一个变量名然后参数值当作变量值 输入一个flag=a看一下所以这里…...

神经网络稀疏化设计构架方式和原理深度解析

神经网络稀疏化设计构架方式和原理深度解析pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !impo…...

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

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

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 字典常用操作之修改———————————————————————…...

111

111111111...

排序实现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…...

maven项目连接DM数据库和基本sql使用

maven项目连接DM数据库和基本sql使用直接引入Maven依赖<!-- DM数据库JDBC驱动 --> <dependency><groupId>com.dameng</groupId><artifactId>DmJdbcDriver18</artifactId><version>8.1.3.140</version> </dependency>dem…...

【中国计算机学会CCF主办】第六届人工智能、大数据与算法国际学术会议(CAIBDA 2026)

第六届人工智能、大数据与算法国际学术会议(CAIBDA 2026) 2026 6th International Conference on Artificial Intelligence, Big Data and Algorithms (CAIBDA 2026)重要信息 大会时间:2026年6月12-14日 大会地点:天津(线上同步进行) 大会官网:www.caibda.org *为报名…...

图片 - voasem

常用工具binwalkforemostwinhex010filestegsolvezstegF5StegdetectSteghideoutguessexiftoolstegseek解题思路 一.未知文件类型 当文件没有后缀名或者有后缀名却无法打开时,我们需要去识别图片类型 1.可以用file命令进行识别2.通过以下应用查看文件头类型---->然后判断出文…...

图片大全 - voasem

常用工具binwalkforemostwinhex010filestegsolvezstegF5StegdetectSteghideoutguessexiftoolstegseek解题思路 一.未知文件类型 当文件没有后缀名或者有后缀名却无法打开时,我们需要去识别图片类型 1.可以用file命令进行识别2.通过以下应用查看文件头类型---->然后判断出文…...

面试时让你设计一个“朋友圈点赞”功能测试,如何回答才出彩?

希望这篇文章能够帮助你在面试中脱颖而出,不仅拿到心仪的offer,更展现出你作为优秀测试工程师的潜质和能力。祝你面试成功!朋友圈点赞,一个看似简单的功能,背后却涉及复杂的技术逻辑和用户体验考量。当面试官抛出这个问题时,他真正想考察的不是你能想到多少测试点,而是你…...

企训宝教育培训微信小程序系统

1. 概述总结 企训宝教育培训小程序系统包含微信小程序和抖音小程序相关的源码及定制开发服务。其交付方式为微擎系统交付,微擎系统是一款基于 PHP 开发的开源应用生态系统,主要用于快速搭建微信公众号、小程序等应用,同时支持 Web 系统开发与部署,该程序源码未加密,为官方…...

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

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

叮当计步微信小程序系统

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

fetch-event-source踩坑sse(getReader)后续 IOS全量返回问题

这两天在做智能聊天,遇到了和这个博主相同的问题,我按这个改了,https://blog.csdn.net/a598829181/article/details/135913704,但是也停留在IOS会全量返回。 后来试了fetch 模拟,失败,增加各种IOS兼容,web-streams-polyfill,失败。试了event-source-polyfill可以,但是会…...

P12508 「ROI 2025 Day2」程序员的日常

在天数 \(k\) 固定时,定义 \(p_i\) 为第 \(i\) 个连续段的起点。那么一个贪心是在保证第 \(i\) 段的 \(\max=a_{p_i}\) 时尽量最小化 \(a_{p_{i+1}}\)。于是有 \(p_{i+1}=\arg\min\limits\left\{a_j\mid p_i+1\le j\le \min(r_{p_i},n-k+i+1)\right\}\)。注意最后一个位置可能…...

手机上有哪些比较好用的待办事项提醒工具 - 指南

手机上有哪些比较好用的待办事项提醒工具 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace …...

Redis源码学习 -- 数据类型编码 -- List - -蓝蜗牛

1. 什么是List? List​​是Redis的数据类型之一,给用户提供一个双向链表的功能。核心优势是头尾操作O(1)。 2. List的编码模式 List的编码模式有两种:LISTPACK和QUICKLIST。(下文用全大写表示编码名称,首字母大写表示数据结构) Quicklist本身就是节点为Listpack的链表,所…...

乌班图无法登录桌面,只能终端登录用户。且有网拉不了包(DNS问题)

尝试startx解决dns问题 $ sudo vi /etc/resolv.conf 新增nameserver 127.0.1.1 #这里用的是阿里云的DNS服务器 nameserver 223.5.5.5 nameserver 223.6.6.6一定要更新一下 $ sudo apt-get update重新安装桌面$ sudo apt-get install xorg $ sudo apt-get install ubuntu-desk…...

事半功倍是蠢蛋53 tornado接口报错

新写的接口无法访问也不404,log也没有任何输出。 二分找出初始化的时候报错...

完整教程:云手机的技术架构可分为哪些

完整教程:云手机的技术架构可分为哪些pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !importan…...

AI提示词遇见精密算法:TimeGuessr如何用数学魔法打造文化游戏新体验

在人工智能与历史文化的美妙交融中,一套精密的评分算法正在重新定义游戏公平性与挑战性当我们谈论AI生成的文化游戏时,很多人首先想到的是华丽的视觉效果和智能的内容生成。然而,真正让TimeGuessr(https://timeguessr.online/)脱颖而出的,是其背后那套**精密而公平的评分算…...

Arkime:大规模开源网络分析与数据包捕获系统

Arkime是一个开源的大规模网络数据包捕获与分析系统,支持PB级流量处理,提供完整的PCAP存储、索引和搜索功能,帮助安全团队进行网络取证和威胁检测。Arkime:大规模开源网络分析与数据包捕获系统 项目描述 Arkime(前身为Moloch)是一个大规模、开源的网络数据包捕获和分析系…...

kylin SP2安装mysql 8.0.41

环境:OS:kylin SP2mysql:8.0.41 glibc2.17查看系统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 is NO warranty; not even…...

SAP采购订单数据获取

最近要配合公司AI做一个采购订单信息获取。 1、根据条件获取采购订单基本信息。 2、得到最早交易记录和最晚交易记录。 3、得出平均含税单价。 4、得出总交易条数。 AI的模型输入因为是不确定的,可能单个问,多个问,各种问,目前定义了采购订单、供应商、物料、日期等维度,这…...

get和post如何理解

基础概念: get主要是获取资源,post主要提交资源 传输链路上区别: get 在URL上携带参数,公开透明,不安全,幂等性(同一个请求多次执行,结果和只执行一次是一样的,不会产生额外的副作用,不会改变服务器的状态) 传递参数数量比较少(一般是2048个字符,但是具体还要看浏…...

me and my girlfriend WP复盘

一台非常简单的靶机复盘 vulnhub官网注释 Description Back to the Top Description: This VM tells us that there are a couple of lovers namely Alice and Bob, where the couple was originally very romantic, but since Alice worked at a private company, "C…...