2009-07-22 11 views
6

Sto offuscando una libreria con ProGuard che utilizza l'attività Ant.Esposizione di classi interne durante l'offuscamento con ProGuard

mi tengo i nomi delle classi particolari ei loro nomi di metodo quando hanno una particolare annotazione (@ApiAll) e sto chiedendo che le attribuiscono InnerClasses essere tenuti:

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

Se controllo l'uscita mappatura file Posso vedere che la mia classe interiore che ha l'annotazione e i suoi membri mantengono il loro nome inoffensivo. Tuttavia quando guardo nel file jar generato non riesco a trovare la classe.

Mi manca qualcosa? Perché la mappatura mi dice che è mantenere questa classe quando non lo è?

risposta

20

È necessario specificare che si desidera mantenere la classe interna utilizzando la notazione appropriata. Nel linguaggio di proguard, che significa -keep class my.outer.Class$MyInnerClass. La chiave qui sta usando il simbolo del dollaro ($) come separatore tra classe interna ed esterna.

Per fare ciò, è inoltre necessario specificare -keepattributes InnerClasses, in modo che il nome MyInnerClass non venga offuscato. Queste due impostazioni insieme dovrebbero consentire alle tue classi interne di essere mantenute intatte.

+0

Grazie Markus. Questo mi ha aiutato a risolvere il mio problema – Fenil

+0

Questa è la risposta corretta per lo stesso problema con yGuard – ygesher

0

L'opzione keepclassmembers conserva solo i membri della classe specificati (ei relativi nomi).

Probabilmente si desidera l'opzione più comune keep, che conserva le classi specificate e membri della classe (e i relativi nomi).

Cfr. ProGuard manual > Usage > Overview of Keep Options

Problemi correlati