2012-02-17 77 views
4

当使用Ant我可以看到详细的Proguard的输出编译我的应用程序,我有事情设置删除日志报表(见下文),但是当我运行该版本的apk所有的日志报表一试图消除在那里。Proguard的未删除记录呼叫

我有2个项目,其中的每一个包括一个共同的项目。 2个主要项目和公共项目都有一个proguard.cfg文件,所有这些文件都包含用于删除日志语句的片段。

有什么,我失踪?

**我所有的日志语句是Log.d(...)

proguard.cfg

-optimizationpasses 5 
-dontusemixedcaseclassnames 
-dontskipnonpubliclibraryclasses 
-dontpreverify 
-verbose 
-dontobfuscate 
-forceprocessing 
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* 

-keep public class * extends android.app.Activity 
-keep public class * extends android.app.Application 
-keep public class * extends android.app.Service 
-keep public class * extends android.content.BroadcastReceiver 
-keep public class * extends android.content.ContentProvider 
-keep public class * extends android.app.backup.BackupAgentHelper 
-keep public class * extends android.preference.Preference 
-keep public class com.android.vending.licensing.ILicensingService 

-keepclasseswithmembernames class * { 
    native <methods>; 
} 

-keepclasseswithmembers class * { 
    public <init>(android.content.Context, android.util.AttributeSet); 
} 

-keepclasseswithmembers class * { 
    public <init>(android.content.Context, android.util.AttributeSet, int); 
} 

-keepclassmembers class * extends android.app.Activity { 
    public void *(android.view.View); 
} 

-keepclassmembers enum * { 
    public static **[] values(); 
    public static ** valueOf(java.lang.String); 
} 

-keep class * implements android.os.Parcelable { 
    public static final android.os.Parcelable$Creator *; 
} 

-assumenosideeffects class android.util.Log { 
    public static *** d(...); 
    public static *** v(...); 
} 
+0

只是双重检查,因为你有我担心。我确实没有看到我的Log.d o/p用于Ant版本构建。我正在过滤Logcat o/p的PID,我只看到dalvik GC_CONCUURRENT的东西 – NickT 2012-02-17 22:27:47

+0

我有这个问题。我运行Proguard 4.4 – ron 2012-05-05 12:46:34

回答

0

而不是删除或注释掉全部采用亲卫队则可以将日志信息做这样的事情。创建一个实用工具类,基本上是围绕着Android日志系统的包装

public class Util{ 

    public static boolean showLogs = true; 
    public static String myTag = 'My Tag'; 

    public static void logD(String message){ 
     if (Util.showLogs)  
      Log.d(myTag, message); 
    } 
} 

以前我编译我的分配程序,我只需拨打showLogs = true;,然后将所有日志消息supressed

您可以轻松地扩展这个类允许您指定标记并生成更多的调试消息。

+0

我不得不在这里不同意。我依靠一个相同的assumenosideeffects语句从我的项目中删除日志行,它的工作原理 - 我没有在Ant发布版本中获得日志o/p。我proguard.cfg而这其中的唯一区别是我只有一个项目,我不声明或-dontobfuscate -forceprocessing – NickT 2012-02-17 21:38:19

+0

@NickT:我删除你提到你不要在你的ProGuard有两个项目。 cfg文件,但我仍然看到日志语句。值得一试。 – chris 2012-02-17 21:48:16

+1

@slayton:根据Proguard文档,“assumenosideeffects”将删除对似乎没有副作用与类规范匹配的方法的调用。 http://proguard.sourceforge.net/index.html#manual/usage.html – chris 2012-02-17 21:54:40

1

你不能没有Proguard的优化使用assumenosideeffects

+0

优化已打开 – 2012-12-11 08:24:37

2

这里您proguard的文件是好的,但有一个细节,你可能会丢失。

在你gradle这个文件,你可能有这样的事情:

buildTypes { 
    release { 
     minifyEnabled true 

     proguardFiles getDefaultProguardFile('proguard-android.txt), 'proguard-rules.pro' 
    } 
} 

检查getDefaultProguardFile('proguard-android'),所以如果你打算去优化它,你应该将其更改为getDefaultProguardFile('proguard-android-optimize.txt')

我花了一些时间来实现它,看到你的问题,但仍然没能消除对我的代码我Log电话。所以我发现这个链接解释说需要更改为优化文件,以便能够优化。

https://developer.android.com/tools/help/proguard.html#enabling-gradle