根据谷歌,我必须在发布我的Android应用程序谷歌播放之前“停用源代码中的Log方法的任何调用”。出版清单第3节节选:

在构建应用程序发布之前,请确保禁用了日志记录并禁用了调试选项。您可以通过删除源文件中对Log方法的调用来禁用日志记录。

我的开源项目很大,每次发布都要手动完成,这很痛苦。此外,删除Log行可能很棘手,例如:

if(condition)
  Log.d(LOG_TAG, "Something");
data.load();
data.show();

如果注释Log行,则该条件将应用于下一行,并且可能不会调用load()。这样的情况是否罕见到我可以决定它不应该存在?

那么,是否有更好的源代码级方法来做到这一点呢?或者是一些聪明的ProGuard语法,有效但安全地删除所有Log行?


当前回答

我喜欢使用Log。d(TAG,一些字符串,通常是字符串。格式())。

TAG总是类名

改变日志。d(TAG,——> Logd(在类的文本中

private void Logd(String str){
    if (MainClass.debug) Log.d(className, str);
}

通过这种方式,当您准备发布版本时,将MainClass.debug设置为false!

其他回答

我有一个很简单的解决办法。我使用IntelliJ进行开发,因此细节有所不同,但这个想法应该适用于所有IDE。

我选择我的源树的根,右键单击并选择“替换”。然后我选择将所有“Log.”替换为“//Log.”。这将删除所有日志语句。为了稍后将它们放回去,我重复相同的替换,但这次将所有“//Log.”替换为“Log.”。

对我来说太好了。只需记住将replace设置为区分大小写,以避免出现“Dialog.”之类的意外。为了获得额外的保证,您还可以使用“Log.”作为要搜索的字符串执行第一步。

辉煌。

这是我如何解决它在我的Kotlin项目前进入生产:

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

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

你可以试试这个简单的常规方法:

Ctrl + Shift + R

取代

Log.e(

With

// Log.e(

克里斯托弗的Proguard解决方案是最好的,但如果因为任何原因你不喜欢Proguard,这里有一个非常低技术含量的解决方案:

评论日志:

find . -name "*\.java" | xargs grep -l 'Log\.' | xargs sed -i 's/Log\./;\/\/ Log\./g'

取消日志:

find . -name "*\.java" | xargs grep -l 'Log\.' | xargs sed -i 's/;\/\/ Log\./Log\./g'

一个限制是您的日志记录指令不能跨越多行。

(在项目根的UNIX shell中执行这些行。如果使用Windows,请使用UNIX层或使用等效的Windows命令)

如果您不想弄乱额外的库或手动编辑代码,以下是我的解决方案。我创建了这个Jupyter笔记本来检查所有的java文件并注释掉所有的日志消息。虽然不完美,但它帮我完成了任务。