我在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.
答案 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'