事前ビルド済み APK のプロファイリングやデバッグを行う

Android Studio 3.0 以降の場合、Android Studio プロジェクトから APK をビルドすることなく、APK のプロファイリングやデバッグを行うことができます。ただし、デバッグ機能を有効にした APK を使用する必要があります。

APK のデバッグを開始するには、Android Studio のウェルカム画面で [Profile or debug APK] をクリックします。すでにプロジェクトを開いている場合は、メニューバーで [File] > [Profile or debug APK] をクリックしてください。次のダイアログ ウィンドウで、Android Studio にインポートする APK を選択して、[OK] をクリックします。

すると、図 1 のように、パッケージ化されていない APK ファイルが表示されます。ここで表示されるのは、完全に逆コンパイルされたファイルのセットではありませんが、.dex ファイルよりも人間にとって読みやすいバージョンの .smali ファイルが表示されます。

図 1: 事前ビルド済み APK を Android Studio にインポートする

[Project] パネルの [Android] ビューで、以下のような APK の中身を確認できます。

  • APK ファイル: APK をダブルクリックすると、APK Analyzer が開きます。
  • manifests: APK から抽出されたアプリ マニフェストが格納されます。
  • java: Android Studio によって APK の DEX ファイルから .smali ファイルに逆コンパイルされた Java コードが格納されます。このディレクトリ内の各 .smali ファイルは、それぞれ Java クラスに対応します。
  • cpp: アプリにネイティブのコードが含まれている場合、このディレクトリに APK のネイティブ ライブラリ(.so ファイル)が格納されます。
  • External Libraries: Android SDK が格納されます。

Android Profiler を使用して、すぐにアプリの性能テストを開始できます。

アプリの Java コードをデバッグするには、Java ソースをアタッチして、.java ファイル内のブレークポイントを追加する必要があります。同様に、ネイティブ コードをデバッグするには、ネイティブ デバッグ シンボルをアタッチする必要があります。

Java ソースをアタッチする

Android Studio はデフォルトで、APK から Java コードを抽出し、.smali ファイルとして保存します。ブレークポイントを使用して Java コードをデバッグするには、デバッグする .smali ファイルに対応する .java ソースファイルに IDE をポイントする必要があります。

Java ソースをアタッチする手順は次のとおりです。

  1. [Android] ビューを使用して、[Project] パネルで .smali ファイルをダブルクリックします。ファイルを開くと、図 1 のように、エディタに警告バナーが表示され、Java ソースを選択するように求められます。
  2. エディタ ウィンドウの上部にあるバナーで、[Attach Java Sources] をクリックします。
  3. アプリの Java ソースファイルがあるディレクトリに移動して、[Open] をクリックします。

[Project] ウィンドウで、IDE によって、各 .smali ファイルがそれぞれに対応する .java ファイルに置き換えられます。また、内部クラスも IDE によって自動的に組み込まれます。これで、通常どおりにブレークポイントを追加し、アプリをデバッグすることができます。

ネイティブ デバッグ シンボルをアタッチする

APK 内のネイティブ ライブラリ(.so ファイル)にデバッグ シンボルが含まれていない場合、図 1 のように、IDE の [Messages] ウィンドウに警告が表示されます。APK のネイティブ コードをデバッグしたり、ブレークポイントを使用したりするには、デバッグ可能なネイティブ ライブラリをアタッチする必要があります。

ビルド ID を使用して APK 内にネイティブ ライブラリをビルドした場合、Android Studio は、シンボル ファイルのビルド ID とネイティブ ライブラリのビルド ID が一致しているかチェックし、一致していない場合はシンボル ファイルを拒否します。ビルド ID を使用してビルドしていない場合、不適切なシンボル ファイルを指定すると、デバッグ時に問題が発生することがあります。

デバッグ可能なネイティブ ライブラリをアタッチする手順は次のとおりです。

  1. まだ NDK とツールをダウンロードしていない場合は、必ずダウンロードしてください。
  2. [Project] ウィンドウの [cpp] ディレクトリ([Android] ビューを選択した場合に限り表示されます。図 2 を参照)の下で、デバッグ シンボルを含まないネイティブ ライブラリ ファイルをダブルクリックします。その APK がサポートするすべての ABI の表がエディタ ウィンドウに表示されます。
  3. エディタ ウィンドウの右上隅にある [Add] をクリックします。
  4. アタッチするデバッグ可能なネイティブ ライブラリがあるディレクトリに移動して、[OK] をクリックします。

APK とデバッグ可能なネイティブ ライブラリが異なるワークステーションで作成されている場合は、以下の手順で、ローカル デバッグ シンボルのパスも指定する必要があります。

  1. 図 2 に示すように、エディタ ウィンドウの [Path Mappings] で、[Local Paths] 列のフィールドを編集して、不足しているデバッグ シンボルのローカルパスを追加します。ほとんどの場合、ルートフォルダのパスを指定するだけでよく、Android Studio が自動的にサブディレクトリを調査して追加ソースをマッピングします。また、IDE が自動的にリモート NDK のパスをローカル NDK ダウンロードにマッピングします。
  2. エディタ ウィンドウの [Path Mappings] で、[Apply Changes] をクリックします。

図 2: ローカル デバッグ シンボルのパスを指定する

[Project] ウィンドウにネイティブ ソース ファイルが表示されます。これで、通常どおりにネイティブ ファイルを開いてブレークポイントを追加し、アプリをデバッグすることができます。また、エディタ ウィンドウの [Path Mappings] で [Clear] をクリックすると、マッピングを削除できます。

既知の問題: APK にデバッグ シンボルをアタッチするには、APK とデバッグ可能な .so ファイルの両方を同一のワークステーションやビルドサーバーで作成している必要があります。