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

語言: CN / TW / HK

pexels-zarina-khalilova-12467948.jpg

一. 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-connector.png

在 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 手機的連線效果:

連上手機,獲取手機的基礎資訊

1.png

3.2 執行 adb shell 命令的效果:

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

2.png

3.png

3.3 install app

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

安裝 App 時分成2步:

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

4.png

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

5.png

6.png

3.4 uninstall app

adb shell pm uninstall 包名

7.png

四. 總結

這款工具 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