Proguard:如何不优化库中的类

时间:2010-07-08 10:00:25

标签: netbeans obfuscation proguard

我在这里有一个JavaME项目,其中我必须包含一个给定的库。我正在使用Netbeans 6.8,所以我只是将库添加到项目中。然后将库的类正确打包到生成的jar文件中。

我现在的问题是Proguard混淆器不能触及这个库的类。所以我尝试了不同的-keep选项:

  

-keep class com.package。**

我也尝试了-keepnames和-keepclassmembers,但Proguard会退出说:

  

编辑代码时出现意外错误:

     

Class = [com / package / class]

     

方法= [run()V]

     

异常= [java.lang.IllegalArgumentException](长度为[1075]的代码中的指令偏移量[1077]无效)

     

错误:长度为[1075]

的代码中的指令偏移量[1077]无效

有没有办法告诉Proguard忽略某个库或某些类?

提前致谢!

3 个答案:

答案 0 :(得分:1)

如果您希望ProGuard保持库不变,您应该使用-libraryjars而不是-injars指定它:

-libraryjars somelibrary.jar

它的类不会包含在输出jar中,因此您仍然需要将库jar添加到已处理应用程序的类路径中。

或者,您可以将库jar作为输入jar处理,但保留其类和类成员

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

现在,意外错误是不同的。它表示ProGuard中存在错误。您应该确保使用的是最新版本的ProGuard。否则,您应该在Sourceforge上报告ProGuard错误跟踪器上的问题。

答案 1 :(得分:0)

  

然后将库的类正确打包到   产生jar文件。

这就是你的问题所在。一旦它被提供给Proguard的罐子,它将被处理。我相信你必须创建一个包含所有依赖项的大jar。如果是这样,请从这个大jar中排除您的JavaME代码并将其保存在单独的jar中。那么Proguard将不会处理它。

否则,找到一种方法将JavaMe代码移动到一个单独的jar中,并使其成为您向Proguard提供的jar的依赖项。

答案 2 :(得分:0)

您可以将JAR与ProGuard分开传递,并指定以下选项:

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

它具有组合JAR而不处理它们的简单效果。

dontnotedontwarn选项用于抑制注释和警告,对于简单的合并操作而言,它们是假的(并且会有很多)。

第一遍看起来像:

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

// other options.

第二遍应该是:

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

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