1

我有一个 jar 文件的集合,这些文件的依赖项呈菱形:

          base.jar
         /\
dep1.jar dep2.jar
         \
         /dep3.jar

我想用 ProGuard 混淆它们以保留它们的依赖关系,例如,base.jar 和 dep2.jar 的混淆版本可以单独执行,而没有 dep1.jar 和 dep3.jar 的混淆版本(就像他们可以,没有混淆)。在它们所依赖的 jar 中,分布在具有相同包名称的 jar 中的类,以及调用我想要混淆的方法(在各种类中)的依赖 jar 中的方法。

当我尝试一次混淆所有 jar 时,ProGuard 不会“理解”它们的依赖关系;并从 base.jar 中的类中获取静态方法,并将其移动到 dep1.jar 中的混淆类中。如果 dep1.jar 不在类路径中,则 dep2.jar 的混淆版本中“预期”base.jar 中的该方法的代码在运行时会失败。

如何确保保留混淆 jar 中的依赖项?

该文档建议使用增量混淆,但-applymapping它似乎需要的开关只能接受一个参数,告诉依赖方法在调用它们所依赖的 jar 时使用的混淆名称,这些名称首先被混淆。dep1.jar 的混淆可以产生一个这样的映射文件参数,而 dep2.jar 的混淆可以产生另一个,但是 dep3.jar 的混淆在它的参数中需要这两个映射文件(加上 base.jar?)-applymapping。dep1.jar 和 dep2.jar 不能一起混淆(或者它们可以混淆吗?),但是,以生成单个映射文件,因为代码可能会从一个重新定位到另一个。我必须自己合并映射文件吗?

4

2 回答 2

1

我们已经使用 ProGuard 两三年了,-repackageclasses在我们的配置中没有标记,我们的 .jar 文件被混淆了并且仍然正常运行。任何在我们的 .jar 文件中四处寻找的人都可以看到我们的命名空间是 com.[company] ,这是标志可以隐藏的东西,但我们认为这并不是什么大问题。没有它你应该没问题。

-repackageclasses(顺便说一句,我想知道您的类名是否在生效之前被混淆了,并且某处存在名称冲突?我们曾经遇到过类似的问题。)

于 2012-06-05T19:36:49.077 回答
1

最简单(尽管不是最佳)的解决方案是一次处理它们,而不进行优化(-dontoptimize)。

于 2012-06-07T09:37:50.097 回答