2010-07-08 12 views
2

J'ai ici un projet JavaME dans lequel j'ai dû inclure une bibliothèque donnée. J'utilise Netbeans 6.8, donc j'ai simplement ajouté la bibliothèque au projet. Les classes de la bibliothèque sont ensuite correctement compressées dans le fichier jar résultant.Proguard: Comment ne pas optimiser les classes à partir d'une bibliothèque

Mon problème maintenant est que les classes de cette bibliothèque ne doivent pas être touchées par l'obfuscateur Proguard. J'ai donc essayé différentes options de -Keep:

-keep class com.package.**

J'ai aussi essayé -keepnames et -keepclassmembers, mais Proguard QUITTE disant:

Unexpected error while editing code:

Class = [com/package/class]

Method = [run()V]

Exception = [java.lang.IllegalArgumentException] (Invalid instruction offset [1077] in code with length [1075])

Error: Invalid instruction offset [1077] in code with length [1075]

est-il un moyen de dire Proguard d'ignorer une certaine bibliothèque ou certaines classes?

Merci d'avance!

Répondre

0

The classes of the library are then correctly packed into the resulting jar-file.

Voilà où est votre problème. Une fois qu'il est dans le pot fourni à Proguard, il sera traité. Je crois que vous devez créer un grand pot avec toutes les dépendances. Si c'est le cas, excluez votre code JavaME de ce gros pot et conservez-le dans un pot séparé. Alors Proguard ne le traitera pas. Sinon, trouvez un moyen de déplacer votre code JavaMe dans un fichier jar séparé et de le rendre dépendant du fichier jar que vous fournissez à Proguard.

1

Si vous voulez ProGuard laisser une bibliothèque intacte, vous devez spécifier avec -libraryjars au lieu de -injars:

-libraryjars somelibrary.jar 

Ses cours ne seront pas inclus dans le pot de sortie, de sorte que vous alors encore pour ajouter la bibliothèque jar au chemin de classe de votre application traitée.

Sinon, vous pouvez traiter le pot de bibliothèque comme un pot d'entrée, mais garder ses classes et les membres de la classe:

-keep class some.library.** { *; } 

Maintenant, l'erreur inattendue est quelque chose de différent. Cela indique un bug dans ProGuard. Vous devez vous assurer que vous utilisez la dernière version de ProGuard. Sinon, vous devez signaler un problème sur le traqueur de bogue de ProGuard sur Sourceforge.

+0

Il est tout à fait une exigence commune de vouloir construire un JAR de distribution qui comprend toutes les dépendances, mais seulement a les pièces d'application traitées par ProGuard; peut-être que vous pourriez ajouter une nouvelle option comme inlibraryjars pour activer ceci (et voir ma réponse puisque la combinaison sans traitement du tout crache toujours des avertissements si elle est faite en tant que deuxième passage). –

0

Vous pouvez combiner vos fichiers JAR dans une passe séparée avec ProGuard, en précisant ces options:

-dontnote ** 
-dontwarn ** 
-dontobfuscate 
-dontshrink 
-dontoptimize 

qui a pour simple effet de combiner JARs sans les traiter du tout.

Les options dontnote et dontwarn doivent supprimer les notes et les avertissements qui, pour une simple opération de combinaison, sont faux (et il y en aura plusieurs).

La première passe doit ressembler à:

-injars  MyApplication-Unobfuscated.jar 
-libraryjars SomeLibraryJar.jar(!META-INF/**) 
-libraryjars AnotherLibraryJar.jar(!META-INF/**) 
-outjars  MyApplication-Obfuscated.jar 

// other options. 

La deuxième passe devrait ressembler à:

-injars  MyApplication-Obfuscated.jar 
-injars  SomeLibraryJar.jar(!META-INF/**) 
-injars  AnotherLibraryJar.jar(!META-INF/**) 
-outjars  MyApplication.jar 

-dontnote ** 
-dontwarn ** 
-dontobfuscate 
-dontshrink 
-dontoptimize