我能否以某种方式包含并使用多个版本的相同.jar库?

6
我知道这听起来很荒谬,但在Android项目中是否可能将两个不同版本的.jar库放入其中(这两个版本显然具有相同或重叠的包和类名称),并在导入库的类到我的Java源代码时显式指向它们中的一个?
我的开发环境是Android Studio和Gradle。
我考虑这样做的原因(如果可能的话)是因为我依赖于供应商提供的闭源.jar驱动程序库,用于我Android应用程序所使用的USB设备。供应商已经在其最新驱动程序中添加了对新芯片版本的支持,但同时他们放弃了对旧芯片版本的支持。这是他们为自己好的原因做出的决定,并且不太可能被撤销。我的想法是以某种方式携带应用程序的旧版本和新版本库,以便我可以继续支持旧硬件。
我认为理论上这样做是可能的,但这是一项复杂的任务,也许需要对一个.jar进行反编译并更改包名称。

1
你需要使用类似 jarjar 的工具重新打包其中一个 JAR 文件,否则就只能玩一些不好的类加载器游戏了。 - CommonsWare
这些JAR文件在CLASSPATH中的顺序很重要。无论哪个先出现,该JAR类将被加载(因为命名空间相同)。 - K139
谢谢各位,非常感谢你们的建议。jarjar 的建议非常有趣。 - Trevor
有趣的问题。我想问一下您是否有jar文件的原始源代码。反编译版本看起来如何,是否可读? - Bojan Kseneman
很遗憾我没有源代码。我必须承认我还没有尝试反编译它。不过,我已经下载了jarjar,打算试一试。 - Trevor
显示剩余2条评论
1个回答

6

令我惊讶的是,我非常快地使用了 CommonsWare 建议的jarjar工具并取得了成功。

理解如何完成这一操作的关键在于下面这个 QA:

手动编辑 Jar 文件以更改包名称

按照上面给出的说明,我重命名了一个.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是转换后的文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接