written: 2014-02-21 .. 2014-06-26

Android プログラミング - Log.d() の除去

実際に Android プログラミングをガシガシと行っていけるようになると、一つ新しいことをやっては、エラーが発生して、デバッグしつつ進むことになるでしょう。そうなると、ちょっと変数の値を参照したいとなると、Log.d()(もちろん、Log.v() でも Log.i() でも Log.w() でも Log.e() でも構いません。ここでは Log.d() を代表させることにします)を多用することになると思います。あ、実は Eclipse の Debug パースペクティブを使えば Log.d() を使わなくても済むのかもしれませんが、僕の場合は Log.d() の“一つ覚え”で押し通してしまっています…… orz

それで、Log.d() をデバッグ時に挿入しては、バグが除去できたら Log.d() を削除するという作業を繰り返したりするわけです。Play ストアにリリースするアプリがデバッグ情報を吐いてプログラムの内部情報が漏れるのは嫌ですから。

でもこういう作業の繰り返しだと、Log.d() を使うことに心理的抵抗を抱えるので、精神衛生上あまり良くありません。できれば、Log.d() は心置きなく気の済むまで使い、バグが解消しても、そのまま残しておきたい。

──そのような場合には、ProGuard の機能を使って「リリースバージョンのビルド時に Log.d() をゴッソリ削除する」という手があります。

検索すれば、いくつも日本語情報が引っ掛かりますが、上位で見付かるものは“賞味期限切れ”で現在は通用しないものだったので、ここに“今どき”の適切なやり方を書き留めておきます。

project.properties


proguard.config=${sdk.dir}/tools/proguard/proguard-android-optimize.txt:proguard-project.txt

デフォルトでは proguard-android.txt となっている部分を proguard-android-optimize.txt に変える。こうしないと、次の proguard-project.txt における -assumunosideeffects オプションが効かない。

proguard-project.txt


-assumenosideeffects class android.util.Log {
    public static boolean isLoggable(java.lang.String, int);
    public static int v(...);
    public static int d(...);
    public static int i(...);
    public static int w(...);
    public static int e(...);
}

上の例では、Log.v()Log.d()Log.i()Log.w()Log.e() のすべてが除外対象になっています。もし、Log.d() のみ除外したければ次のようにすればいいわけです:


-assumenosideeffects class android.util.Log {
    public static boolean isLoggable(java.lang.String, int);
    public static int d(...);
}

参考:How to config my proguard-project.txt file to remove just Logs

System.out.print() の場合

System.out.print()System.out.println() で同様のことをやりたい場合については別記事「System.out.print() の除去」を参照してください。


Android