2

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

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

-保留类 com.package.**

我也尝试过 -keepnames 和 -keepclassmembers,但 Proguard 不会说:

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

类 = [com/package/class]

方法 = [run()V]

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

错误:长度为 [1075] 的代码中的指令偏移量 [1077] 无效

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

提前致谢!

4

3 回答 3

1

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

-libraryjars somelibrary.jar

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

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

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

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

于 2011-08-07T15:14:18.357 回答
0

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

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

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

于 2011-08-04T18:36:17.247 回答
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
于 2014-02-02T00:10:55.530 回答