我在这里有一个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忽略某个库或某些类?
提前致谢!
答案 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而不处理它们的简单效果。
dontnote
和dontwarn
选项用于抑制注释和警告,对于简单的合并操作而言,它们是假的(并且会有很多)。
第一遍看起来像:
-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