在Eclipse中启用ProGuard for Android

ProGuard for Android的新文档说要将一行添加到项目主目录中的default.properties文件中。 不过,在打开这个文件的时候,我读到顶部:

# This file is automatically generated by Android Tools. # Do not modify this file -- YOUR CHANGES WILL BE ERASED! 

我错过了什么吗?

另外,是否有一种方法可以使ProGuard仅用于Eclipse的生产版本(即导出成品时)?

只是一个后续,因为我正在寻找同样的东西 – 这里的答案已经过时了 – 最近基本proguardconfiguration在这里的SDK目录 – 所以你只需要把它放到你的project.properties:

 proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt 

如果要进行项目特定的修改,请创build一个proguard-project.txt并将该行更改为:

 proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt 

Android SDK(r20或更高版本)

请检查在project.properties中提到的预定义的proguard.config

 proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt 

更多信息: http : //proguard.sourceforge.net/manual/examples.html#androidapplication

在Gradle上:

 buildTypes { release { minifyEnabled true shrinkResources true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' ... } } 

Android SDK(r19或更低)

您可以将其添加到default.properties。 我已经手动添加,没有问题到目前为止。

如果您添加该行:

 proguard.config=proguard.cfg 

如上所述,在导出已签名的应用程序(Android工具=>导出已签名的应用程序)时,只会使用ProGuard,

如果您在Android 2.3之前使用SDK启动项目,则不会创buildproguard.cfg文件(如2.3>中的default.properties旁边)。

要启用它的自动创build,只需简单地更新到Android 2.3的SDK,并创build一个新的项目与现有的来源(这是你目前的项目来源)。

自动生成proguard.cfg填充将被创build。

如果仍然是,你想要手动创build它,这是它应该包含:

 -dontusemixedcaseclassnames -dontskipnonpubliclibraryclasses -dontwarn android.support.** -verbose -dontoptimize -dontpreverify -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 com.google.vending.licensing.ILicensingService -keep public class com.android.vending.licensing.ILicensingService -keep public class * extends android.support.v4.app.Fragment -keep public class * extends android.app.Fragment -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 public class * extends android.view.View { void set*(***); *** get*(); } -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } -keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; } -keepclassmembers class **.R$* { public static <fields>; } 

我想我已经回答了上面的所有问题。

更新

一行一行的解释:

 #Use 5 step of optimization #-optimizationpasses 5 #When not preverifing in a case-insensitive filing system, such as Windows. This tool will unpack your processed jars,(if using windows you should then use): -dontusemixedcaseclassnames #Specifies not to ignore non-public library classes. As of version 4.5, this is the default setting -dontskipnonpubliclibraryclasses # Optimization is turned off by default. Dex does not like code run # through the ProGuard optimize and preverify steps (and performs some # of these optimizations on its own). -dontoptimize -dontpreverify -dontwarn android.support.** #Specifies to write out some more information during processing. If the program terminates with an exception, this option will print out the entire stack trace, instead of just the exception message. -verbose #The -optimizations option disables some arithmetic simplifications that Dalvik 1.0 and 1.5 can't handle. Note that the Dalvik VM also can't handle aggressive overloading (of static fields). #To understand or change this check http://proguard.sourceforge.net/index.html#/manual/optimizations.html #-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* # Note that if you want to enable optimization, you cannot just # include optimization flags in your own project configuration file; # instead you will need to point to the # "proguard-android-optimize.txt" file instead of this one from your # project.properties file. #To repackage classes on a single package #-repackageclasses '' #Uncomment if using annotations to keep them. #-keepattributes *Annotation* #Keep classes that are referenced on the AndroidManifest -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.google.vending.licensing.ILicensingService -keep public class com.android.vending.licensing.ILicensingService #Compatibility library -keep public class * extends android.support.v4.app.Fragment -keep public class * extends android.app.Fragment #To maintain custom components names that are used on layouts XML. #Uncomment if having any problem with the approach below #-keep public class custom.components.package.and.name.** # keep setters in Views so that animations can still work. # see http://proguard.sourceforge.net/manual/examples.html#beans -keepclassmembers public class * extends android.view.View { void set*(***); *** get*(); } #To remove debug logs: -assumenosideeffects class android.util.Log { public static *** d(...); public static *** v(...); public static *** w(...); } #To avoid changing names of methods invoked on layout's onClick. # Uncomment and add specific method names if using onClick on layouts #-keepclassmembers class * { # public void onClickButton(android.view.View); #} #Maintain java native methods -keepclasseswithmembernames class * { native <methods>; } #To maintain custom components names that are used on layouts XML: -keep public class * extends android.view.View { public <init>(android.content.Context); } -keep public class * extends android.view.View { public <init>(android.content.Context, android.util.AttributeSet); } -keep public class * extends android.view.View { public <init>(android.content.Context, android.util.AttributeSet, int); } #Maintain enums -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } #To keep parcelable classes (to serialize - deserialize objects to sent through Intents) -keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; } #Keep the R -keepclassmembers class **.R$* { public static <fields>; } ###### ADDITIONAL OPTIONS NOT USED NORMALLY #To keep callback calls. Uncomment if using any #http://proguard.sourceforge.net/index.html#/manual/examples.html#callback #-keep class mypackage.MyCallbackClass { # void myCallbackMethod(java.lang.String); #} #Uncomment if using Serializable #-keepclassmembers class * implements java.io.Serializable { # private static final java.io.ObjectStreamField[] serialPersistentFields; # private void writeObject(java.io.ObjectOutputStream); # private void readObject(java.io.ObjectInputStream); # java.lang.Object writeReplace(); # java.lang.Object readResolve(); #} 

更新2:

在最近的ADT / Proguard使用-keepclasseswithmembers而不是-keepclasseswithmembernames

至less在ADT 16中,你确实可以在project.properties添加该行,并将其保留。 您可以尝试更改目标SDK版本,并看到project.properties已相应更新,但添加的行仍然存在。 所以,我认为这个警告措辞不好。 这意味着文件中的设置(如target将被项目设置覆盖,而反之亦然。

ProGuardconfiguration的更改是在ADT版本17的基础上进行的.ProGuard从4.4更新到4.7,并引入了configuration文件参考注释的差异。 请注意,现有的项目将保持不变,使他们没有包含在这个和更新的ADT版本中的新的规则集。 上面ligi已经提到的新configuration安排的相关文档可在以下url获得:

http://tools.android.com/recent/proguardimprovements “其次,我们改变了处理configuration文件的方式。”

您可以将该行添加到build.properties ,如default.properties