使用 Kotlin Compose Desktop 實現了一個簡易的"手機助手"

一. adbd-connector

adbd-connector 是一個實現 adb server 和 adb daemon 之間的通信協議的庫,使用 Kotlin 編寫。支持 PC 端直接連接 Android 設備操作 adb 相關的指令。

github 地址:https://github.com/fengzhizi715/adbd-connector

二. 背景

在下圖中的 adb client 和 adb server 都共存在 PC 中,PC 上安裝過 adb 程序就會有。adb dameon (簡稱adbd)是存在於 Android 手機中的一個進程/服務。

當我們啓動命令行輸入 adb 命令時,實際上使用的是 adb client,它會跟 PC 本地的 adb server 進行通信(當然,有一個前提先要使用 adb-start 啓動 adb server 才能調用 adb 命令)。

然後 adb server 會跟 Android 手機進行通信(手機通過 usb 口連上電腦)。最終,我們會看到 adb client 返回命令執行的結果。

一次命令的執行包含了 1-6 個步驟。其實,還要算上 adb server 內部的通信和 adb dameon 內部的通信。一次命令的執行,路徑會很長。

所以,一次完整的 adb 通信會涉及如下的概念:

  • adb client:運行在 PC 上,通過在命令行執行 adb,就啓動了 adb client 程序
  • adb server:運行於 PC 的後臺進程,用於管理 adb client 和 daemon 之間的通信
  • adb daemon(adbd):運行在模擬器或 Android 設備上的後臺服務。當 Android 系統啓動時,由 init 程序啓動 adbd。如果 adbd 掛了,則 adbd 會由 init 重新啓動。
  • DDMS:DDMS 將 IDE 和手機設備之間建立起了一座橋樑,可以很方面的查看到目標機器上的信息。
  • JDWP:即 java debug wire protocol,Java 調試線協議,是一個爲 Java 調試而設計的通訊交互協議,它定義了調試器和被調試程序之間傳遞的信息的格式。

在 adb server 和 adbd 之間有一個 TCP 的傳輸協議,它定義在 Android 源碼的 system/core/adb/protocol.txt 文件中。只要是能通過 adb 命令連接的手機,都會遵循這個協議,無論是 Android 或是鴻蒙系統。

因此,基於這個協議實現了一個 TCP 的客戶端(adbd-connector)就可以跟手機的 adbd 服務/進程進行通信,從而實現 adb 的所有指令。

另外,我還使用 Kotlin Compose Desktop 在這個協議上做了一層 UI,實現了一個可以在 PC 上使用的簡易"手機助手",且支持 Mac、Linux、Windows 等系統。

在手機連接前,先要打開手機的開發者模式。在連接過程中,手機會彈出信任框,提示是否允許 usb 調試。需要點擊信任,才能完成後續的連接。
還要打開手機的 5555 端口(使用 adb 命令:adb tcpip 5555),以及獲取手機連接當前 wifi 的局域網 ip 地址。有了局域網的 ip 地址和端口,纔可以通過 adbd-connector 跟 adbd 進行連接。

三. adbd-connector 使用

3.1 手機的連接效果:

連上手機,獲取手機的基礎信息

3.2 執行 adb shell 命令的效果:

執行 adb shell 相關的命令(輸入時省略 adb shell,直接輸入後面的命令)

3.3 install app

目前還處在疫情期間,所以就在應用寶上找了一個跟生活相關的 App,最主要是這個 App 體積小

安裝 App 時分成2步:

1.使用 push 命令將 apk 推送到手機的目錄 /data/local/tmp/ 下

  1. 使用 adb shell pm install 命令安裝 apk

3.4 uninstall app

adb shell pm uninstall 包名

四. 總結

這款工具 https://github.com/fengzhizi715/adbd-connector 是一個 PoC(Proof of Concept)的產物,參考了很多開源項目,特別是 https://github.com/sunshinex/adbs

它能夠實現絕大多數的 adb 命令。後續這個項目的部分代碼可能會用於公司的項目。所以,這個倉庫不一定會持續更新了。而且,這款工具使用起來也很繁瑣,需要打開手機的 5555 端口以及輸入手機局域網 ip 的地址。因此在實際業務中,還有很多東西需要改造以適合自身的業務。

參考資料:

  1. https://github.com/sunshinex/adbs
  2. https://github.com/Malinskiy/adam
  3. https://github.com/jakkypan/trivia/blob/master/ADB%E9%80%9A%E4%BF%A1%E5%8D%8F%E8%AE%AE.md
  4. https://juejin.cn/post/7034799230086545445
  5. https://itimetraveler.github.io/2019/06/07/Android%20ADB%E5%8E%9F%E7%90%86%E6%8E%A2%E7%A9%B6/#ADB-Protocol-%E9%80%9A%E4%BF%A1%E5%8D%8F%E8%AE%AE
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章