当我在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。
答案 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很难正确分析许多情况,它可能会删除它认为未使用的代码,但您的应用程序实际需要。一些例子包括:
由于保留部分在默认配置中被注释掉,我认为它是有意的,因为out评论 -keep Activities 行会阻止proguard消除任何活动。
简而言之:没有拼写错误