Activation de ProGuard dans Eclipse pour Android

112

La nouvelle documentation sur ProGuard pour Android dit d'ajouter une ligne au fichier default.properties dans le répertoire de base du projet. Cependant, en ouvrant ce fichier, j'ai lu en haut:

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

Est-ce que je manque quelque chose?

En outre, existe-t-il un moyen d'activer ProGuard uniquement pour une version de production à partir d'Eclipse (c'est-à-dire lors de l'exportation du produit fini)?

Ted Hopp
la source
Je suis d'accord avec vous pour dire que default.properties sera régénéré à chaque fois. Ainsi, c'est une question intéressante
Aman Alam
Vous devriez accepter la réponse de ligi, NeTeInStEiN ne tient plus et confond le nouvel utilisateur.
Gaurav Agarwal
2
J'ai changé la réponse pour être à jour.
neteinstein
La réponse de ligi est encore plus claire que celle de neteinstein, pour les installations plus récentes. Plus important encore, cela indique proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt si vous avez besoin de paramètres personnalisés pour un projet spécifique.
ToolmakerSteve

Réponses:

76

juste un suivi parce que je cherchais la même chose - et les réponses ici sont obsolètes - dernièrement, la configuration de base de proguard est ici dans le répertoire sdk - il vous suffit donc de la mettre dans votre project.properties:

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

si vous souhaitez apporter des modifications spécifiques au projet, créez un proguard-project.txt et changez la ligne en:

proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt 
ligi
la source
En regardant mon projet (en r20, mais généré dans une version précédente), il semble utiliser un mélange des méthodes ci-dessus:
Tom
26
Encore assez déroutant car le project.properties indique également # Ce fichier est automatiquement généré par Android Tools. # Ne modifiez pas ce fichier - VOS CHANGEMENTS SERONT EFFACÉS!
Todd Painton
12
"il vous suffit de le mettre dans votre project.properties". Cette ligne sera là dans project.properties mais commentée par défaut. Annulez simplement le commentaire.
Braj
113

SDK Android (r20 ou supérieur)

Veuillez vérifier le proguard.config prédéfini référencé dans project.properties

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

Plus d'infos: http://proguard.sourceforge.net/manual/examples.html#androidapplication

Sur Gradle:

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

            ...
  }
 }

Ici vous pouvez vérifier un fichier proguard "default" que je continue de mettre à jour: https://medium.com/code-procedure-and-rants/android-my-standard-proguard-ffeceaf65521


SDK Android (r19 ou inférieur)

Vous pouvez l'ajouter à default.properties. J'ai ajouté manuellement sans avoir de problème jusqu'à présent.

Si vous ajoutez la ligne:

proguard.config=proguard.cfg

Comme dit, il n'utilisera ProGuard que lors de l'exportation d'une application signée (Android Tools => Export Signed Application)

Si vous démarrez le projet avec le SDK avant Android 2.3, le proguard.cfgfichier ne sera pas créé (à côté de default.propertiescomme dans 2.3>).

Pour permettre la création automatique de celui-ci, il suffit de mettre à jour le SDK d'Android 2.3 et de créer un nouveau projet avec les sources existantes (qui sont les sources du projet que vous avez actuellement).

Le proguard.cfgremplissage sera automatiquement créé.

Si toujours, vous souhaitez le créer manuellement, voici ce qu'il devrait contenir:

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

Je pense avoir répondu à toutes les questions ci-dessus.

MISE À JOUR :

Une explication ligne par ligne:

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

MISE À JOUR 2:

Dans la dernière utilisation d'ADT / Proguard -keepclasseswithmembersau lieu de-keepclasseswithmembernames

Neteinstein
la source
1
@NeTeInStEiN J'ai mis à jour le SDK 16 (Android 4.x), ajouté la ligne proguard.config=proguard.cfgmais le fichier proguard.cfg est introuvable ... Malgré l'exportation plusieurs fois, le redémarrage d'Eclipse, etc. Une idée pourquoi? et comment résoudre ce problème? Merci.
Bill The Ape
1
@NeTeInStEiN Qu'importe. Il s'avère que j'aurais dû en créer un moi-même.
Bill The Ape
@NeTeInStEiN Lorsque je crée un projet, bien que sa cible de construction soit Android1.1, j'ai trouvé le fichier proguard.cfg qui est automatiquement créé.
hasanghaforian le
1
@NeTeInStEiN Un homme incroyable ... J'apprécie vraiment votre temps et vos efforts, Cheers !!
swiftBoy
1
@ user31231234124 Ajout des informations que vous avez demandées.
neteinstein
10

À partir de ADT 16 au moins, vous pouvez en effet ajouter la ligne project.properties, et elle sera conservée. Vous pouvez essayer de changer la version du SDK cible et voir qu'elle project.propertiesest mise à jour en conséquence, mais la ligne ajoutée est toujours là. Donc, je pense que l'avertissement est simplement mal formulé; cela signifie que les paramètres du fichier tels que targetseront remplacés par les paramètres du projet, plutôt que l'inverse.

usethe4ce
la source
4

Les modifications apportées à la configuration de ProGuard sont survenues avec la version 17 d'ADT. ProGuard a été mis à jour de 4.4 à 4.7 et la différence dans la référence du fichier de configuration déjà notée a été introduite. Notez que les projets existants resteraient inchangés, les laissant sans le jeu de règles plus récent inclus dans cette version et les versions plus récentes d'ADT. La documentation pertinente pour la configuration plus récente, déjà notée par ligi ci-dessus, est disponible à: -

http://tools.android.com/recent/proguardimprovements "Deuxièmement, nous avons changé la façon dont les fichiers de configuration sont gérés."

phillxnet
la source
3

Vous pouvez ajouter la ligne à build.properties, comme indiqué dans default.properties.

Eric Lafortune
la source
Où est build.properties? Ou dois-je le créer?
Ted Hopp
Il se trouve dans le répertoire du projet, à côté de default.properties (au moins avec Android SDK r8).
Eric Lafortune
C'est là que je le cherchais, mais il n'y a pas de tel fichier dans aucun de mes projets. J'utilise le dernier plugin et je viens de créer un projet de niveau 8 pour vérifier cela.
Ted Hopp
4
Il s'avère que l'utilisation de build.properties ne fonctionne que pour les versions Ant, pas pour les versions Eclipse.
Ted Hopp
où est build.properties dans le buld de studio android 2016?