web-dev-qa-db-fra.com

Proguard ignore le fichier de configuration de la bibliothèque

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.

  • Dans les deux modules, j'ai déclaré un chemin de fichier proguard-rules.pro qui est correct
  • Dans les deux fichiers .gradle, j'ai minifyEnabled true

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

enter image description here

La configuration proguard de ma bibliothèque

enter image description here

Le gradle de ma bibliothèque:

enter image description here

Et enfin le résultat je reçois toujours. Peu importe ce que j'exclus/inclue dans la configuration proguard

enter image description here

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

28
Marian Klühspies

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:

  1. Copie Android-sdk/tools/proguard/examples/library.pro à proguard-project.txt dans votre projet de bibliothèque.
  2. Supprimez les exemples de lignes d'entrée/sortie -injars, -outjars, -libraryjars, -printmapping du fichier. Le processus de construction Gradle fournit automatiquement ces options.
  3. Référencez la configuration à partir du build.gradle du projet de bibliothèque.

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.

86
Eric Lafortune

É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.

  1. Téléchargez Proguard 5.2 depuis http://sourceforge.net/projects/proguard/files/proguard/5.2/
  2. Décompressez pour ... /Android-sdk/tools/proguard5.2
  3. Renommez ... /Android-sdk/tools/proguard En ... /Android-sdk/tools/proguard4.7
  4. ln -s .../Android-sdk/tools/proguard5.2 .../Android-sdk/tools/proguard
  5. Copiez Android-sdk/tools/proguard/examples/library.pro Dans le dossier du projet de bibliothèque et renommez-le en proguard-library.pro
  6. Modifiez proguard-library.pro Et commentez les lignes -injars, -outjars, -libraryjars Et -printmapping.
  7. 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.

  8. 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
    
8
swooby

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'
}
5
Asaf Pinhassi

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'
0
Ali Bagheri