はじめに
アプリケーションがクラッシュした時、Logcatにはクラッシュがどのようなフローで発生したかを確認する為のスタックトレース情報が表示されます。
しかしながら、スタックトレースは16進のアドレスとsoファイルの組み合わせで表示される為、このままでは人間には理解出来ません。 この情報を人間が読めるフォーマットへ変換することをシンボリケートと呼びます。 これまではAndroidプラットフォームの場合、シンボリケートを行う為にはコマンドラインのツールを駆使する必要がありちょっと難しい雰囲気がありましたが、Unityが公開しているAndroid Logcatから容易にシンボリケートが可能となりました。
Android Logcat
Android LogcatはUnityEditor上でLogcatの情報を表示する為パッケージですが、シンボリーケートやメモリ関連の情報を確認することが可能です。 Android Logcatはパッケージマネージャーからインストール可能です。
インストール
Window > Package ManagerからPackage Manager WIndowを起動します。
Unity Registryを選択するとAndroid Logcatがリストアップされるので、Installボタンを押します。
Android Logcatでシンボリケートかいつのバージョンから使用出来るようになったか不明ですが、現在公開されている1.2.3
以降であればシンボリケートを行うことが可能です。
シンボルファイルの入手
シンボルファイルはシンボリケートを行う為に必要な情報が詰まった必須ファイルです。 このファイルの一番簡単な取得方法はビルド時にCreate symbol.zipにチェックを入れてビルドを行うことです。
このZIPファイルを展開し、Editor > Project Settings > Analysis > Android Logcat Settings からシンボルファイルを設定します。
画面右側の+ボタン
を押してください。
Pickup Custom Location から展開したフォルダを指定します。
シンボルファイルが無い場合、例えば他の人がビルドを行ったAPKをシンボリケートを行う場合、スタックトレースのこの部分に表示されている内容を参照してください。
その設定に合わせてシンボルを選択します。
この場合、libmain.soとlibunity.soに含まれるコードのシンボリケートは可能ですが、libil2cpp.soに含まれるコードに関してはシンボリケート出来ません。
シンボリケートしてみよう!
Window > Analayze > Andoroid LogcatからAndoroid Logcatを起動します。
クラッシュが発生したらAndoroid LogcatのtoolsボタンからStacktrace Utilityを選択します。
Android Logcateではスタックトレースの情報が赤色で表示されているのそれをまるっとコピーしてStacktrace UtilityのOriginal Tab側にペーストします。
画面右上のResolve Stacktracesボタンを押します。
文字列の色が緑色になった部分がシンボリケートされたことによって変わった部分です。
例えば#00 pc 000f2224
の部分が、il2cpp::vm::GetReducedType(Il2CppClass const*) at C:\Program Files\Unity\Hub\Editor\2020.3.18f1\Editor\Data\il2cpp\libil2cpp\vm/Class.cpp:?
となり、実際にどのクラスの何行目でクラッシュが発生したのかを確認することが出来ます。
赤色の部分はシンボリケート出来なかった部分です。libart.so not found
となっており、これはシンボルファイルlibart.soが見つからなかったことを表します。libart.soを何処からか入手できれば、Pickup Custom Locationから指定を行うことでシンボリケートを行いことは可能な筈です。
まとめ
- Android Logcatでスタックトレースのシンボリケートが可能
- シンボリケートを行う為にはシンボルファイルが必要
- シンボルファイルはビルド時に
Create symbol.zip
にチェックを入れることで生成されるZIPファイルから入手する
以上