2009-07-22 10 views
6

J'obscurcis une bibliothèque avec ProGuard en utilisant la tâche Ant.Exposer des classes internes en s'obscurcissant avec ProGuard

Je garde les noms de classes particulières et leurs noms de méthode quand ils ont une annotation particulière (@ApiAll) et je demande que les InnerClasses attribuent à conserver:

<keepattribute name="InnerClasses" /> 
    <keep annotation="com.example.ApiAll"/> 
    <keepclassmembers annotation="com.example.ApiAll"> 
    <constructor access="public protected"/> 
    <field access="public protected"/> 
    <method access="public protected"/> 
    <constructor access="protected"/> 
    </keepclassmembers> 

Si je vérifie la sortie de la cartographie fichier Je peux voir que ma classe interne qui a l'annotation et ses membres gardent leurs noms non obus. Cependant, quand je regarde dans le fichier jar généré, je ne trouve pas la classe.

Ai-je raté quelque chose? Pourquoi la cartographie me dit-elle qu'il garde cette classe quand elle ne l'est pas?

Répondre

20

Vous devez spécifier que vous souhaitez conserver la classe interne en utilisant la notation appropriée. Dans le langage de proguard, cela signifie -keep class my.outer.Class$MyInnerClass. La clé ici est d'utiliser le signe dollar ($) comme séparateur entre classe interne et externe.

Pour ce faire, vous devez également spécifier -keepattributes InnerClasses, afin que le nom MyInnerClass ne soit pas obfusqué. Ces deux paramètres ensemble devraient permettre à vos classes internes d'être maintenues intactes.

+0

Merci Markus. Cela m'a aidé à résoudre mon problème – Fenil

+0

Ceci est la bonne réponse pour le même problème avec yGuard – ygesher

0

L'option keepclassmembers préserve uniquement les membres de classe spécifiés (et leurs noms).

Vous voulez probablement l'option plus commune keep, qui préserve les classes spécifiées et membres de la classe (et leurs noms).

Cfr. ProGuard manual > Usage > Overview of Keep Options