65 votes

Android: Quelles sont les configurations recommandées pour Proguard?

Je suis le développement d'applications pour Android et à l'aide de Proguard pour obscurcir le code.

Actuellement, je suis en utilisant 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

Pour maintenir les composants personnalisés noms qui sont utilisés sur les modèles XML:

-keep public class custom.components.**

Pour supprimer les journaux de débogage:

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

Pour éviter de changer les noms de méthodes invoquées sur la mise en page du onClick:

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

La question est (sont):

D'autres balises recommandé? Pourquoi et pour quoi?

Il est possible de faire un commentaire sur un proguard.fichier cfg? Je voudrais le faire avec des commentaires pour que certaines lignes sont en train de faire afin que les autres développeurs de ne pas avoir des doutes sur pourquoi ai-je ajouté.

Également dans proguard, est-il possible de maintenir le commentaire d'en-tête d'un fichier (avec le droit d'auteur)? Si elle ne l'est pas, ou ce n'est pas une bonne politique où dois-je ajouter le droit d'auteur?

83voto

NeTeInStEiN Points 7331

Android SDK (r20 ou supérieur)

Veuillez vérifier les prédéfinis proguard.config visées dans le projet.propriétés

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

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


Android SDK (r19 ou moins)

Basé sur de ma réponse, Permettant ProGuard dans Eclipse pour Android j'ai fini avec ce fichier générique. J'ai ajouté des commentaires pour se rappeler ce que chaque ligne est pour. Il peut aider les gens là-bas il est donc ici:

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

10voto

Eric Lafortune Points 17656

Pour les versions standard avec Ant ou Eclipse, le SDK Android (r20 ou plus), prévoit déjà une configuration adaptée, référencé par la propriété proguard.config dans le fichier de projet.propriétés (comme Michal le souligne dans sa réponse). Dans les anciennes versions, vous avez toujours eu pour spécifier votre propre configuration complète, alors âgé de conseils (comme la première réponse) peut conduire à une certaine confusion.

Pour personnalisé, vous pouvez trouver la dernière configuration recommandée dans le ProGuard manuel > Exemples > Une complète application Android. Le Proguard de distribution contient également un exemple de fichier examples/android.pro

Notamment, vous souhaiterez peut-être conserver les annotations et les organismes de normalisation extension de la Vue.

Vous pouvez ajouter des commentaires après un dièse '#', comme largement fait dans les fichiers d'exemples.

3voto

Michal Points 345

Dans votre fichier de projet appelé projet.définir les propriétés de valeur suivante:

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

Cela va prendre la dernière version de Proguard paramètres du kit SDK d'Android.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X