0

当我在 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。

4

3 回答 3

1

好的。我现在觉得有点傻。答案是这里没有任何评论。该行应该被解释为像这样隔开:

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

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

于 2011-02-18T21:11:42.717 回答
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>;
}
于 2011-02-18T20:54:21.767 回答
0

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

Activity 是您很可能不希望从项目中删除的类。在 Android 的ProGuard 页面上,它说

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

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

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

简而言之:没有错字

于 2011-02-18T20:54:59.273 回答