こんにちは、やぎにいです。
やぎすけ Advent Calendar 2016の6日目です。そろそろキツくなってきましたね。
昨日は僕がStethoを使ってGoogle Chromeでデバッグをするを書きました。
今日はAndroidプロジェクトを作って結構な確率で導入するライブラリで書いた2つ目のTimberの使い方をまとめたいと思います。
Timberの導入をします。
build.gradle
にcompile 'com.jakewharton.timber:timber:4.3.1'
を追加してあげるだけです(バージョンは執筆時)。
このTimberはandroid.util.Log
をラッパーしているライブラリなので非常に軽量です。とても嬉しい。
次にアプリケーションクラスで初期化しましょう(TimberではTree
をplant
すると言います ちょっとおしゃれ)。
1 2 3 4 5 6 7 8 | public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); Timber.plant(new DebugTree()); } } |
これで導入が完了しました。
今までLog.d();
Log.e();
などと書いていた部分はすべてTimber.d();
Timber.e();
に置き換えることが出来ます。
release
ビルドではログを出力したくない!というときは以下のように書けばdebug
ビルドだけで有効になります。
1 2 3 4 5 6 7 8 9 10 | public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); if (BuildConfig.DEBUG) { Timber.plant(new DebugTree()); } } } |
簡単ですね。
これでリリースしてるアプリのログを見られてしまうということもなくなります。
非常に軽量ですし、Log
ではなくTimber
を使わない利点が無いですね!
plant
で渡しているのがnew DebugTree()
であるように、このTree
は自分でカスタマイズすることが出来ます。
DebugTree
はTree
クラスを継承しており、Tree
クラスは抽象クラスとして書かれています。
https://github.com/JakeWharton/timber/blob/master/timber/src/main/java/timber/log/Timber.java#L573
https://github.com/JakeWharton/timber/blob/master/timber/src/main/java/timber/log/Timber.java#L390
このへん。
自分用にTreeをカスタマイズするときはDebugTree
を継承して作ってあげるといいでしょう。
1 2 3 | public class MyDebugTree extends Timber.DebugTree { // ここで自分好みのTreeをつくる } |
試しに、Android Studioとかを使っていて、エラー落ちした際に該当コードの該当行数に飛ぶ機能がありますが、それをDebugにもつけてあげましょう。
あの機能はログメッセージにat packageName(fileName:lineNumber)
が付けばいいのでそれっぽく書きます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | public class MyDebugTree extends Timber.DebugTree { @Override protected void log(int priority, String tag, String message, Throwable t) { StackTraceElement[] thread = new Throwable().getStackTrace(); if (thread != null && thread.length >= 5) { StackTraceElement stack = thread[5]; String className = stack.getClassName(); String packageName = className.substring(0, className.lastIndexOf(".")); String fileName = stack.getFileName(); String msg = message + " at " + packageName + "(" + fileName + ":" + stack.getLineNumber() + ")"; Log.println(priority, tag ,msg); } else { Log.println(priority, tag, message); } } } |
これを3日目で書いたRecyclerViewのサンプルアプリに突っ込んで起動してみると。
こんな感じで`MainActivity.javaの42行目にクリックで飛べるようになりました。
以外と便利ですね。
ただ、結構ガバガバなTreeになってるのでごめんなさい(かなり知識不足です)。
今回はStetho同様デバッグがしやすくなるライブラリTimber
の使い方と、Treeの拡張方法をご紹介しました。
僕は間違いなくAndroidのプロジェクトを作成した直後にTimberをbuild.gradle
に追加するところから始まると思います。
Treeの拡張方法に寄っては、debug
ビルド時はDebugTree()
を使うが、release
ビルドの際は自分でTree
を拡張したMyReleaseTree()
などを定義してその中でCrashlytics
をどうこうしてクラッシュログを収集するとかいう使い方もできるでしょうか。
僕は未だにrelease
用のログ設定を作ったことが無いのでわかりませんが何れやってみたいと思います。
以上、やぎにいでした!
<< ButterKnifeを使ってソースコードのダイエットをする Stethoを使ってGoogle Chromeでデバッグをする >>
2018やぎ小屋