实现经历

虽然在无 root 的情况下支持 adb 不是一个特别大众的需求,但是我仍在为此做努力,这个已经是前两周实现了,但是没时间写相关文章。

解释一下 adb 编译成 arm64 二进制后,为什么不能无 root 通过 OTG 去连接另一台设备,因为 adb 在最初设计就没有考虑会运行在安卓设备上,在安卓上,进程不能直接读写 /dev/bus/usb 节点,而在 PC 上是扫描这个节点(linux),这和安卓其它一堆动态权限类似,安卓为了做权限控制,修改了了 Linux 内核,加了 Linux 原本不会有的限制,例如 Linux 上普通进程本就是可以读写 usb 的,但在安卓上,我们只能通过编写 java 代码动态申请安卓权限,然后用 android 的 java api 去读写。
所以c语言层不能读写 usb,而 java 可以,而这二者如何结合,就是问题所在,也是实现的难点所在。

所以在之前的 ADB KIT中,我也是这样做的,并用 java 代码实现了部分 adb 协议,包括握手,鉴权,文件上传,软件安装,终端交互。这部分是开源的,文章在掘金 -> https://juejin.cn/post/7034799230086545445,所以我对 adb 本身的理解,本就已经超出绝大部分人了,你们给我提的思路和建议,都是我四五年前能想到的东西了,我们做东西要的是实现,而不是谁都能想到的想法。

但是这种效率极低,上传文件龟速,不也不太清楚是为什么,可能是我实现得不好,也可能是 java 效率本就不如 c。
并且协议很难实现完整,例如投屏所需要的关键协议,adb forward 等

最终方案,将 termux-adb 进行了改造,结合 termux-api,在命令行中实现动态申请 usb 权限,然后获得文件的描述符,然后 hook adb 在代码中的 open opendir 等方法,让它以为读取到的就是串口设备,这样的效率是极高的。

经过了很久的尝试,花了我的一整个周末,熬了几个大夜,说实话,我不太想把这作为一个免费的功能,但是最终,它是免费的,在当前版本是,我不会限制你使用的版本,如果后续它成为一个付费的功能,你也可以使用历史版本。

总是会有人来说,“都是用的开源的东西你凭什么收费,都是能查到的资料写的你凭什么收费,尽管不是能查到的资料,那你也是凭现有的资料总结出来的,你凭什么收费”,有个人之前在酷安的评论区一直喷我这点(最近又来一个),我屏蔽后去我的B站喷,这世上最可怕的生物,是人。

我就收费了,我写个 hello world 我也收费999元怎么了?你敢说我错了?没逼着你买,我的软件都是我付出过极多精力的东西,很多都一直免费到现在,我上班工资一个月几w,下班还要来伺候这群人(指的态度不好的),真是不讨好。当然友好的用户,我还是很愿意为他们提供好的软件的。

如果我喜欢某一个软件,我希望它是收费的,如果它一直免费,我反而会担心,用爱发电总有终止的那一天,除非开发者财富自由,不然开发者总是会陷入一个困境“写这个又没钱,要不我不写好好上班算了”。

的确,目前我所开发的软件,都给我带来很多的精神内耗,加上最近了解了一下我升职后的工资,大概升两职后,工资大概能到4w一个月,我为什么不把自己写软件的精力也投入到工作上呢?然后一天一天。

哦最后关于我的软件为什么还不收费,是因为一个软件要收费,需要做的事情也是很多的,后端接口,鉴权方式等,最近公司的压力太大,我能拿来自己开发的时间极少。

我不太清楚甲壳虫和bug的方式,但我敢说,目前 ADB KIT OTG 的效率是大于它俩的。

如何使用

1.保证需要调试的设备开启了 USB 调试
2.使用 OTG 数据线连接两个设备
这个地方有个小坑, type c to c 的线总是没办法区分谁连谁,全靠运气,所以有条件的可以用 USB to Type c 再加一个 OTG转接头解决

ADB KIT 将绝大部分的工作都自己完成了,使用 OTG 调试设备几乎和 PC 连接 Android 一样

数据线插上,然后打开 ADB KIT
如图,注意点确定哈,点完后,被调试的设备会出现 ADB 的弹窗,也注意点确定哈(如果是MIUI没点到这个弹窗,后面都不会弹了,重启和开关 USB 调试可以解决)

无 Root 使用 ADB 带来的好处

只要自己有两个设备即可激活 Shizuku、Scene、冰箱等软件,就算需要激活的设备没有自带的无线调试
可以更方便的为其他的设备安装/卸载软件,上传文件,例如车机,手表

无界也马上支持无 Root OTG 控制另一台安卓(车机,手表),最近工作压力稍微有点大,精力缺乏。

作者

梦魇兽

发布于

2023-06-08

更新于

2023-06-08

许可协议

评论