こんにちは、やぎにいです。
やぎすけ 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やぎ小屋