2009-11-08 15 views
0

J'optimise un pot avec proguard, mais il se bloque après optimisation. ici est ma tâche PROGUARD:java proguard: la bibliothèque ne fonctionne pas après l'optimisation

<proguard> 
     -injars  ${dist}/${jarname} 
     -outjars ${dist}-proguard/${jarname} 

     -target 5 

     -libraryjars '${java.home}/lib/rt.jar' 

     -dontobfuscate    
     -optimizationpasses 4 
     -overloadaggressively 
     -repackageclasses '' 
     -allowaccessmodification 

     -keep public class * { 
      public static void main(java.lang.String[]); 
     } 
    </proguard> 

dès que je l'ai mis dans l'option -dontoptimize, cela fonctionne.

en fonction de la pile de l'exception, il se bloque lors de l'accès à un membre public statique d'une classe avec un pointeur null. voici le code:

public static Texture ring, dust, spikering, thinring, crystal, clouds; 

public static void init() { 
    Field [] fields = TexturePool.class.getDeclaredFields(); 

    for (Field field : fields) { 
     if(field.getType() == Texture.class) { 
      field.set(null, /*imagine new object here*/); 
     } 
    } 
} 

merci!

+0

Je ne peux pas vraiment croire que l'accès (récupération, ou voulez-vous dire autre chose) le membre une NullPointerException. Voulez-vous dire que le membre peut être accédé, mais est lui-même nul, de sorte qu'une NullPointerException est levée, en essayant d'utiliser le membre? Si oui, d'où vient la valeur attendue? – jarnbjo

+0

merci, et bien le membre est initialisé dans une fonction que j'appelle avant d'y accéder. – clamp

+0

J'ai demandé à ce sujet, mais pourquoi ne pas vous soucier de nous dire ce qui se passe exactement? Quelle est la cause de l'exception NullPointerException? Une erreur interne de VM lors de l'accès au membre (comme votre message semble l'indiquer) ou simplement que le membre est null, de sorte qu'une exception NullPointerException est levée lorsque vous essayez d'accéder à l'instance de membre? – jarnbjo

Répondre

2

ok, je viens de découvrir moi-même. Je pense que l'optimisation a complètement optimisé cette classe, puisqu'ils ne sont pas directement accessibles dans cette classe. si je spécifie l'option:

 -keepclassmembers public class com.package.** { 
      public static * ; 
     } 

cela fonctionne même avec l'optimisation.

1

Selon Best Java Obfuscation Application For Size Reduction:

«J'ai toujours été en mesure de résoudre le problème en ne pas utiliser l'argument Proguard « -overloadaggressively ». »

Peut-être devriez-vous essayer la même chose?


EDIT: Le problème pourrait facilement être qu'une affectation est optimisée. Les initialisations qui se passent dans le code source, où un champ est défini, sont en fait effectuées par le compilateur dans un code statique blokc. Apparaît que les optimisations bricolent avec cela. Que se passe-t-il avec moins de passes d'optimisation?

+0

merci, mais même si je ne mets pas l'option overloadaggressively, je reçois le même plantage. – clamp

+0

Charmant. Il est temps de modifier les options une à la fois. Vous _must_ obscurcissez? –

+0

merci!Eh bien, seulement quand je spécifie 0 passes d'optimisation, cela fonctionne: -optimizationpasses 0 – clamp

0

J'ai rencontré le même problème avec ProGuard qui optimisait les champs de classe absents qui avaient été modifiés à l'aide de l'API de réflexion uniquement. Cependant, la réponse suggérée n'a pas fonctionné pour moi car il y avait trop de classes dispersées dans la base de code pour spécifier le filtre de classe.

Au lieu de cela, la désactivation de l'optimisation de terrain a fait l'affaire pour moi:

-optimizations !field/*