今回ブログの担当をさせていただきます、情熱開発部プログラム課の辻と申します。
近頃暖かくなってきたおかげで日中は暖房いらずでございますが、朝はまだ冷え込むので寝巻は長袖を着用しております。季節の変わり目で体調を崩しやすい時期になっておりますが、皆さんも体調には気を付けて参りましょう。
さて、ブログの概要は「Unityのアプリでadbを使ったクラッシュレポートの確認方法」ということで、Unityで作成したアプリのクラッシュレポートを抽出して確認する方法を記載します。それではよろしくお願いします!
使用したソフトウェアのバージョン
- Unity 2020.3.21f1
- Android SDK Platform-Tools 33.0.0
■ クラッシュレポートとは?
スマホではアプリケーション、PCではソフトウェアなどがエラーを起こして強制終了した際に作られるデータをまとめたものです。このデータを記したものをログと呼び、ログを読むことによりエラー発生の原因を突き止められます。
主に発生原因が特定し辛いエラーの原因特定に用いられますが、androidアプリの場合、確認するのに外部ツールを使用するものが大半です。
■ adb とは?
adb はAndroid Debug Bridgeの略で、Android端末(以降デバイス)とPC間で通信を行い様々なデバイスの操作を行うことが出来るコマンドラインツールです。Android SDK Platform-Toolsに含まれているため、AndroidStudioの公式サイトからAndroid SDK Platform-Toolsをインストールして設定する必要があります。
※ここではAndroid SDK Platform-Toolsのインストール方法及び設定方法は割愛します。
■ adbを使用する理由
今回adbを使用することになった理由は以下二点です。
- 開発環境が先方依存のため、余計なソフトやアセットを導入したくない
- Unityの公式が推奨しているため信頼度が高い
しかし2019.1以降のUnityにはAndroid logcatという便利なパッケージがあります。こちらを使用するとUnity上でもadb logcatの結果が確認&保存出来るのですが、以下の理由から今回はadbをそのまま使用しました。
- 各versionごとのアプリのクラッシュレポートを別ファイルで保存したい
- ログを自動で保存したい
■ adbを使ったクラッシュレポートの確認方法
以下の手順で行います。
- デバイスの設定
- adb logcatコマンド実行
- adb logcatの停止方法
1.デバイスの設定
今回はデバイス内のアプリのクラッシュレポートを抽出するため、USBでPCと接続する必要があります。そのため、デバイス側で開発者向けオプション -> USBデバッグ
の機能をONにします。開発者向けオプションはデフォルトの設定では見えなくなっているためご注意ください。
開発者向けオプション有効化についての説明は割愛します。
また、PCとデバイスをUSB接続する際にOEMのドライバをインストールする必要がある可能性があります。 その際はAndroidDevelopersにあるAndroid デベロッパー > Android Studio > ユーザーガイド > OEM USB ドライバのインストール (下記URL)
からお使いのWindowsのバージョンに対応したドライバのインストールをお願いします。
2.adb logcatコマンド実行
Unityで作成したapkファイルからデバイスにアプリをインストールしたら、PC側でターミナルを開きます。そこでadb logcat
というコマンドを入力しEnterで実行してください。
すると大量のLogが流れます。一定時間待つと更新が遅くなりますので、その状態でアプリを起動します。
その後起動したアプリでクラッシュを発生させてください。すると画像のようにターミナル上にCRASHというタグを含んだログが出てきます。
これでCRASHした理由を探ることが出来ます。
3.adb logcatの停止方法
デバイスと接続している限りadb logcatはログを流し続けます。任意のタイミングで止めたい場合、コマンド プロンプトとWindows PowerShellではCtrl + C
でコマンドを停止できます。
■ ログの絞り込み
adb logcatを実行すると全てのログが表示されます。このままだと非常に見づらいため、私が良く使用する優先度とタグ名を使った絞り込み方法を紹介します。これ以外にも絞り込む方法は複数ありますので、気になった方は logcat コマンドラインツールをご覧ください。
- 優先度とタグ名について
- 優先度の順番について
- タグ名と優先度で絞り込む
1.優先度とタグ名について
logcatで流れてくるログには、優先度とタグが存在しています。
例えば上の画像のようなログがあるとします。赤枠で囲った部分を注目すると以下のような記述になっています。
E CRASH
こちらについて logcat コマンドラインツールでは次のような説明がされています。
logcat を実行して、各メッセージの最初の 2 つの列(<priority>/<tag>)を見ると、システム内で使用されるタグと優先度のリストを確認できます。
ログにある最初の二つの列は<priority>(優先度)と<tag>だと分かります。これをE CRASH
に当てはめると、Eは priority、CRASHはtagとなります。
2.優先度の順番について
下記はlogcat コマンドラインツールから抜粋し並び替えたリストです。優先度の順番を記載しています。
S
: Silent(最も高い優先度。何も出力されません)F
: FatalE
: ErrorW
: WarningI
: InfoD
: DebugV
: Verbose(最も低い優先度)
上記のリストからEはErrorという優先度を持ち、上から三番目の優先度を持っていることが分かります。
3.タグ名と優先度で絞り込む
1と2の項目で説明したことを踏まえて絞り込みのコマンドを入力していきます。絞り込みを行う場合は、基本的にadb logcat
の後に記述する形となります。
adb logcat CRASH:E *:S
上記コマンドは CRASH:E
と*:S
という二つの条件で絞り込みを行っています。各条件について説明します。
・CRASH:Eについて
まずCRASH:E
ですが、[タグ]:[優先度]
と書くことにより[タグ]が付いているログの中で、[優先度]以上のログを表示する。という条件になります。例えば以下のようなコマンドを書いたとします。
adb logcat Uity:I
この場合はUnityタグが付いているログの中で、優先度I以上(I~S)のログを表示する。というコマンドになります。これ単体では上手く絞り込みを行うのは難しいため、続いて説明する*:S
と併用します。
・*:Sについて
*:S
は全てのログを表示しない。というコマンドです。実際に実行すると以下の画像のような結果が出ます。
[タグ]:[優先度]
のコマンドと併用して使用することで、 [タグ]:[優先度]
で絞り込んだログ以外を非表示にすることが出来ます。
・実行例
ここで項目の最初に紹介したadb logcat CRASH:E *:S
コマンドを実行してみます。すると以下画像のようにCRASHタグが付いた優先度E以上のログを表示できます。これで絞り込みが行えます。
まとめ
- ログの最初の2列には、優先度とタグという情報が含まれている
- タグと優先度で絞り込む場合は
[タグ]:[優先度]
と*:S
の条件を併用する
■ ログを別のファイルに自動書き出しする方法
adb logcatの後に、 >> 保存先パス\ファイル名
で別ファイルに書き出すことが可能です 。
このコマンドを実行した場合、Dドライブのcrashreportフォルダ内にlogcat.logファイルを作成します。作成したファイルは任意のテキストエディタで開けば中身を見ることが出来ます。また、このコマンド実行時はターミナル上にログは流れなくなりますのでご注意ください。
実行例
上記コマンドを絞り込みコマンドと組み合わせて実行してみます。まずDドライブ上のcrashReportフォルダの中身を確認します。
何も入っていないことを確認したらターミナルを立ち上げ、下記コマンドを打ち込みます。
adb logcat CRASH:E *:S >>D:\crashReport\20220323_crashReport.log
この状態でアプリを立ち上げ、クラッシュを引き起こします。クラッシュしたらターミナルからCtrl + Cでコマンドを終了します。その後最初に確認した Dドライブ上のcrashReportフォルダを確認してみます。
指定したファイル名のログファイルがあれば成功です。あとは任意のテキストエディタでファイルを開けばクラッシュレポートを確認できます。
■ 最後に
如何だったでしょうか。今回のブログはプログラム的な話ではなくdebugのお話をさせていただきました。adbのコマンドは多用途に渡るため、さらに調べていけば便利な機能を発見できるかもしれません。今回はこれまでですが機会があればまた紹介したいと考えております。
参考サイト
今回のブログを書くにあたり、以下のサイトを参考にさせていただきました。ありがとうございました。
【Unity】Unity 上で Android の logcat が実行できるパッケージが Package Manager からインストールできるようになった(現在はプレビュー版)
【免責事項】
本サイトでの情報を利用することによる損害等に対し、
株式会社ロジカルビートは一切の責任を負いません。