android eclipse proguard obfuscation

Habilitar ProGuard en Eclipse para Android



obfuscation (5)

La nueva documentación sobre ProGuard para Android dice agregar una línea al archivo default.properties en el directorio de inicio del proyecto. Sin embargo, al abrir este archivo, leo en la parte superior:

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

¿Me estoy perdiendo de algo?

Además, ¿hay alguna forma de habilitar ProGuard solo para una compilación de producción desde Eclipse (es decir, cuando se exporta el producto terminado)?


A partir de ADT 16 al menos, puede agregar la línea en project.properties y se conservará. Puede intentar cambiar la versión del SDK de destino y ver que project.properties se actualice en consecuencia, pero la línea agregada aún está allí. Entonces, creo que la advertencia está mal redactada; significa decir que la configuración en el archivo como el target se sobrescribirá con la configuración del proyecto, en lugar de viceversa.


Los cambios en la configuración de ProGuard se produjeron con la versión 17. ADGuard se actualizó de 4.4 a 4.7 y se introdujo la diferencia en la referencia del archivo de configuración. Tenga en cuenta que los proyectos existentes se mantendrían sin cambios, dejándolos sin el conjunto de reglas más nuevo incluido en esta y las versiones más nuevas de ADT. El documento pertinente para una disposición de configuración más nueva, ya mencionado anteriormente por , está disponible en: -

http://tools.android.com/recent/proguardimprovements "En segundo lugar, hemos cambiado la forma en que se manejan los archivos de configuración".


Puede agregar la línea a build.properties , como se menciona en default.properties .


solo un seguimiento porque estaba buscando lo mismo, y las respuestas aquí están desactualizadas, últimamente la configuración básica de proguard está aquí en el directorio sdk, por lo que solo tiene que poner esto en su proyecto. Propiedades:

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

si desea realizar modificaciones específicas del proyecto, cree un proguard-project.txt y cambie la línea a:

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


Android SDK (r20 o superior)

Compruebe el proguard.config predefinido en project.properties

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

Más información: http://proguard.sourceforge.net/manual/examples.html#androidapplication

En Gradle:

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

Android SDK (r19 o inferior)

Puede agregarlo a default.properties. He estado agregando manualmente sin tener un problema hasta el momento.

Si agrega la línea:

proguard.config=proguard.cfg

Como se dijo, solo usará ProGuard cuando exporte aplicaciones firmadas (Android Tools => Export Signed Application)

Si inicia el proyecto con el SDK antes de Android 2.3, no se proguard.cfg archivo proguard.cfg (al lado de default.properties como en 2.3>).

Para habilitar la creación automática, simplemente actualice el SDK de Android 2.3 y cree un nuevo proyecto con las fuentes existentes (que son las fuentes del proyecto que tiene actualmente).

proguard.cfg se proguard.cfg relleno proguard.cfg .

Si aún así, desea crearlo manualmente, esto es lo que debe contener:

-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>; }

Creo que he respondido todas las preguntas anteriores.

ACTUALIZAR :

Una explicación línea por línea:

#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(); #}

ACTUALIZACIÓN 2:

En el uso más reciente de ADT / Proguard -keepclasseswithmembers lugar de -keepclasseswithmembernames