リリースビルドにネイティブ シンボルを含める

アプリのリリースビルド内のネイティブ コード ライブラリは、デフォルトでストリップされます。これにより、アプリで使用されるネイティブ ライブラリに含まれるシンボル テーブルとデバッグ情報が削除されます。ネイティブ コード ライブラリをストリップすると、サイズが大幅に削減されますが、情報(クラス名、関数名など)がないため、Google Play Console でクラッシュを診断できなくなります。クラッシュをデバッグするには、Google Play Console でアプリにデバッグ シンボル ファイルを含める必要があります。

シンボル ファイルをアップロードする

Google Play Console の Android Vitals で、ネイティブ コードでのクラッシュが報告されます。簡単な手順で、アプリのネイティブ デバッグ シンボル ファイルを生成してアップロードできます。このファイルがあると、ネイティブ コードでのクラッシュのスタック トレースに対して Android Vitals でシンボリケーション(クラス名や関数名を含む)が可能になり、本番環境でアプリをデバッグできます。この手順は、プロジェクトで使用される Android Gradle プラグインのバージョンと、Android App Bundle(推奨)を使用しているか APK を使用しているかによって異なります。

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

プロジェクトで Android App Bundle(AAB)をビルドする場合は、アプリを公開するときにネイティブ デバッグ シンボル ファイルが AAB に自動的に含まれて Google Play Console にアップロードされるようにビルドを構成できます。リリースビルドにこのファイルを含めるには、アプリの build.gradle.kts ファイルに以下を追加します。

android.buildTypes.release.ndk.debugSymbolLevel = { SYMBOL_TABLE | FULL }

以下から、デバッグ シンボルのレベルを選択します。

  • SYMBOL_TABLE を使用して Play Console のシンボリケーション スタック トレース内の関数名を取得します。このレベルは Tombstoneに対応しています。
  • FULL を使用して Play Console のシンボリケーション スタック トレース内の関数名、ファイル、行番号を取得します。

プロジェクトで APK をビルドする場合は、前述の android.buildTypes.release.ndk.debugSymbolLevel 設定を使用して、ネイティブ デバッグ シンボル ファイルを別個に生成します。ネイティブ デバッグ シンボル ファイルを Google Play Console に手動でアップロードします(スタック トレースを難読化解除するためのマッピング ファイルのアップロードと手順は似ています)。ビルドプロセスの一環として、Android Gradle プラグインはこのファイルを次のプロジェクトの場所に出力します。

app/build/outputs/native-debug-symbols/<var>variant-name</var>/native-debug-symbols.zip

依存関係にネイティブ ライブラリが含まれている場合、サイズを縮小するためにデバッグ情報がストリップされている可能性があります。これを確認するには、ログレベルを info に設定し、debugSymbolLevel = { SYMBOL_TABLE | FULL } を設定してビルドを実行します。 ビルド出力で次の行を探します。

Unable to extract native debug metadata from ... because the native debug metadata has already been stripped.

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

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

app/build/intermediates/cmake/universal/release/obj/
├── armeabi-v7a/
│   ├── libgameengine.so
│   ├── libothercode.so
│   └── libvideocodec.so
├── arm64-v8a/
│   ├── libgameengine.so
│   ├── libothercode.so
│   └── libvideocodec.so
├── x86/
│   ├── libgameengine.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. 手動で symbols.zip ファイル を Google Play Console にアップロードします。