クラッシュのスタック トレースの難読化を解除する、シンボリケートする

Android でクラッシュや ANR が発生すると、スタック トレースが生成されます。スタック トレースとは、クラッシュの時点までにプログラムで行われた関数呼び出しを順番にネストしたスナップショットです。このスナップショットは、ソース内の問題を特定して修正するのに役立ちます。

Java を使用したアプリやゲームの開発で、アプリの最適化と難読化に ProGuard を使用している場合、アプリの各バージョンに対応した ProGuard マッピング ファイルを Google Play Console にアップロードできます。ネイティブ コード(C++ など)を使って開発したアプリやゲームの場合は、アプリの各バージョンに対応したデバッグ シンボル ファイルを Google Play Console にアップロードできます。これにより、クラッシュや ANR の分析と修正が容易になります。

重要: Java でコンパイルされたアプリの難読化解除では、ReTrace に対応するマッピング ファイルのみがサポートされます。これは、ProGuard または R8 で使用されているものと同じ形式です。

ステップ 1: 難読化解除ファイルまたはシンボリケーション ファイルを生成する

特定のバージョンのアプリのクラッシュと ANR の難読化を解除(シンボリケート)するには、まず、同じバージョンのアプリで必要なファイルを生成する必要があります。難読化解除またはシンボリケーションを機能させるには、アプリの新しいバージョンごとにファイルを生成してアップロードする必要があります。

Java: ProGuard マッピング ファイルを生成する

Java スタック トレースの難読化を解除するには、まず、ProGuard マッピング ファイルを生成する必要があります。方法については、Google Developers サイトをご覧ください。

ネイティブ: デバッグ シンボル ファイルを生成する

Android Gradle プラグイン バージョン 4.1 以降

プロジェクトで Android App Bundle をビルドする場合は、その中にデバッグ シンボル ファイルを自動的に含めることができます。このファイルを含めるには、アプリの build.gradle ファイルに次の行を追加します。

  • android.defaultConfig.ndk.debugSymbolLevel = 'FULL'

注: デバッグ シンボル ファイルのサイズ上限は 800 MB です。デバッグ シンボルのフットプリントが大きすぎる場合は、FULL ではなく SYMBOL_TABLE を使用してファイルサイズを減らしてください。

プロジェクトで APK をビルドする場合は、上記の build.gradle のビルド設定を使用して、デバッグ シンボル ファイルを個別に生成します。後述のステップ 2: 難読化解除ファイルまたはシンボリケーション ファイルをアップロードするの説明に沿って、デバッグ シンボル ファイルを Google Play Console に手動でアップロードします。ビルドプロセスの一環として、Android Gradle プラグインはこのファイルを次のプロジェクトの場所に出力します。

  • app/build/outputs/native-debug-symbols/variant-name/native-debug-symbols.zip

Android Gradle プラグイン バージョン 4.0 以前(とその他のビルドシステム)

Android Gradle プラグインは App Bundle または APK のビルドプロセスの一環として、ストリップしていないライブラリのコピーをプロジェクト ディレクトリに保持します。このディレクトリは次のような構造になっています。

app/build/intermediates/cmake/universal/release/obj

├── armeabi-v7a/

│   ├── libgamenegine.so

│   ├── libothercode.so

│   └── libvideocodec.so

├── arm64-v8a/

│   ├── libgamenegine.so

│   ├── libothercode.so

│   └── libvideocodec.so

├── x86/

│   ├── libgamenegine.so

│   ├── libothercode.so

│   └── libvideocodec.so

└── x86_64/

    ├── libgameengine.so

    ├── libothercode.so

    └── libvideocodec.so

注: 別のビルドシステムを使用している場合は、上記の必要な構造を持つディレクトリにストリップしていないライブラリを保存するように変更できます。

  1. このディレクトリの内容を圧縮します。
    • $ cd app/build/intermediates/cmake/universal/release/obj
    • $ zip -r symbols.zip .
  2. 後述のステップ 2: 難読化解除ファイルまたはシンボリケーション ファイルをアップロードするの説明に沿って、symbols.zip ファイルを Google Play Console に手動でアップロードします。

デバッグ シンボル ファイルのサイズ上限は 800 MB です。ファイルが大きすぎる場合は、.so ファイルにシンボル テーブル(関数名)と DWARF デバッグ情報(ファイル名と数行のコード)が含まれていることが原因と考えられます。これらはコードをシンボリケートするために必要ではないため、次のコマンドを実行して削除できます。

  • $OBJCOPY --strip-debug lib.so lib.so.sym

