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

デフォルトでは、アプリのリリースビルドでネイティブ コード ライブラリがストリッピングされます。このストリッピングでは、アプリで使用されるネイティブ ライブラリに含まれるシンボル テーブルとデバッグ情報が削除されます。ネイティブ コード ライブラリをストリッピングすると、サイズを大幅に削減できますが、クラス名や関数名などの情報が欠落するため、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. Google Play Console に手動で symbols.zip ファイルをアップロードします。