使用 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/ 下
- 使用 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
- OpenCV Kotlin 實現 USB 攝像頭(相機)實時畫面、拍照
- 使用 Kotlin Compose Desktop 實現了一個簡易的"手機助手"
- 使用 OpenCV 微信二維碼引擎實現二維碼識別
- 基於 Kotlin OkHttp 實現易用且功能強大的網路框架(一)
- 使用 OpenCV 實現國慶漸變版的頭像
- 在 Kotlin 中使用 WebFlux R2DBC 開發 Web 專案
- Kotlin Contract
- Kotlin Collection VS Kotlin Sequence VS Java Stream
- 在 Kotlin 的 data class 中使用 MapStruct
- 基於 Kotlin Netty 實現一個簡單的 TCP 自定義協議
- Kotlin Coroutines Flow 系列(五) 其他的操作符
- 如何使用 Ktor 快速開發 Web 專案