Androidシステムはログを収集する仕組み(android.util.Log)を備えています。この仕組みを使えば、アプリケーションの処理の流れや、内部の状態を逐次出力できるので、デバッグ作業に役立ちます。
ですが…
リリース時は不要(リリース後の不具合解析で必要になるもの以外)です。
なので、リリースの前にログ出力の記述を無効にしますが、数が多いと大変な作業になります。
今回、debug/releaseビルドの切り替えで、自動的にログ出力をon/offできるようにしたので紹介します。
目次
Androidシステムのログ
Androidシステムにはログを収集する仕組み(android.util.Log)を備えています。
収集する(Logクラス)
Logクラスを使います。
使用する関数(e/w/i/d/v)を切り替えることで、ログへレベル(重要度)を付けることが出来ます。
Log | 重要度(優先度?) | 意味 |
---|---|---|
Log.e(tag, msg) | ↑ ↓ 低 | Error(エラー) |
Log.w(tag, msg) | Warning(警告) | |
Log.i(tag, msg) | Information(情報) | |
Log.d(tag. msg) | Debug(デバッグ) | |
Log.v(tag, msg) | Verbose(詳細) | |
※tag:String型、通常クラス名を記述、23文字以内 ※msg:String型、メッセージ |
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) Log.i("MainActivity", "onCreate") }
モニターする(Logcat)
収集されたログを表示するモニターをLogcatと言います。
adbを使う
adb(Android Debug Bridge)は「SDK Platform-Tools」に含まれています。
「エミュレータが起動している」または「USBで端末が接続されている」状態でlogcatコマンドを発行します。
> adb logcat | grep MainActivity : 01-06 11:08:46.786 4488 4488 I MainActivity: onCreate 01-06 11:08:46.787 4488 4488 I MainActivity: onStart 01-06 11:08:46.789 4488 4488 I MainActivity: onResume 01-06 11:08:46.929 1706 1727 I ActivityManager: Displayed com.example/.MainActivity: +315ms
「SDK Platform-Tools」が無ければここからダウンロードが可能です。
Android Studioを使う
Android Studioは標準でLogcatモニターを持っています。
タブが無ければViewメニューから開きます。
debug/releaseビルドでon/offの切り替え
ログはアプリケーションの内部情報です。ログは誰でも見る事ができるので、内部情報を広く一般へ公開していることになります。セキュリティ面で良いと言えません。
また、端末のリソース(CPU/メモリー/ストレージ/バッテリー)を浪費します。
なので、リリースの前にログ出力をoffにします。これはログの出力箇所が多いと大変な作業になります。
幸いなことに「BuildConfig.DEBUG」というフラグが、debugビルド:true、releaseビルド:falseを返します。これを条件にログ出力をon/offすれば自動化できます。
次のような関数を用意してLogクラスの記述を置き換えます。
inline fun logV(tag: String, msg: String) { if(BuildConfig.DEBUG) Log.v(tag, msg) } inline fun logD(tag: String, msg: String) { if(BuildConfig.DEBUG) Log.d(tag, msg) } inline fun logI(tag: String, msg: String) { if(BuildConfig.DEBUG) Log.i(tag, msg) } inline fun logW(tag: String, msg: String) { if(BuildConfig.DEBUG) Log.w(tag, msg) } inline fun logE(tag: String, msg: String) { if(BuildConfig.DEBUG) Log.e(tag, msg) }
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // Log.i("MainActivity", "onCreate") logI("MainActivity", "onCreate") }