注: $OBJCOPY は、ストリップする ABI の特定のバージョンを指します(例: ndk-bundle/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-objcopy)。

ステップ 2: 難読化解除ファイルまたはシンボリケーション ファイルをアップロードする

特定のバージョンのアプリのクラッシュと ANR の難読化を解除(シンボリケート)するには、アプリの各バージョンに対応する難読化解除ファイルまたはシンボリケーション ファイルをアップロードする必要があります。

重要: この手順は、デベロッパーが APK を使用する場合にのみ必要です。App Bundle と Android Gradle プラグイン バージョン 4.1 以降を使用している場合は、何もする必要はありません。難読化解除ファイルはバンドルから自動的に取得されます。ステップ 3: 難読化が解除されたクラッシュのスタック トレースを表示するに進んでください。App Bundle について詳しくは、Android デベロッパー サイトをご覧ください。

Google Play Console を使用してファイルをアップロードする

難読化解除ファイルまたはシンボリケーション ファイルをアップロードする方法は次のとおりです。

  1. Google Play Console を開きます。
  2. アプリを選択します。
  3. 左側のメニューで [リリース] > [App Bundle エクスプローラ] を選択します。
  4. 右上にある選択ツールを使用して、関連するアーティファクトを選択します。
  5. [ダウンロード] タブを選択し、[アセット] まで下にスクロールします。
  6. 該当するマッピング ファイルまたはデバッグ シンボルのアップロード矢印をクリックして、アプリのバージョンに対応する難読化解除ファイルまたはシンボリケーション ファイルをアップロードします。
Google Play Developer API を使用してファイルをアップロードする

Google Play Developer API を使用してファイルをアップロードするには、Google Developers サイトにアクセスしてください。

ステップ 3: 難読化が解除されたクラッシュのスタック トレースを表示する

アプリのバージョンに対応する ProGuard マッピング ファイルまたはデバッグ シンボル ファイルをアップロードすると、その後に発生するクラッシュや ANR は難読化が解除されます。アプリの [クラッシュと ANR] ページで、個々のクラッシュと ANR について難読化が解除されたスタック トレースを確認できます。

  1. Google Play Console を開きます。
  2. アプリを選択します。
  3. 左側のメニューで [品質] > [Android Vitals] > [クラッシュと ANR] を選択します。
  4. クラッシュを選択します。
  5. [スタック トレース] に、難読化が解除(シンボリケート)されたスタック トレースが表示されます。

重要: アプリのバージョンに対応するマッピング ファイルをアップロードすると、そのバージョンのアプリでそれ以降に発生するクラッシュと ANR についてのみ、難読化が解除されます。そのバージョンのアプリで、対応するマッピング ファイルをアップロードする前に発生したクラッシュと ANR については、難読化が解除されません。

よくある質問

Google Play Console の難読化解除またはシンボリケーションを使用したくありません。オフラインで行うことはできますか?

Google Play Console で、ネイティブ アプリのスタック トレースを判読するには ndk-stack を使用し、Java のクラッシュには ReTrace を使用します。難読化解除ファイルを共有しない場合は、難読化されたクラッシュ スタックを Google Play Console からコピーし、適切なツールをオフラインで使用してシンボリケートできます。ただし、このプロセスはクラッシュ スタックごとに手動で行う必要があるため、スピードが遅くなり、時間もかかります。難読化解除ファイルを提供すると、Google Play Console で自動的に処理されるようになります。

難読化解除ファイルまたはシンボリケーション ファイルをアップロードしましたが、クラッシュと ANR がまだ難読化されているのはなぜですか?

アプリのバージョンに対応する ProGuard マッピング ファイルまたはデバッグ シンボル ファイルをアップロードすると、その後に発生するクラッシュと ANR についてのみ、難読化が解除されます。Google Play Console で難読化が解除されたクラッシュや ANR が表示されるには、ユーザーのデバイスから新しいクラッシュや ANR が報告されるまでしばらく待つ必要があります。

難読化解除ファイルまたはシンボリケーション ファイルをアップロードした後で、クラッシュと ANR の難読化が一部しか解除されないのはなぜですか?

