Comment dire à ProGuard de garder tout dans un paquet particulier?

Ma demande comporte de nombreuses activités et utilise la bibliothèque native aussi. Avec la configuration par défaut ProGuard que Eclipse génère, ProGuard supprime beaucoup de choses – Méthodes OnClick, membres statiques, méthodes de rappel que ma bibliothèque native utilise … Est-ce qu'il existe un moyen simple de demander à ProGuard de NE PAS enlever tout de mon colis? En supprimant les choses, vous économisez seulement environ 2,5% de la taille de l'application, mais casse complètement ma demande. La configuration, le test et le maintien de classe par classe dans la configuration de ProGuard serait une douleur.

  • Comment supprimer le diviseur inférieur du pied de page dans une liste de lecture Android
  • Android Comment utiliser MediaScannerConnection scanFile
  • TabHost w / Activities vs. ActionBar w / Fragments
  • Texte de présentation de texte d'Android
  • Comment afficher l'icône d'apk dans mon gestionnaire de fichiers
  • Comment déclarer des variables globales dans Android?
  • Démarrez le service Android après 5 minutes
  • Instanciation des objets de base Volley
  • Calendrier Android, obtenez l'ID de l'événement
  • Vendeurs d'Appcelerator MonoTouch - Quel est le meilleur pour un développeur .NET?
  • Démarrez plusieurs ViewPropertyAnimateurs en même temps
  • Android Multitouch - Second Finger ACTION.MOVE Ignoré
  • 2 Solutions collect form web for “Comment dire à ProGuard de garder tout dans un paquet particulier?”

    Je pense que vous devez ajouter ces drapeaux au minimum (modifier pour vous les noms de paquets individuels):

    -keep class javax.** { *; } -keep class org.** { *; } -keep class twitter4j.** { *; } 

    Ajoutez également ces drapeaux:

     -dontshrink -dontoptimize -dontpreverify 

    Voici mon fichier de configuration complet: de mon Proguard.cfg:

     -dontshrink -dontoptimize -dontpreverify -verbose -dontwarn javax.management.** -dontwarn java.lang.management.** -dontwarn org.apache.log4j.** -dontwarn org.apache.commons.logging.** -dontwarn org.slf4j.** -dontwarn org.json.** -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.android.vending.licensing.ILicensingService -keep class javax.** { *; } -keep class org.** { *; } -keep class twitter4j.** { *; } -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 *; } 

    En tant que résultat final, j'ai constaté que le fait de garder tous les membres de la classe n'est pas suffisant pour le bon travail de ma demande, ni nécessaire. J'ai ajouté au fichier de configuration ceci:

     -keepclasseswithmembers class * { void onClick*(...); } -keepclasseswithmembers class * { *** *Callback(...); } 

    Le cas avec onClick * est pour toutes les méthodes que j'abonne dans Android: onClick attte dans les fichiers de mise en page .xml (je commence les noms de toutes ces méthodes avec 'onClick').

    Le cas avec * Callback est pour toutes les méthodes de rappel que j'appelle de mon code natif (via JNI). Je place un suffixe 'Callback' au nom de chaque méthode.

    J'ai également ajouté quelques lignes pour certains cas spéciaux avec des variables que j'utilise à partir du code natif, comme:

     -keep class com.myapp.mypackage.SomeMyClass { *** position; } 

    (Pour une variable avec le nom 'position' dans une classe avec le nom 'SomeMyClass' du package com.myapp.mypackage)

    Tout cela est dû au fait que ces onClick, callback etc. doivent non seulement être présents mais également conservés avec leurs noms d'origine. Les autres choses que ProGuard peut optimiser librement.

    Le cas avec les méthodes natives est également important, mais pour cela il y avait une déclaration dans le fichier Eclipse généré:

     -keepclasseswithmembernames class * { native <methods>; } 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.