web-dev-qa-db-fra.com

Android ProGuard: optimisations les plus agressives

Android officiel documentation proguard montre deux optimisations principales:

  • définissez minifyEnabled sur true
  • utilisation proguard-Android-optimize.txt au lieu de proguard-Android.txt

Ces deux paramètres sont-ils les plus agressifs possibles?

J'écris une bibliothèque Android Android et je dois m'assurer que lorsque les gens utilisent ma bibliothèque que mon code ne casse pas. (Je sais qu'il y a des règles que je peux mettre dans ma bibliothèque pour contrer la configuration proguard) défini sur l'application qui utilise la bibliothèque, mais je ne veux pas le faire si je ne le dois pas.)

59
lf215

N'oubliez pas que la meilleure configuration ProGuard est une configuration avec un minimum d'exceptions. Sous les exceptions que je comprends:

 -keepclassmembers class * extends Android.content.Context {
    public void *(Android.view.View);
    public void *(Android.view.MenuItem);
 }

Parcourons proguard-Android-Optimize.txt et examinons les options d'optimisation/d'obscurcissement.

Pour une description détaillée des options ProGuard que j'utilise this

-optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/*This - liste des optimisations possibles,! signifie négation, donc cette optimisation n'est pas utilisée

-optimizationpasses 5 Spécifie le nombre de passes d'optimisation à effectuer. Par défaut, une seule passe est effectuée. Plusieurs passes peuvent entraîner de nouvelles améliorations. Si aucune amélioration n'est trouvée après un passage d'optimisation, l'optimisation est terminée. Applicable uniquement lors de l'optimisation.
Utilisation: [~ # ~] ok [~ # ~], et il semble que 5 passes par défaut suffisent

-allowaccessmodification Spécifie que les modificateurs d'accès des classes et des membres de classe peuvent être étendus pendant le traitement. Cela peut améliorer les résultats de l'étape d'optimisation.
Utilisation: [~ # ~] ok [~ # ~], oui ressemble à améliorer l'optimisation

-dontpreverify Lors du ciblage d'Android, la pré-prolifération n'est pas nécessaire, donc ne prévérifiez pas la désactiver pour réduire un peu le temps de traitement. Mais cette option n'a pas d'impact sur l'incassabilité du code.
Utilisation: [~ # ~] ok [~ # ~], juste un peu pour réduire le temps de traitement

-dontusemixedcaseclassnames Spécifie de ne pas générer de noms de classe à casse mixte lors de l'obscurcissement. Par défaut, les noms de classe obscurcis peuvent contenir un mélange de caractères majuscules et de caractères minuscules. Cela crée des pots parfaitement acceptables et utilisables.
Utilisation: [~ # ~] discutable [~ # ~], je ne trouve pas la raison exacte pour laquelle cette option a été ajoutée, mais ressemble à changer le nom de la classe de abcdef à AbSdEf ne rend pas le code incassable

-dontskipnonpubliclibraryclasses Spécifie de ne pas ignorer les classes de bibliothèque non publiques. Depuis la version 4.5, il s'agit du paramètre par défaut.
Utilisation: [~ # ~] ok [~ # ~], très utile

Les options suivantes ne sont pas incluses pour proguard-Android-Optimize.txt:

-mergeinterfacesaggressively Spécifie que les interfaces peuvent être fusionnées, même si leurs classes d'implémentation n'implémentent pas toutes les méthodes d'interface ... la définition de cette option peut réduire les performances du code traité sur certaines machines virtuelles Java
Utilisation: [~ # ~] mauvais [~ # ~], l'air dangereux pour Android, ne pas inclus dans la configuration, résumé de l'interdiction de classe/fusion/dans les optimisations

-overloadaggressively Spécifie d'appliquer une surcharge agressive lors de l'obscurcissement. Plusieurs champs et méthodes peuvent alors obtenir les mêmes noms, tant que leurs arguments et types de retour sont différents, comme requis par Java bytecode (pas seulement leurs arguments, comme requis par Java)
Utilisation: [~ # ~] mauvaise [~ # ~], Dalvik de Google VM ne peut pas gérer les champs statiques surchargés.

-repackageclasses '' Spécifie de reconditionner tous les fichiers de classe qui sont renommés, en les déplaçant dans le package donné. Sans argument ou avec une chaîne vide (''), le package est complètement supprimé. Cette option remplace l'option -flattenpackagehierarchy.
Utilisation: [~ # ~] ok [~ # ~], utilisé par Google, alors il semble que nous ayons au moins trouvé l'option que nous pouvons ajouter à notre configuration

Je n'en connais donc qu'un de plus utile pour l'obscurcissement et l'option non dangereuse:
-repackageclasses ''

Veuillez également noter le décodage des traces de pile. ProGuard supprime également le nom de fichier et les numéros de ligne de la trace de pile. Cela rend la recherche d'erreurs très compliquée. Vous pouvez conserver les numéros de ligne en ajoutant le code suivant à votre configuration:

-renamesourcefileattribute SourceFile 
-keepattributes SourceFile,LineNumberTable

Cela conservera les numéros de ligne mais remplacera le nom de fichier dans le stacktrace par "SourceFile".

N'oubliez pas non plus que ProGuard semble vulnérable car il ne crypte pas les ressources de la chaîne , alors pensez à utiliser DexGuard ou cryptez les chaînes importantes (comme les jetons, les URL) se.

54
AndreyICE

Selon le commentaire du fichier d'optimisation, les optimisations introduisent certains risques et si elles sont utilisées, l'application doit être testée en profondeur. D'après mon expérience, il est nécessaire de désactiver le code/simplification/avancé, car cela a provoqué des variables locales finales qui ont été initialisées en dehors d'un lambda étant NULL à l'intérieur du lambda. C'était très difficile à déboguer et à trouver. Par conséquent, mes paramètres d'optimisation sont les suivants:

-optimisations! code/simplification/cast,! code/simplification/avancé,! champ/*,! classe/fusion/*,! méthode/suppression/paramètre,! méthode/propagation/paramètre

Notez que le code/simplification/arithmétique doit également être désactivé si vous ciblez Android 2.0 et inférieur (ce qui est très peu probable). En plus de cela, j'ai également dû désactiver méthode/suppression/paramètre et méthode/propagation/paramètre, car ceux-ci activent implicitement le code/simplification/avancé (voir manuel ProGuard pour plus d'informations).

7