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...


   
   而在 SERVICES.TXT 中, 會列出所有相關的指令: 
   例如 : 


    adb devices 則是用 host:devices 這個指令來獲得

    % printf '000chost:devices' | netcat -t localhost 5037



   下回繼續.





留言

熱門文章