如何在使用ProGuard进行模糊处理后保留jar依赖项

时间:2012-06-05 18:09:39

标签: java jar obfuscation proguard

我有一个带有菱形图案依赖关系的jar文件集合:

  

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

我想用ProGuard对它们进行模糊处理以保留它们的依赖关系,因此,例如,base.jar和dep2.jar的模糊版本可以独立执行,而不会使用dep1.jar和dep3.jar的混淆版本。 (正如他们所能,未经过混淆)。在具有相同包名称的jar中分布有类,并且依赖jar中的方法调用方法(在各种类中)我想要混淆,在它们依赖的jar中。

当我尝试一次混淆所有罐子时,ProGuard并没有“理解”他们的依赖关系;并从base.jar中的类中获取静态方法,并将其移至dep1.jar中的模糊类。 dep2.jar的模糊版本中的代码“期望”base.jar中的方法,如果dep1.jar不在类路径上,则在运行时失败。

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

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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