デフォルトでは、アプリのリリースビルドでネイティブ コード ライブラリが削除されます。この削除は、アプリで使用されるネイティブ ライブラリに含まれるシンボル テーブルとデバッグ情報を削除することで構成されます。ネイティブ コード ライブラリを削除すると、サイズが大幅に削減されます。ただし、情報(クラス名や関数名など)が不足しているため、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を使用して、Google Play Console のシンボル化されたスタック トレース内の関数名を取得します。このレベルはtombstone をサポートしています。FULLを使用して、Google 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
次のようにこのディレクトリの内容を圧縮します。
cd app/build/intermediates/cmake/universal/release/obj zip -r symbols.zip .