2014-01-08 73 views
4

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

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(...); 
} 

项目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

您的长期配置中唯一对我有用的部分是引用该接口的部分。 –

回答

1

你指定字段/移除/ -optimizations内只写optimiazation? 类似如下:

-optimizations field/removal/writeonly

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(...); 
} 
0

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

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

无操作版本的问题是日志及其字符串内容仍处于最终二进制文件中。没有打印任何内容,但出于安全原因,有时最好完全删除日志行:例如,某人可以尝试从最终的二进制文件中提取所有字符串。 无论如何,这是真的,它回答了这个问题,因为它只是关于不打印日志。 –

+0

如果有人正在反编译apk,我会更担心什么不是日志:P –

+0

用nop替换并不是安全的..删除日志的原因是日志能够提供关于应用程序行为的很多信息/ lib以及许多混淆变量真的是什么。彻底删除线是至关重要的。 –

相关问题