默认proguard.cfg出错?

时间:2011-02-18 20:28:11

标签: android eclipse proguard

当我在Eclipse中创建一个新的Android项目时,会创建以下默认的proguard.cfg文件:

-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-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>;
}

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

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

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

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

请注意,-optimizations行会注释掉文件的其余部分。我想知道这是故意的还是错误的,并且该行的最后两个字符应该颠倒过来:

-optimizations !code/simplification/arithmetic,!field/*,!class/merging*/

我正在使用ADT插件9.0和Eclipse 3.6.1。

3 个答案:

答案 0 :(得分:1)

好。我现在感觉有点愚蠢。答案是这里没有任何评论。这条线应该被解释为它的间隔是这样的:

-optimizations !code/simplification/arithmetic,
               !field/*,
               !class/merging/*

*是一个通配符,在这种情况下论坛完成的语法突出显示是错误的。

答案 1 :(得分:0)

你确定你没有意外地这样做吗?

我刚创建了一个虚拟项目并最终得到了这个。我试着删除那一行,看看是否有效。

-injars      bin/classes
-injars      libs
-outjars     bin/classes-processed.jar
-libraryjars /usr/local/java/android-sdk/platforms/android-9/android.jar

-dontpreverify
-repackageclasses ''
-allowaccessmodification
-optimizations !code/simplification/arithmetic
-keepattributes *Annotation*

-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.view.View {
    public <init>(android.content.Context);
    public <init>(android.content.Context, android.util.AttributeSet);
    public <init>(android.content.Context, android.util.AttributeSet, int);
    public void set*(...);
}

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

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

-keepclassmembers class * implements android.os.Parcelable {
    static android.os.Parcelable$Creator CREATOR;
}

-keepclassmembers class **.R$* {
    public static <fields>;
}

答案 2 :(得分:0)

keep-statements用于防止proguard在收缩步骤中删除类或类成员,以及在混淆步骤中重命名它们。

活动是一个您很可能不希望从项目中退出的类。在Android的ProGuard page上,它说

  

在某些情况下,proguard.cfg文件中的默认配置就足够了。但是,ProGuard很难正确分析许多情况,它可能会删除它认为未使用的代码,但您的应用程序实际需要。一些例子包括:

  • 列出项目仅在AndroidManifest.xml文件中引用的类

由于保留部分在默认配置中被注释掉,我认为它是有意的,因为out评论 -keep Activities 行会阻止proguard消除任何活动。

简而言之:没有拼写错误