偵錯平台代碼

Android Studio for Platform (ASfP) 整合了多語言平台偵錯功能,可透過「Debug」工具視窗中的「Attach」分頁執行偵錯:

  • 選取「Run」>「Attach to Android Process」(執行 > 附加至 Android 處理程序) (Control+Alt+A),將 Java 偵錯工具、原生偵錯工具 (隨附的 LLDB) 或兩者附加至實體裝置或 Cuttlefish 虛擬 裝置上執行的 任何應用程式或系統程序。
  • 在附加之前,請檢查每個載入的共用程式庫 (.so) 和其八字元的 ELF Build ID (位於「程式庫」面板中),並使用勾號圖示驗證 out/target/product/<device>/symbols 下的相符本機偵錯符號。
  • 從工具列管理裝置先決條件:使用「Show system processes」(顯示系統程序) 篩選,按一下「Root Device」(Root 裝置) 執行 adb root (啟用時會顯示「Device is rooted」(裝置已 Root) ),然後按一下「Enable JDWP」(啟用 JDWP) ,在 userdebug 建構版本上啟用 JDWP。
  • 設定條件和例外狀況中斷點、在編輯器中查看內嵌變數值、使用「捨棄影格」和智慧「逐步進入」,以及在執行階段檢查結構化 C++ 和 Rust 型別。

使用偵錯工具前,請先建構 lunch 目標,確保本機 out/target/product/<device>/symbols/.build-id 符號索引存在,並刷入或啟動相符的裝置映像檔。

Java 和雙重 Java 與原生偵錯

如要對 Java 或 Kotlin 應用程式、系統應用程式 (例如 com.android.messaging、設定或 SystemUI),或呼叫 JNI 和 C++ 或 Rust 程式碼的程序進行偵錯,請完成下列步驟:

  1. 在 Java、Kotlin、C、C++ 或 Rust 來源檔案中設定中斷點。
  2. 依序選取「Run」>「Attach to Android Process」 (Control+Alt+A)。ASfP 會在「Debug」工具視窗中開啟固定的「Attach」分頁。
  3. 從裝置下拉式選單中選取目標裝置。如果 userdebug 版本未啟用 JDWP,請按一下「Enable JDWP」,ASfP 會設定 persist.debug.dalvik.vm.jdwp.enabled=1 並重新啟動裝置。啟用後,按鈕會顯示「已啟用 JDWP」,並提供「停用 JDWP」動作 (按一下滑鼠右鍵)。
  4. 從表格中選取目標程序 (Java 和 ART 程序會顯示咖啡杯圖示)。
  5. 在「Attach」(附加) 分頁的底部,選取「Java debugger」(Java 偵錯工具)、「Native debugger」(原生偵錯工具),或同時選取這兩者。同時選取這兩者,會在「Debug」工具視窗中開啟兩個連結的分頁:<process> (<pid>) 代表內建 LLDB,<process> (<pid>)-jdwp 則代表 Java。兩者的生命週期會綁在一起,因此停止任一工作階段都會停止兩者。
  6. 按一下「Attach」,然後在裝置上與應用程式互動,即可觸發中斷點。

與「Attach」分頁連結的 Java 和原生偵錯分頁

系統程序 (C 和 C++) 偵錯和符號驗證

如要偵錯系統精靈、HAL 或系統服務 (例如 android.hardware.bluetooth-service.cuttlefish、surfaceflinger 或 audioserver),請完成下列步驟:

  1. 開啟「Run」>「Attach to Android Process」(Control+Alt+A)。如果工具列顯示「Root Device」,請按一下,ASfP 會執行 adb root 並顯示「Device is rooted」。
  2. 選取頂端工具列中的「顯示系統程序」,然後篩選目標程序。
  3. 在「程式庫」面板中驗證本機偵錯符號:選取程序會填入「程式庫」表格,其中包含程序中載入的每個 ELF 共用資料庫 (.so),以及 ELF 版本 ID 的前八個十六進位字元。ASfP 會比對每個建構 ID 與 out/target/product/<device>/symbols (symbols/.build-id 是解析 APEX 內程式庫的必要條件):
    • 經過驗證的程式庫會顯示勾號圖示。將游標指向任何已解析的資料列,即可預覽完整的本機 .debug 符號路徑。
    • 如果無法解析的程式庫沒有相符的本機符號,系統會顯示警告圖示。
  4. 偵測非 Java 程序:選取 C++ 或 Rust 程序 (標示六邊形 C 圖示) 時,ASfP 會隱藏 Java 偵錯工具,並顯示「Java debugging unavailable, not a Java process.」(無法進行 Java 偵錯,這不是 Java 程序。),同時保持勾選「Native debugger」。
  5. 在 C、C++ 或 Rust 來源檔案中設定中斷點,然後按一下「附加」,並在裝置上觸發程式碼路徑。

附加顯示程式庫表格、ELF 版本 ID 和本機符號核取記號的標籤

偵錯 Rust 程式碼

ASfP 會使用與 C 和 C++ 相同的內建 LLDB 偵錯工具,偵錯 Rust 平台程式碼。您不需要外部轉接器或手動設定伺服器:ASfP 會使用其隨附工具鍊中的 lldb-dap,並從 AOSP 預先建構項目自動載入 Rust 漂亮列印工具,因此 String、Vec、HashMap 和 Option 等標準型別會在「變數」窗格中顯示結構化值。

附加至裝置上執行的 Rust 程序

請按照「系統程序 (C 和 C++) 偵錯」一文中的步驟操作:開啟「Run」>「Attach to Android Process」,確認「Device is rooted」和本機符號在「Libraries」面板中顯示勾號,勾選「Native debugger」,然後按一下「Attach」。Rust 和 C 或 C++ 堆疊框架會顯示在同一個偵錯工作階段中。

對 rust_test 或 rust_test_host 模組進行偵錯

  1. 開啟宣告 rust_test 或 rust_test_host 的 Android.bp 檔案,然後按一下模組類型旁邊的側欄中的「執行」圖示。
  2. 選取「Debug '<ModuleName>'」。ASfP 會建構目標、在主機或連結裝置上啟動 LLDB 下的測試二進位檔,並在 Rust 中斷點暫停。
  3. 如要偵錯單一測試函式或自訂 LLDB 啟動指令,請依序開啟「Run」>「Edit Configurations」,選取產生的「Soong Test」設定,然後設定「Method」或展開「Debugger」選項。如要進一步瞭解 Soong 測試設定選項,請參閱「使用 atest 測試平台程式碼」。

在 ASfP 中使用結構化變數視覺化工具,偵錯 Rust 平台程式碼