Android:如何使用ProGuard删除SLF4J调试日志记录

时间:2014-01-08 11:01:53

标签: android logging proguard slf4j

我在Android应用程序中使用SLF4J进行日志记录。在发布版本中,我不希望显示所有调试日志,因此我尝试使用ProGuard删除它们。但日志语句仍然打印到logcat控制台,我无法弄清楚我自己做错了什么。这是我第一次使用ProGuard,所以非常感谢任何帮助!谢谢!

MainActivity.java

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MainActivity {

    private static final Logger log = LoggerFactory
        .getLogger(MainActivity.class.getSimpleName());

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        log.debug("Starting application.");
    }
}

项目proguard.txt

-assumenosideeffects class org.slf4j.Logger {
    public *** trace(...);
    public *** debug(...);
}

project-proguard.txt(扩展为第一个版本不起作用)

-assumenosideeffects class org.slf4j.Logger {
    public *** trace(...);
    public *** debug(...);
}
-assumenosideeffects interface org.slf4j.Logger {
    public *** trace(...);
    public *** debug(...);
}
-assumenosideeffects class * implements org.slf4j.Logger {
    public *** trace(...);
    public *** debug(...);
}
-assumenosideeffects class * implements org.slf4j.Logger {
    public void trace(java.lang.String);
    public void trace(java.lang.String, java.lang.Object);
    public void trace(java.lang.String, java.lang.Object, java.lang.Object);
    public void trace(java.lang.String, java.lang.Object[]);
    public void trace(java.lang.String, java.lang.Throwable);
    public void trace(org.slf4j.Marker, java.lang.String);
    public void trace(org.slf4j.Marker, java.lang.String, java.lang.Object);
    public void trace(org.slf4j.Marker, java.lang.String, java.lang.Object, java.lang.Object);
    public void trace(org.slf4j.Marker, java.lang.String, java.lang.Object[]);
    public void trace(org.slf4j.Marker, java.lang.String, java.lang.Throwable);
    public void debug(java.lang.String);
    public void debug(java.lang.String, java.lang.Object);
    public void debug(java.lang.String, java.lang.Object, java.lang.Object);
    public void debug(java.lang.String, java.lang.Object[]);
    public void debug(java.lang.String, java.lang.Throwable);
    public void debug(org.slf4j.Marker, java.lang.String);
    public void debug(org.slf4j.Marker, java.lang.String, java.lang.Object);
    public void debug(org.slf4j.Marker, java.lang.String, java.lang.Object, java.lang.Object);
    public void debug(org.slf4j.Marker, java.lang.String, java.lang.Object[]);
    public void debug(org.slf4j.Marker, java.lang.String, java.lang.Throwable);
}

logcat - 调试版本

01-08 11:27:02.105  31142-31142/com.example.android D/MainActivity﹕ Starting application.

logcat - 发布版本(不应该在那里!)

01-08 11:30:08.615  26483-26483/? D/MainActivity﹕ Starting application.

3 个答案:

答案 0 :(得分:3)

我有类似的问题,我用两个步骤解决了它。

第一步也是最重要的一步

在您的gradle文件中,您必须将proguard-android-optimize.txt的用法指定为默认文件。

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

        // With the file below, it does not work!
        //proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}

实际上,在默认的proguard-android.txt文件中,使用两个标志禁用优化:

-dontoptimize
-dontpreverify

proguard-android-optimize.txt文件未添加这些行,因此现在assumenosideeffects可以正常工作。

第二步

在您自己的proguard-rules.pro文件中,您可以添加:

-assumenosideeffects class * implements org.slf4j.Logger {
    public *** trace(...);
    public *** debug(...);
    public *** info(...);
    public *** warn(...);
    public *** error(...);
}

答案 1 :(得分:1)

你在-optimizations中指定字段/删除/写入优化吗? 如下所示:

-optimizations field/removal/writeonly

答案 2 :(得分:0)

不要试试,只需使用SLF4J的无操作版本发布版本。

releaseCompile 'org.slf4j:slf4j-api:1.7.12'
debugCompile 'org.slf4j:slf4j-android:1.7.12'