これは不完全な難読化解除ファイルまたはシンボリケーション ファイルをアップロードしたことが原因です。特に複雑な多段階のビルドプロセスを使用している場合は、アプリ全体に対応するシンボリケーション ファイルを含めるようにしてください。部分的な難読化解除の一般的な原因として、サードパーティのライブラリを使用している場合が挙げられます。この場合は、ライブラリのプロバイダから難読化解除ファイルを入手できることがあります。

難読化解除ファイルまたはシンボリケーション ファイルをアップロードした後、クラッシュと ANR の数が減ったものの、より深刻になったように見えるのはなぜですか?

難読化解除ファイルがない場合は、32 ビットと 64 ビットのデバイス、または ARM と Intel のデバイスで発生した同じクラッシュや ANR が別々に表示されます。難読化ファイルを提供することにより、これらのクラッシュがまとめて分類されるため、アプリに最も影響を与えるクラッシュと ANR をより正確に把握できるようになります。

ファイルをアップロードし忘れた場合はどうなりますか?

アプリの新しいバージョンに対応するファイルをアップロードし忘れた場合、クラッシュと ANR は再び難読化されるようになります。上記の手順に沿って、今すぐアップロードしてください。アプリのバージョンに対応する ProGuard マッピング ファイルまたはデバッグ シンボル ファイルをアップロードすると、その後に発生するクラッシュと ANR についてのみ、難読化が解除されます。Google Play Console で難読化が解除されたクラッシュや ANR が表示されるには、ユーザーのデバイスから新しいクラッシュや ANR が報告されるまでしばらく待つ必要があります。

ファイルをアップロードし忘れるリスクを避けるには、Android Gradle プラグイン バージョン 4.1 以降で App Bundle を使用するようにビルドプロセスを変更することを検討してください。この場合は、Android デベロッパー サイトの手順に沿って、App Bundle にデバッグ シンボル ファイルを自動的に含めることができます。

間違ったファイルをアップロードした場合どうなりますか?

アプリの新しいバージョンに対する間違ったファイルをアップロードした場合、クラッシュと ANR は再び難読化されるようになります。修正したバージョンをアップロードする方法は次のとおりです。

  1. Google Play Console を開きます。
  2. アプリを選択します。
  3. 左側のメニューで [リリース] > [App Bundle エクスプローラ] を選択します。
  4. 右上にある選択ツールを使用して、関連するアーティファクトを選択します。
  5. [ダウンロード] タブを選択し、[アセット] まで下にスクロールします。
  6. 間違った難読化解除ファイルまたはシンボリケーション ファイルの横にある削除アイコンをクリックします。
  7. 間違ったバージョンを削除したら、アップロード アイコンをクリックし、アプリのバージョンに対応する正しいファイルをアップロードします。

アプリのバージョンに対応する正しい ProGuard マッピング ファイルまたはデバッグ シンボル ファイルをアップロードすると、その後に発生するクラッシュと ANR についてのみ、難読化が解除されます。Google Play Console で難読化が解除されたクラッシュや ANR が表示されるには、ユーザーのデバイスから新しいクラッシュや ANR が報告されるまでしばらく待つ必要があります。

ヒント: 間違ったバージョンのファイルをアップロードするリスクを避けるには、Android Gradle プラグイン バージョン 4.1 以降で App Bundle を使用するようにビルドプロセスを変更することを検討してください。この場合は、Android デベロッパー サイトの手順に沿って、App Bundle にデバッグ シンボル ファイルを自動的に含めることができます。

現在 APK を使用しています。App Bundle に切り替えるにはどうすればよいですか?

手順については、Android デベロッパー サイトをご覧ください。

アプリにネイティブ コードと Java コードの両方が含まれています。ネイティブのシンボリケーション ファイルと Java の難読化解除ファイルの両方をアップロードできますか?

はい。

一部の ANR でスタック トレースが表示されないのはなぜですか?

システムで ANR が発生してもスタック トレースを収集できない場合があります。この場合、アプリの安定性をより詳しく示す目的で ANR が表示されますが、スタック トレースそのものは表示されません。スタック トレースを含まない ANR はタイプ別およびアクティビティ別に分類されるため、同様の ANR を確認して修正することにより、スタック トレースを含まない ANR の数を減らせる場合があります。

この情報は役に立ちましたか?

改善できる点がありましたらお聞かせください。

さらにサポートが必要な場合

次の手順をお試しください。

検索
検索をクリア
検索を終了
Google アプリ
メインメニュー
2755774460536702954
true
ヘルプセンターを検索
true
true
true
true
true
92637
false
false