我可以以某种方式包含和使用给定.jar库的多个版本吗?

时间:2015-05-07 19:50:34

标签: java android

我很欣赏这听起来很荒谬,但是有可能将.jar库的两个不同版本放到一个Android项目中(两个版本显然都有相同或重叠的包和类名),并以某种方式明确指向一个将库的类导入我自己的Java源代码时,它们是什么?

我的开发环境是带有Gradle的Android Studio。

我考虑这样做的原因(如果可能的话)是因为我依赖一个闭源供应商提供的.jar驱动程序库,用于我的Android应用程序使用的USB设备。该厂商在其最新的驱动程序中增加了对更新芯片版本的支持,但与此同时,他们已经放弃了对旧版芯片的支持。这是他们为自己的理由做出的决定,不太可能被逆转。我的想法是以某种方式在我的应用程序中携带新旧版本的库,以便我可以继续支持旧硬件。

我认为这样的事情在理论上是可行的,但是一个复杂的事情,可能需要一个.jar被反编译并且包名称改变了?

1 个答案:

答案 0 :(得分:6)

令我惊讶的是,我很快就使用CommonsWare建议的jarjar实用程序取得了成功。

理解如何做到这一点的关键是本质量保证:

Hand Edit A Jar to Change Package Names

我使用上面给出的指示重命名了我的.jar之一,现在让他们在我的项目中并排坐着。

我不想复制SO内容,但为了完整起见,我做了以下内容:

获取最新版本的jarjar

创建了一个名为rules.txt的配置文件,其中包含一行:

rule uk.co.dog.** uk.co.cat.@1

这只是一个例子。给定包uk.co.dog.*的.jar后,dog将更改为cat。显然,改变它以适应您的实际情况。

然后使用命令行:

java -jar jarjar.jar process rules.txt in.jar out.jar

in.jar的来源是.jar,而out.jar是转化的。