2014/08/31

[android]Log.d()はそのまま出る仕様なんだ!

いやあ、知らないって事は恐ろしいですな。

AndroidManifest.xmlに、確かdebaggableとかいう設定があったと思う。
だから私は「これをfalseにすれば、デバッグ出力のLog.d()は出力されないんだろう」と何の根拠もなく思い込んでいた。

偶然、「ログをリリース時にオフにする方法」みたいな記事があったので見てみると、全然そんな仕様じゃないことがわかった。
debaggableじゃなくて他の設定だろうと思って調べたけど、どうもそうではない模様。
つまり、Log.d()はそのまま出るんだ!


Javaのところは、ここ。
最後はprintln_native()が呼ばれている。
https://android.googlesource.com/platform/frameworks/base/+/android-4.3_r2.1/core/java/android/util/Log.java

 

Nativeは、これでよいのかな。
https://github.com/android/platform_frameworks_base/blob/master/core/jni/android_util_Log.cpp

__android_log_buf_write()が呼ばれるようだ。
もう、誰にも止められない・・・

JNIなんだな、ログって。
けっこう重たい動きになるんだ。


なんか、一括して、しかもバイナリレベルで呼び出されないくらいのことをしてくれんかと思って探すと、ProGuardで消すというのが一番多かった。

proguard-rules.proに、

-assumenosideeffects class android.util.Log {
    public static int v(...);
    public static int d(...);
    public static int i(...);
    public static int w(...);
    public static int e(...);
    public static int wtf(...);
}

みたいなのを書いて、build.gradleに、

buildTypes {
    release {
        runProguard true
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    }
}

みたいな変更をして、Signed APKを作るようだ。 

2 件のコメント:

  1. 僕はこういうクラス作ってリリースビルド時のログ消してますねー
    https://github.com/napplecomputer/toStarAutoReply/blob/master/app/src/main/java/co/natsuhi/tostarautoreply/utils/LogUtil.java

    返信削除
    返信
    1. なるほど、debaggableの設定を見に行って決めるのですね。
      ProGuardだと影響が全体に及ぶので、自作の部分だけにしたいなら自作で用意した方がよいですね。
      技として覚えておきますー

      削除

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。