はじめに
突然ですが、Android開発時のデバッグ・プロファイリング方法についてまとめようと思います。検証したUE4のバージョンは4.21.2です。
今回は実機実行 中 のログ確認方法についてです。
UE4エディタ上で確認する方法と、Android Debug Monitorというツールを使う方法の2つを紹介します。
ちなみに、iOS開発版はこちらです。
pafuhana1213.hatenablog.com
Session Frontendを使ってログを確認する方法
UE4エディタ上でAndroid実機上のログを確認するためには、UE4のSession FrontendがそのAndroidを認識するようにする必要があります。認識されたAndroid端末は以下の画像のように「自分のセッション」に表示されます。そして、その項目をクリックするとログを確認できるようになります!
これから認識する方法について紹介するのですが、以降の説明は adb devices コマンドの結果に対象のAndroid端末が含まれていることを前提とします。「よく分からん!」「認識されてない!」という方は以下のページを見たり、Google先生に相談してください!
api.unrealengine.com
-messaging オプションについて
Session FrontendがAndroidを認識するためには、-messaging をコマンドライン引数に追加した状態で実機上で起動させる必要があります。
api.unrealengine.com
と言っても、エディタ右上にあるLaunchボタンやProject Launcher経由で実機実行する場合は -messaging が自動的に追加されます。そのため、特に気にしなくてもSession Frontendで実機を認識します。(…昔は明示的に追加しないと駄目だったような)
●Engine\Source\Developer\LauncherServices\Private\Launcher\LauncherWorker.cpp
// game command line FString CommandLine = FString::Printf(TEXT(" -cmdline=\"%s -Messaging\""), *InitialMap);
しかし、作成したパッケージを実機上で実行する場合はこの手は使えません。何故なら、Android OSはコマンドライン引数を実行可能ファイルに渡すことをサポートしていないからです。
そのため、UE4では UE4CommandLine.txt というファイルを経由してコマンドライン引数を渡す方法が用意されています。
UE4CommandLine.txt について
上述の通り、UE4CommandLine.txtを使うことでパッケージの場合でもコマンドライン引数を渡すことができます。更に、このファイルはパッケージインストール後に生成された「 /AndroidのストレージのRoot/UE4Game/Project名/ 」に配置すれば認識されるため、コマンドライン引数を変える度にパッケージ作成をする必要はありません!
この機能のおかげで「起動時に開くレベルの変更」や「一部機能を制限」などのデバッグ・プロファイリングで必要となる操作を手軽に行うことができます。
UE4CommandLine.txt の書き方
UE4CommandLine.txt には 渡したいコマンドライン引数を書く必要があります。
例えば 「TestProject」というプロジェクトの「Content/Maps フォルダにある LevelA」というレベルを「-Messaging」付きで開きたい場合は以下のように書くことになります。
../../../TestProject/TestProject.uproject /Game/Maps/LevelA -Messaging
Engine\Build\Android\UE4Game\UE4CommandLine.txt.template にサンプルがありますので、こちらも参考になるかと思います。
UE4CommandLine.txt の送り方
コマンドライン引数を書いたら、UE4CommandLine.txt をAndroid上のパッケージのルートフォルダに転送する必要があります。
転送はadb pushコマンドを使います。このコマンドを用いることで、開発PC上にあるファイルをAndroid端末の指定のパスに転送することができます。で、実はUE4にはこのコマンドを使うためのbatファイルが用意されています。
●Engine\Build\Android\UE4Game\PushCommandLine.bat
%ANDROID_HOME%\platform-tools\adb.exe push UE4CommandLine.txt /mnt/sdcard/UE4Game/UE4Game/UE4CommandLine.txt
注意:
/mnt/sdcard/UE4Game/UE4Game/UE4CommandLine.txt の部分は各プロジェクト名に適したパスに変える必要があります。先程例に挙げた「TestProject」の場合は、/mnt/sdcard/UE4Game/TestProject/UE4CommandLine.txtに変えることになります。
PushCommandLine.batと同じフォルダにUE4CommandLine.txt を配置した状態でこのbatファイルを使うことで、UE4CommandLine.txtがAndroid上のパッケージのルートフォルダに転送できます。
おまけ 1
ちなみに、LaunchボタンやProject Launcherで起動した場合はUE4CommandLine.txtの作成・転送を自動的に行ってくれます。そして、自動生成されるUE4CommandLine.txtに書き込まれる内容は、Project Launcher の Custom Launch ProfileのAdditional Command Line Parametersで編集することができます。
おまけ 2
Session Frontendで接続後、以下の部分から実機にコンソールコマンドを送ることができます。
Android Debug Monitorを使ってログを確認する方法
Android開発で使用するSDKに含まれる Android Debug Monitor を使うことで実行中のログを確認する方法もあります。この方法のメリット・デメリットは以下の通り。
メリット
- 「-messaging」をつける必要がない
- Session Frontendよりも詳細なログを確認可能
- 起動即クラッシュのように、Session Frontendではログを確認し辛い場合でも有効
デメリット
- ログの内容が詳細過ぎて見づらい
- UE4以外のアプリのログも出力される ( 後述のフィルタ機能で対応可能 )
- Session Frontendではできた「コンソールコマンドの送信」ができない
良し悪しがありますが、サクッとログを見たいときや即クラッシュ調査時には結構便利なのでオススメです。
Android Debug Monitorの使い方
NVPACK\android-sdk-windows\tools\monitor.bat を実行するとAndroid Debug Monitorが起動します。左上に認識されているAndroidデバイスのリストがあるので、確認したい端末を選択すると右下にログが流れ始めます。
しかし、UE4アプリ以外の様々なアプリのログが流れるため、肝心の確認したい情報がすぐ埋もれてしまいます。そこで、UE4アプリに関する情報だけを抽出するためにフィルタ機能を利用します。
(たぶん)左下にあるLog Catタブにある +ボタンを選択するとフィルタの作成画面が表示されます。その画面で以下のように入力してOKを押すと、UE4に関するTagが埋め込まれたログだけを表示するフィルタが出来上がります。
これで大分見やすくなったはずです。しかし、フィルタを適用しても追いきれない場合もあります。そんな時は以下の画像にある検索ボックスなどを用いて更に抽出するようにしましょう!