Je fais face à un problème vraiment bizarre depuis des jours maintenant ...
J'ai une application Gradle avec deux modules, un module principal et un module de bibliothèque.
voici le premier problème: même si minifyEnabled est faux dans la bibliothèque, il est obscurci. cela n'a aucun effet et semble dépendre des paramètres du module principal. J'utilise proguard depuis un certain temps maintenant et je n'ai jamais connu un tel comportement du tout.
De plus, le proguard-rules.pro de la bibliothèque semble être complètement ignoré. Peu importe ce que je déclare ici, il n'est pas utilisé et le résultat est toujours le même (toujours décompilé pour afficher le résultat). Il est obscurci avec les paramètres par défaut.
J'ai utilisé un nom de fichier proguard non valide pour voir si le fichier est même touché, et en effet il y a des erreurs avec le mauvais nom et il se plaint également d'erreurs de syntaxe dans le fichier proguard ...
Je ne sais pas si cela est en quelque sorte lié à une mise à jour de Android Studio, car il m'a également recommandé d'utiliser "minifyEnabled" au lieu de "runProguard".
Comment puis-je gérer proguard pour utiliser aussi proguard-rules.pro de la bibliothèque?
Éditer:
J'ai fait un exemple de projet pour clarifier mon problème
La configuration proguard de ma bibliothèque
Le gradle de ma bibliothèque:
Et enfin le résultat je reçois toujours. Peu importe ce que j'exclus/inclue dans la configuration proguard
Comme vous pouvez le voir, les règles de proguard fonctionnent assez bien sur le module principal. Il fait ce qu'il faut. Mais cela obscurcit toujours complètement ma bibliothèque en a.a ....
Il a également supprimé complètement l'activité de la bibliothèque, ce qui ne devrait pas du tout se produire
Vous ne devez généralement pas activer ProGuard dans le projet de bibliothèque. ProGuard traite l'application et la bibliothèque ensemble dans le projet d'application, ce qui est l'approche la plus efficace.
Dans le projet de bibliothèque, vous pouvez spécifier n'importe quelle configuration ProGuard spécifique à la bibliothèque dans build.gradle, par exemple:
defaultConfig {
consumerProguardFiles 'proguard-rules.txt'
}
Ce fichier est ensuite empaqueté dans la bibliothèque aar comme proguard.txt
et appliqué automatiquement dans le projet d'application.
Si vous faites activez ProGuard dans un projet de bibliothèque (peut-être parce que vous souhaitez distribuer la bibliothèque), vous devez également ajouter la configuration appropriée pour le traitement de la bibliothèque. La version Android Gradle ne semble pas le faire automatiquement. Vous pouvez:
Android-sdk/tools/proguard/examples/library.pro
à proguard-project.txt
dans votre projet de bibliothèque.-injars
, -outjars
, -libraryjars
, -printmapping
du fichier. Le processus de construction Gradle fournit automatiquement ces options.L'activation/désactivation de ProGuard indépendamment pour le projet de bibliothèque et pour le projet d'application fonctionne très bien pour moi.
Étonnamment, la réponse d'Eric fonctionne aussi pour moi!
Bien sûr, Eric sait de quoi il parle, mais j'essaie [de temps en temps] de trouver un moyen propre de le faire automatiquement en gradle depuis plus d'un an sans chance jusqu'à ce que je trouve ce post aujourd'hui.
J'ai combiné quelques autres threads SO et je suis arrivé avec cette solution qui fonctionne, qui pourrait également être simplifiée. Les étapes 1 à 4 sont facultatives, mais jusqu'à présent cela ne semble pas avoir mal.
/Android-sdk/tools/proguard5.2
/Android-sdk/tools/proguard
En ... /Android-sdk/tools/proguard4.7
ln -s .../Android-sdk/tools/proguard5.2 .../Android-sdk/tools/proguard
Android-sdk/tools/proguard/examples/library.pro
Dans le dossier du projet de bibliothèque et renommez-le en proguard-library.pro
proguard-library.pro
Et commentez les lignes -injars
, -outjars
, -libraryjars
Et -printmapping
.Modifiez le fichier build.gradle
De la bibliothèque pour inclure:
defaultConfig {
minifyEnabled true
shrinkResources true
proguardFiles 'proguard-library.pro'
consumerProguardFiles 'proguard-library-consumer.pro'
}
Vous pouvez modifier cela pour avoir un comportement différent pour les versions de version et de débogage.
proguard-library-consumer.pro
# include in this file any rules you want applied to a
# consumer of this library when it proguards itself.
-dontwarn junit.**
-dontwarn org.junit.**
# Make crash call-stacks debuggable.
-keepnames class ** { *; }
-keepattributes SourceFile,LineNumberTable
La seule chose qui a fonctionné pour moi est de définir les deux options dans ma bibliothèque:
release {
proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
consumerProguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
}
J'utilise ci-dessous dans le module de bibliothèque et résolu.
proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
consumerProguardFiles 'lib_proguard-rules.pro'