在Android的.aar库中重新打包.jar文件

10

源代码

使用库的项目

问题描述

我正在编写一个 Android 库(.aar),在这个库中我使用了 .jar 库。

enter image description here

为避免依赖重复,我使用 ShadowJar 插件进行重新打包,如下所示:

task shadowJar(type: com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar) {
    System.out.println("Relocating packages...")
    relocate 'retrofit'               , 'com.codecraft.retrofit'
    relocate 'org.simpleframework.xml', 'com.codecraft.org.simpleframework.xml'
    relocate 'com.squareup.okhttp'    , 'com.codecraft.com.squareup.okhttp'
}
在使用Android库(.aar)的应用程序中,我有以下显示的依赖库,只是为了测试我是否存在依赖重复问题。
dependencies {
    compile 'com.squareup.retrofit:retrofit:2.0.0-beta1'
    compile 'com.squareup.retrofit:converter-simplexml:2.0.0-beta1'
}

但是当我尝试在Android上运行应用程序时,出现以下错误

enter image description here

Error:warning: 忽略匿名内部类的InnerClasses属性Error:(com.bea.xml.stream.util.CircularQueue$1),该类没有关联的EnclosingMethod属性。这个类可能是由于编译器没有针对现代.class文件格式进行目标的Error:编译而产生的。推荐的Error:解决方案是使用最新的编译器从源代码重新编译类Error:,并且不指定任何“-target”类型选项。忽略此警告的后果是,对该类的反射操作将错误地表示它不是一个内部类。 Error:处理 "javax/xml/XMLConstants.class" 时出错:Error:在不构建核心库时使用核心类(java.*或javax.*)Error:。当使用IDE(如Error:Eclipse)时,这通常是由于意外地包含了核心库文件Error:在应用程序项目中。如果您确定没有故意定义一个Error:核心类,则这可能是正在发生的情况的最有可能的解释Error:。然而,您可能确实正在尝试定义一个在核心Error:命名空间中的类,其源代码可能已被您获取,例如Error:从非Android虚拟机项目中。这几乎肯定不会Error:起作用。最低限度,它会危及您的应用程序与平台未来版本的兼容性Error:。这通常也是具有疑问的合法性。如果您确实打算构建一个核心库--只有Error:作为创建完整虚拟机分发的一部分,而不是编译应用程序--那么请使用Error:“--core-library”选项来抑制此错误消息。如果您继续使用“-Error:-core-library”,但实际上正在构建应用程序,则要注意,您的Error:应用程序仍将在某个时候无法构建或运行。请准备好生气的Error:客户发现,例如他们升级操作Error:系统后,您的应用程序停止工作。这个问题由您造成Error:。如果您合法地使用了一些代码,恰好在一个Error:核心包中,那么您最简单的安全替代方案是将该代码重新打包。也就是说,将相关的类移动到Error:自己的包名称空间中。 JarJar是可能Error:帮助您完成这个任务的工具。如果您发现无法这样做,则Error:这表明您正在走上一条最终会Error:导致痛苦、苦难、悲哀和悲叹的道路。 Error:1 error; aborting :app:transformClassesWithDexForDebug FAILED Error:Execution failed for task ':app:transformClassesWithDexForDebug'。

com.android.build.api.transform.TransformException: java.lang.RuntimeException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: java.lang.UnsupportedOperationException

请注意,只添加retrofit依赖项时不会出现此问题

dependencies {
        compile 'com.squareup.retrofit:retrofit:2.0.0-beta1'
    } 

这个错误的原因是什么,我该如何解决?


1
很确定你可以通过使用provided file("your.jar")而不是使用compile来解决这个问题。 - Jared Rummler
@JaredRummler 那并没有帮助,我仍然有同样的问题,也许你可以下载我的项目并自行检查,也许是我做错了什么?:( - user5699130
2
不足之处在于您的库将变得更大(方法数),您将负责升级所有依赖项,并且您将隐藏自己的依赖项使其他人无法看到。同时,同时运行同一库的多个版本可能会造成严重的副作用,并增加内存和线程的占用。我强烈建议不要自行管理此问题,而是依靠Gradle。此外,对于每个人来说,添加额外的Gradle依赖应该是很简单的事情,对吧? - Jeroen Mols
@jmols 我同意你的观点,但如果我非要这么做怎么办呢?因为我的问题是如何重命名包并使用它?而使用包时可能出现的问题则是另一回事。 - user5699130
对此没有任何经验,非常抱歉... - Jeroen Mols
显示剩余3条评论
2个回答

2
当你在将Jars包含在你的lib或应用程序中时,你可能会包含使用不同java版本或与你的配置不同编译的文件,这可能会导致像你正在经历的问题一样的问题。
我猜测你使用的依赖关系是指引起jar创建问题的库。如果对于你来说不使用依赖关系很关键-考虑下载你正在使用的lib的代码(假设它们是开源的,并且没有法律限制),并将它们编译为你项目中的附加模块,而不是添加jar。如果你这样做-你一定要考虑jmols关于lib大小和方法计数的建议。
祝好运!

1

排除某些模块后,帮助我解决了相同的错误:

compile ('com.squareup.retrofit2:converter-simplexml:2.1.0'){
    exclude group: 'xpp3', module: 'xpp3'
    exclude group: 'stax', module: 'stax-api'
    exclude group: 'stax', module: 'stax'
}

来源 link


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