【问题标题】:Proguard: How not to optimize classes from a libraryProguard:如何不优化库中的类
【发布时间】:2010-07-08 10:00:24
【问题描述】:

我在这里有一个 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 忽略某个库或某些类?

提前致谢!

【问题讨论】:

    标签: netbeans obfuscation proguard


    【解决方案1】:

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

    -libraryjars somelibrary.jar
    

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

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

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

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

    【讨论】:

    • 想要构建一个包含所有依赖项但只有 ProGuard 处理的应用程序部分的分发 JAR 是很常见的要求;也许您可以添加一个像 inlibraryjars 这样的新选项来启用它(并查看我的答案,因为如果作为第二遍完成,完全不进行处理的组合仍然会发出警告)。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      您可以将您的 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-06-01
        • 1970-01-01
        • 2021-05-24
        • 1970-01-01
        • 2020-10-08
        • 1970-01-01
        • 2016-05-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多