Android: What are the recommended configurations of Proguard?

I develop Android applications and use Proguard to obfuscate the code.

I am currently using ProGuard configurations:

-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 com.android.vending.licensing.ILicensingService 

To save custom component names that are used in XML layouts:

 -keep public class custom.components.** 

To remove debug logs:

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

To avoid changing the names of methods called in the onClick layout:

 -keepclassmembers class * { public void onClickButton1(android.view.View); public void onClickButton2(android.view.View); public void onClickButton3(android.view.View); } -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 *; } 

Question (is):

Are any other tags recommended? Why and why?

Can I comment on the proguard.cfg file? I would like to have it with comments that some lines do so that other developers do not doubt why I added.

Also in proguard can I save the comment header of a file (with copyright)? If this is not the case, or is it not a good policy, where should I add copyright?

+59
android proguard
Feb 21 '11 at 16:09
source share
3 answers

Android SDK (r20 or higher)

Please check the predefined proguard.config specified in the project.properties file

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

Additional information: http://proguard.sourceforge.net/manual/examples.html#androidapplication




Android SDK (r19 or lower)

Based on my answer Enabling ProGuard in Eclipse for Android I received this shared file. I added comments to remember what each line is for. It can help people there, like this:

 -optimizationpasses 5 #When not preverifing in a case-insensitive filing system, such as Windows. Because this tool unpacks your processed jars, you should then use: -dontusemixedcaseclassnames #Specifies not to ignore non-public library classes. As of version 4.5, this is the default setting -dontskipnonpubliclibraryclasses #Preverification is irrelevant for the dex compiler and the Dalvik VM, so we can switch it off with the -dontpreverify option. -dontpreverify #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/* #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 com.android.vending.licensing.ILicensingService #To remove debug logs: -assumenosideeffects class android.util.Log { public static *** d(...); public static *** v(...); } #To avoid changing names of methods invoked on layout 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. #Uncomment if having any problem with the approach below #-keep public class custom.components.package.and.name.** #To maintain custom components names that are used on layouts XML: -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); } #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(); #} 
+77
Jun 27 '11 at 11:57
source share

For standard builds with Ant or Eclipse, the Android SDK (r20 or higher) already provides a suitable configuration referenced by the proguard.config property in the project.properties file (as Michal points out in his answer). In older versions, you should always have indicated your complete configuration, so senior advice (like the first answer) can lead to some confusion.

For custom builds, you can find the latest recommended configuration in the ProGuard > Examples > Complete Android Application Guide . The Proguard distribution also contains sample /android.pro sample files.

In particular, you can save annotations and setters in View extensions.

You can add comments after the hash symbol '#', as was done in the sample files.

+10
Feb 21 2018-11-21T00:
source share

In the project.properties project file, set the following value:

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

This will result in the latest Proguard settings from the Android SDK.

+2
Mar 20 '13 at 22:11
source share



All Articles