Android adb : built on Mac OS - 1
相關程式
https://android.googlesource.com/platform/system/adb
要在 mac 上獨立編譯似乎不大容易, 所以另外做了一個:
https://github.com/neojou/android-adb-on-mac
之後看看是否能從 C++ 改成用 Rust 重新寫一個
Trace code:
main() 是在 client/main.cpp, 會呼叫 commandline.cpp 中的
adb_commandline(argc, argv), 簡單地用參數陣列判斷
1. 不帶參數 (argc == 0) 時, 是呼叫 help() 來顯示
help() 函式在 commandline.cpp 中
syntax_error() 是在 adb_utils.cpp
相關版本定義在 adb.h
android::base::StringPrintf() 暫先放在 stringprintf.cpp
2. adb devices
(1) adb_client.cpp::adb_query()
(2) adb_client.cpp::adb_connect()
(2) adb_client.cpp::_adb_connect()
(3) socket_spec.cpp::socket_spec_connect()
這邊需要 __adb_server_socket_spec 的定義,
先定義成 tcp:localhost:5037
(4) network.cpp::network_loopback_client()
這邊會對 localhost port 5037 做 tcp socket
server 程式在 localhost tcp port 5037 上啟動的部分,
之後再來繼續研究, 我們可以先用現成的 adb 執行 adb devices 來啟動.
* daemon not running; starting now at tcp:5037
* daemon started successfully
另外在 pixel 手機端啟動 adb 服務的方式為
1. 在 設定 -> 關於手機 -> 版本號碼 上連續按七下, 按的時候會提示再按幾次後
會開啟開發人員模式
2. 在 設定 -> 系統 -> 開發人員選項 下, 會有是否允許 USB 偵錯 的選項
3. tcp socket 連好之後, 就可以執行 adb 的指令
第一個會執行的是 詢問 adb server 的 版本
000chost:version
其中 000c 是命令 host:version 的長度為 12 bytes.
要注意用 telnet 方式會多出 0d 0a 跳行, 則命令會失敗.
( 可以利用工具 wireshark 或 tcpdump, 來做封包分析 )
我們仍可用以下的方式來做, 這樣不會多輸入跳行
printf '000chost:version' | netcat -t localhost 5037
執行後會得到:
OKAY00040029
命令成功會回覆 OKAY, 失敗會回覆 FAIL
0004 是後面回覆的長度, 0029 值 是 41, 表示 server 版號為 41
在 adb server /client 間, 版號會做比對
而 adb.h 會有定義 ADB_SERVER_VERSION,
若定義不同, 例如為 39
則會產生底下錯誤訊息並中斷程式.
adb server version (41) doesn't match this client (39); killing...
留言
張貼留言