2012-06-05 47 views
1

混淆后我的jar文件的集合与菱形图案的依赖关系:如何留住JAR依赖使用ProGuard

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

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

当我试图一次模糊所有瓶子时,ProGuard并不“理解”它们的依赖;并从base.jar中的类采取静态方法,并将其移至dep1.jar中的混淆类。如果dep1.jar不在类路径中,代码位于dep2.jar的模糊版本中,“期望”base.jar中的方法在运行时失败。

我该如何确保混淆瓶子中的依赖关系得以保留?

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

回答

1

最简单的(虽然子最佳)解决方案是一次处理它们,而无需优化(-dontoptimize)。

+0

谢谢!这似乎奏效了。 – lefty

1

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

(顺便说一句,我不知道是否被混淆你的类名-repackageclasses生效之前,并有一个名称冲突的地方?我们有类似的问题一次。)

+0

自你回答以来,我已经重申了我的问题,因此人们可能不了解您对我最初的担忧做出了回应,因为(我)反驳说,'-repackageclasses'参数导致了混淆依赖性的变化。 – lefty