プラットフォーム コードをデバッグする

Android Studio for Platform(ASfP)には、以下のような処理を行える強力なデバッガが用意されています。

  • デバッグするデバイスを選択します。
  • Java、Kotlin、C/C++、Rust のコード内にブレークポイントを設定する。
  • 実行時に変数や式を検証する。

デバッガを使用する前に、ビルドをデバイスまたはエミュレータにフラッシュする必要があります。

アプリ プロセス(Java/Kotlin)のデバッグ

Java アプリケーション プロセスまたは Kotlin アプリケーション プロセスをデバッグするには:

  1. ASfP 内の Java または Kotlin コードにブレークポイントを設定します。

  2. メニューから [Run] > [Attach Debugger to Android Process] を選択します。

  3. [Choose Process] ダイアログで、[Debug type] が [Java Only] に設定されていることを確認します。

  4. リストからデバイスを選択します。

  5. デバッグする特定のアプリケーション プロセスを選択します。

  6. [OK] をクリックします。

  7. デバイスでアプリケーションを操作して、ブレークポイントにヒットさせます。

システム プロセス(C/C++)のデバッグ

C または C++ で記述されたシステム プロセスをデバッグするには:

  1. 実行中のデバイスまたはエミュレータが 1 つだけであることを確認します。

  2. ターミナルを開き、AOSP チェックアウトのルートから adb root を実行します。bash adb root

  1. ASfP 内の C/C++ コードにブレークポイントを設定します。

  2. メニューから [Run] > [Attach Debugger to Android Process] を選択します。

  3. [Choose Process] ダイアログで、[Debug type] を [Native Only] または [Dual (Java + Native)] に変更します。

  4. [Show all processes] チェックボックスをオンにすると、システム プロセスが表示されます。

  5. リストからデバイスを選択します。

  6. デバッグする特定のシステム プロセス(surfaceflingersystem_server など)を選択します。

  7. [OK] をクリックします。

  8. デバイスを操作してブレークポイントに到達します。

Rust のデバッグ

ASfP は、LLDB で Debug Adapter Protocol(DAP)を使用した Rust デバッグをサポートしています。このセクションでは、CodeLLDB をデバッグ アダプタ サーバーとして設定し、ホストと Android デバイスで Rust コードをデバッグする方法について説明します。

CodeLLDB をデバッグ アダプタ サーバーとして設定する

  1. 新しい Debug Adapter Protocol 実行/デバッグ構成を作成します。

    1. メニューから [Run] > [Edit Configurations] を選択します。
    2. [+] ボタンをクリックします。
    3. [Debug Adapter Protocol] を選択します。
  2. [サーバー] タブで、[新しいサーバーを作成] をクリックします。

  3. 新しく開いたダイアログで、[Choose template] をクリックし、リストから [CodeLLDB] を選択します。

  4. CodeLLDB テンプレートを選択すると、事前定義された構成で新しいサーバーが追加されます。

    1. [トレース] プルダウンで [詳細] を選択して、詳細トレースを有効にします。
    2. Android ソースの事前ビルドで lldb-server へのパスを指定する環境変数を追加します。
        LLDB_DEBUGSERVER_PATH=REPO_ROOT/prebuilts/clang/host/linux-x86/CLANG_VERSION/runtimes_ndk_cxx/x86_64/lldb-server
        ```
    
    Replace `REPO_ROOT` with the absolute path to your Android source checkout.
    To find `CLANG_VERSION`, run the `get_clang_version.py` script from the root of
    your Android source tree:
    
    ```bash
        ./build/soong/scripts/get_clang_version.py
    
    1. <<insert base directory>> セクションは変更しないでください

ホストで Rust バイナリをデバッグする

  1. Debug Adapter Protocol の実行/デバッグ構成で [Configuration] タブを開きます。
  2. [デバッグモード] として [起動] を選択します。
  3. [Working directory] を更新し、デバッグする [Binary file] を選択します。
  4. [OK] をクリックして構成を保存します。
  5. 構成の横にある [Debug] アイコンをクリックして、デバッグ セッションを開始します。

このコマンドを初めて実行すると、CodeLLDB がダウンロードされます。コンソールに DAP トレースが表示されます。Rust コードに設定されたブレークポイントは、想定どおりにヒットします。

Android デバイスで Rust バイナリをデバッグする(アタッチ モード)

  1. PID を確認する: Android デバイスでデバッグするアプリケーションのプロセス ID(PID)を確認します。

  2. デバイスで lldb-server を起動します。Android ソースツリー チェックアウトのルートから、lldbclient.py スクリプトを実行します。<PID> はプロセス ID に置き換えます。

    lldbclient.py --setup-forwarding vscode-lldb -p <PID>
    

    このスクリプトは、正しい lldb-server をデバイスにプッシュして起動し、ポート転送(ホストポート 5039 からデバイス)を設定して、次のステップに必要な DAP JSON 構成を出力します。このターミナルは開いたままにしておきます。

  3. ホストで CodeLLDB デバッグ アダプタを起動します。

    • CodeLLDB 拡張機能のディレクトリ(デフォルト: ~/.lsp4ij/dap/codelldb/extension/adapter)に移動します。
    • 必要な環境変数を設定し、アダプタ サーバーを起動します。REPO_ROOTCLANG_VERSION は、サーバー設定で決定した値に置き換えます。
        # Sets PYTHONHOME env variable
        export PYTHONHOME=REPO_ROOT/prebuilts/clang/host/linux-x86/CLANG_VERSION/python3
    
        # Tell the dynamic linker where to find python libs
        export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:REPO_ROOT/prebuilts/clang/host/linux-x86/CLANG_VERSION/python3/lib
    
        # Starts the CodeLLDB Debugger Adapter server on port 1234
        ./codelldb --liblldb REPO_ROOT/prebuilts/clang/host/linux-x86/CLANG_VERSION/lib/liblldb.so --port 1234
    
  4. ASfP DAP クライアントを構成します。

    1. ASfP の Debug Adapter Protocol Run/Debug 構成に戻ります。
    2. [構成] タブを選択します。
    3. [デバッグモード] を [アタッチ] に設定します。
    4. [アドレス] を localhost に設定します。
    5. [ポート] を 1234 に設定します。
    6. lldbclient.py コマンド(ステップ 2)の JSON 出力を [DAP parameters (JSON)] フィールドに貼り付けます。
  5. [Debug] をクリックしてデバッグ セッションを開始します。

トラブルシューティング

  • エラー error: Connection shut down by remote side while waiting for reply to initial handshake packet が表示された場合は、現在のデバッグ セッションを終了し、デバイスの lldb-server とホストの CodeLLDB アダプタを再起動します。