2017-09-18 3 views
6

Supposons que je structure:Proguard, conservez toutes les classes référencées

import some.other.Clazz; 

public class A { 

    Clazz clazz; 
    B b; 

    public class B { 
     C c; 
     //... 
    } 

    public static class C { 
     //... 
    } 
} 

Y at-il une bonne astuce PROGUARD qui me permettrait de récursivekeep toutes les classes qui sont utilisées par ma classe A? Donc aussi toutes les classes référencées en interne par B, C et Clazz?

+0

Pouvez-vous expliquer pourquoi avez-vous besoin d'un tel «truc astucieux»? Quel est votre cas d'utilisation? – larsgrefer

+0

@larsgrefer Bien sûr, je crée un outil qui vérifie que la classe que j'ai besoin de garder dans proguard a la bonne règle de proguard. Il serait plus facile pour moi de vérifier la présence d'une seule règle pour une classe 'A', que de comprendre manuellement toutes les classes référencées et vérifier la présence de règles pour chacune d'entre elles. –

+0

Est-ce une question Android? –

Répondre

2

Je ne pense pas que vous pouvez le faire avec proguard seulement et je doute vraiment qu'il existe une solution simple (plugin que vous pouvez utiliser) avec mvn \ gradle \ sbt \ quoi que ce soit pour cela. Si vous êtes d'accord avec le code courant ou les commandes shell pendant votre construction, je peux vous recommander quelques blocs de construction, mais, comme les assembler dépend vraiment de la façon dont vous construisez votre projet, je peux seulement donner des suggestions de base ensemble.


L'idée générale est:

(1) utilisation jdeps (une partie et distribué avec jdk) pour aller chercher les dépendances (y compris transitif) de compilées .class dossiers d'intérêt.

Dans votre cas, la sortie des dépendances récursives de some.class (limité à root_package) devrait être quelque chose comme:

jdeps -v -R -e "root_package.*" some.class 

(2) grab jdeps sortie et la transformer en config proguard (liste des classes à -keep) .

(3) Dans votre fichier de configuration proguard principal include fichier de configuration que vous avez généré dans (2).


L'étape (2) nécessite la plupart des travaux de couture et peut être abordée différemment.

Ma suggestion consiste à utiliser les capacités de script de votre système de compilation pour exécuter jdeps et effectuer une transformation de sortie. Maven, par exemple, a plugin that allows groovy scripts to be executed pendant la construction.

Si vous êtes plus à l'aise avec l'exécution de scripts shell, vous pouvez effectuer les opérations suivantes:

  1. tuyau jdeps sortie dans quelque chose comme:

    grep -Po classname_regex

    ... pour ne garder que les noms de classe vous voulez conserver (vous pouvez utiliser des assertions de longueur nulle pour construire classname_regex).

    sortie du tuyau
  2. de grep en quelque chose comme:

    awk '{print "-keep class " $0}

    ... pour obtenir config proguard et enregistrer la sortie vers un fichier.

+1

Ce n'est pas parfait mais je pourrais travailler avec 'jdeps' (dont je ne connaissais pas l'existence). Merci –