Unity はアプリケーションのデバッグに役立つパッケージを生成できます。このパッケージに含まれているシンボルファイルには、Unity のネイティブライブラリ用のデバッグメタデータがあります。シンボルファイル内のシンボルテーブル (.symtab) という実行ファイルセクションは、アクティブなメモリアドレスをメソッド名などの使用可能な情報に変換します。この変換プロセスをシンボリケーションといいます。シンボルパッケージを Google Play Console にアップロードして、人間が読めるスタックトレースを Android Vitals ダッシュボードに表示できます。
実行ファイル (ELF) セクションの詳細は、Wikipedia を参照してください。
以下のライブラリ用のシンボルファイルを生成することができます。
libmain: 最初の Unity エンジンのロードロジックに関連します。シンボルファイルはプリコンパイルされます。
libunity: Unity のエンジンコード:
libil2cpp: C# スクリプトが含まれています。
Gradle がその他のシンボルファイルを生成します。
アプリケーションのビルド形式に応じて、Unity は 2 つの方法でシンボルファイルを生成します。
apk または aab の zip ファイルとして生成できます。aab に直接埋め込みます。Unity は apk にはシンボルファイルを埋め込みません。UserBuildSettings.DebugSymbols.format API を使用して、シンボルパッケージの形式を設定します。
Unity は Gradle の debugSymbolLevel プロパティを使用してシンボルファイルを生成します。シンボルファイルには 2 種類あります。
UserBuildSettings.DebugSymbols.level を使用して、必要な種類のシンボルファイルを生成します。
注意デフォルトでは、Gradle は .so.sym または .so.dbg 拡張子を持つシンボルファイルを生成します。デジタル配信サービスによっては、これらの拡張子が認識されず、.so 拡張子を持つファイルが必要です。そのような場合は、Unity.Android.Types.DebugSymbolFormat.LegacyExtensions API を使用して、.so 拡張子を持つシンボルファイルを作成します。
UserBuildSettings.DebugSymbols.format = DebugSymbolFormat.IncludeInBundle | DebugSymbolFormat.Zip | DebugSymbolFormat.LegacyExtensions;
パブリックシンボルファイルには、関数のアドレスを人間が読める文字列に解決する情報が含まれています。これらのファイルにデバッグ情報は含まれません。そのため、パブリックシンボルファイルは デバッグシンボル ファイルよりも小さくなります。
デバッグシンボルファイルには、完全なデバッグ情報とシンボルテーブルセクションが含まれています。このファイルを以下の目的に使用できます。
注意デバッグシンボルを利用できない場合、Unity はビルド時に パブリックシンボル ファイルをプロジェクトに配置します。libmain と libunity のライブラリにデバッグシンボルは利用できないため、Unity は常にパブリックファイルを生成します。
シンボルファイルを追加するように Unity に指示できます。これが役に立つのは、共有ライブラリを使用していて、アプリケーションがクラッシュしたときに、ローカルデバッガーと Google Play で共有ライブラリのスタックトレースを解決する場合です。
カスタムシンボルファイルを追加するように Unity に指示する手順は以下のとおりです。
.so ファイル拡張子を持つプラグインを選択します。Unity はシンボルパッケージを生成するたびに、シンボルパッケージにシンボルファイルを追加します。
C# スクリプトのカスタムシンボルファイルを加えるように Unity に指示するには、UnityEditor.Android 名前空間に以下の API を加えます。以下の API は CPU と Shared Library Type をそれぞれ設定します。
注意シンボルファイル名は、シンボルファイルの対象となる共有ライブラリの名前と一致する必要があります。例えば、共有ライブラリの名前が mylibrary.so の場合、シンボルファイルの名前も mylibrary.so である必要があります。ファイル名の衝突を避けるために、シンボルファイルと共有ライブラリは別々のディレクトリに置く必要があります。
重要:シンボルファイルが最新であり、実行ファイルコードを含む共有ライブラリと互換性のあることを確認してくだい。そうしないと、ローカルデバッガーと Google Play で共有ライブラリのコードのスタックトレースを解決できません。
アプリケーションのシンボルパッケージ生成を有効にするには、2 つの方法があります。
Build Settings ウィンドウでシンボルパッケージの生成を有効にするには、次の手順に従います。
Build Profiles ウィンドウを開きます (メニュー: File > Build Profiles)。
Android プラットフォームを選択します。
Debug Symbols を以下のいずれかに設定します。
Symbols output options を .zip に設定します。
シンボルパッケージの生成を有効にしてから、プロジェクトをビルドすると、.zip ファイルが生成されます。このファイルは、libmain と libunity のライブラリ用のシンボルファイルを含みます。scripting backend を IL2CPP に設定すると、.zip には libil2cpp ライブラリ用のシンボルファイルも含まれるようになります。Unity は、このシンボルパッケージを出力ディレクトリ内に置きます。
Android Build Settings で Export Project を有効にすると、Unity はプロジェクトをビルドしません。代わりに、Unity は Android Studio のプロジェクトをエクスポートし、libmain と libunity のシンボルを生成して、出力ディレクトリの unityLibrary/symbols/<architecture>/ 内に配置します。Android Studio からエクスポートしたプロジェクトをビルドすると、Gradle が libil2cpp シンボルファイルを生成し、libmain と libunity のシンボルファイルとともに unityLibrary/symbols/<architecture>/ ディレクトリ内に配置します。
Android App Bundle (aab) を生成する場合は、シンボルを aab に直接埋め込み、Google Play にアップロードすることができます。
注意Unity はシンボルを apk に埋め込みません。この場合、シンボルを含む zip ファイルを別途アップロードする必要があります。
UserBuildSettings.DebugSymbols.level = DebugSymbolLevel.SymbolTable;
UserBuildSettings.DebugSymbols.format = DebugSymbolFormat.IncludeInBundle;
Zip で圧縮されたシンボルパッケージを生成するには、以下のコードを使用します。
UserBuildSettings.DebugSymbols.level = DebugSymbolLevel.SymbolTable;
UserBuildSettings.DebugSymbols.format = DebugSymbolFormat.Zip | DebugSymbolFormat.LegacyExtensions;
アプリケーションを Google Play にアップロードしたら、パブリックシンボル の zip パッケージをアップロードできます。この方法については、Google のドキュメント クラッシュのスタックトレースの難読化を解除する、シンボリケートする を参照してください。
注意Google Play は、シンボルパッケージをアップロードする前のアプリケーションのクラッシュはシンボリケートしません。