Habilitación de ProGuard en Eclipse para Android

112

La nueva documentación de ProGuard para Android dice que agregue una línea al archivo default.properties en el directorio de inicio del proyecto. Sin embargo, al abrir este archivo, leí 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 de Eclipse (es decir, al exportar el producto terminado)?

Ted Hopp
fuente
Estoy de acuerdo con su punto de que default.properties se regenerará cada vez. Por lo tanto, es una pregunta interesante
Aman Alam
Debe aceptar la respuesta de ligi, NeTeInStEiN ya no se mantiene y confunde al nuevo usuario.
Gaurav Agarwal
2
Cambié la respuesta para que esté actualizada.
neteinstein
La respuesta de Ligi es aún más clara que la de Neteinstein, para instalaciones más nuevas. Lo más importante es que muestra proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt si necesita configuraciones personalizadas para un proyecto específico.
ToolmakerSteve

Respuestas:

76

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 
ligi
fuente
Mirando mi proyecto (en r20, pero generado en una versión anterior), parece usar una combinación de los métodos anteriores:
Tom
26
Todavía es bastante confuso porque project.properties también dice # Este archivo es generado automáticamente por Android Tools. # No modifique este archivo - ¡SUS CAMBIOS SERÁN BORRADOS!
Todd Painton
12
"solo tienes que poner esto en tu proyecto.propiedades". Esta línea estará allí en project.properties pero comentada por defecto. Simplemente descomentarlo.
Braj
113

SDK de Android (r20 o superior)

Compruebe el proguard.config predefinido al que se hace referencia 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'

            ...
  }
 }

Aquí puede consultar un archivo "predeterminado" de proguard que sigo actualizando: https://medium.com/code-procedure-and-rants/android-my-standard-proguard-ffeceaf65521


SDK de Android (r19 o inferior)

Puede agregarlo a default.properties. He estado agregando manualmente sin tener ningún problema hasta ahora.

Si agrega la línea:

proguard.config=proguard.cfg

Como se dijo, solo usará ProGuard al exportar la aplicación firmada (Herramientas de Android => Exportar aplicación firmada)

Si inicia el proyecto con el SDK antes de Android 2.3, el proguard.cfgarchivo no se creará (junto a default.propertiescomo en 2.3>).

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

Automáticamente se proguard.cfgcreará el relleno.

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 en -keepclasseswithmemberslugar de-keepclasseswithmembernames

Neteinstein
fuente
1
@NeTeInStEiN Actualicé al SDK 16 (Android 4.x), agregué la línea proguard.config=proguard.cfgpero el archivo proguard.cfg no se ve por ninguna parte ... A pesar de hacer la exportación varias veces, reiniciar Eclipse, etc. ¿Alguna idea de por qué? y como arreglar esto? Gracias.
Bill The Ape
1
@NeTeInStEiN No importa. Resulta que debería haber creado uno yo mismo.
Bill The Ape
@NeTeInStEiN Cuando creo un proyecto, aunque su destino de compilación es Android1.1, encontré el archivo proguard.cfg que se crea automáticamente.
hasanghaforian
1
@NeTeInStEiN Increíble hombre ... Realmente aprecio su tiempo y esfuerzo, ¡¡Salud !!
swiftBoy
1
@ user31231234124 Agregó la información que solicitó.
Neteinstein
10

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

usethe4ce
fuente
4

Los cambios en la configuración de ProGuard se produjeron con la versión 17 de ADT. ProGuard se actualizó de 4.4 a 4.7 y se introdujo la diferencia en la referencia del archivo de configuración que ya se menciona. Tenga en cuenta que los proyectos existentes permanecerán sin cambios, dejándolos sin el conjunto de reglas más nuevo incluido en esta y las versiones más recientes de ADT. Documentos relevantes para arreglos de configuración más nuevos, ya mencionados por ligi arriba, están disponibles en: -

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

phillxnet
fuente
3

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

Eric Lafortune
fuente
¿Dónde está build.properties? ¿O necesito crearlo?
Ted Hopp
Está en el directorio del proyecto, junto a default.properties (al menos con Android SDK r8).
Eric Lafortune
Ahí es donde lo estaba buscando, pero no hay tal archivo en ninguno de mis proyectos. Estoy usando el último complemento y acabo de crear un proyecto de nivel 8 para verificar esto.
Ted Hopp
4
Resulta que el uso de build.properties solo funciona para compilaciones de Ant, no para compilaciones de Eclipse.
Ted Hopp
¿Dónde está build.properties en 2016 android studio buld?