Android studio 把 module 打包成一个 jar 包,如何将 module 下的 libs 目录中的所有第三方也打包进去?

2017-03-08 15:28:12 +08:00
 qw30716
task makeJar(type: Copy) {
from('build/intermediates/bundles/release/')
into('build/outputs/')
include('classes.jar')
include('libs/dnsjava-2.1.7.jar')
include('libs/bcpkix-jdk15on-1.54.jar')
include('libs/bcprov-jdk15on-1.54.jar')
include('libs/netty-android.jar')

rename ('classes.jar', 'IMAF.jar')
}我这样做也不成功,不知道该如何解决
12294 次点击
所在节点    Android
17 条回复
475797650
2017-03-08 15:43:08 +08:00
module 打成 aar 包吧。资源文件都可以打进去
nicevar
2017-03-08 15:46:09 +08:00
配置好之后直接用 gradle build 打成 aar 就行了
qw30716
2017-03-08 15:54:39 +08:00
@475797650 jar 包不行是吧
qw30716
2017-03-08 15:57:21 +08:00
@nicevar 打成 AAR 后也是找不到类,那个类是第三方 jar 包里面的
475797650
2017-03-08 16:40:35 +08:00
@qw30716 google 了一下方法好像跟你一样...
qw30716
2017-03-08 16:44:32 +08:00
@475797650 aar 包就是包含了一些第三方 jar 包是吧
475797650
2017-03-08 16:46:22 +08:00
@qw30716 对的.
nicevar
2017-03-08 17:25:17 +08:00
@qw30716 首先你要保证执行到了这个函数,另外 include 换成 from ,用 project.zipTree 来处理 jar 包
task makeJar(type: Jar) {
archiveName = 'myjar.jar'
from(project.zipTree('libs/xxx.jar'))
destinationDir = file('build/libs')
}
这样直接 gradlew makeJar 就行了
qw30716
2017-03-08 18:35:31 +08:00
@nicevar 谢谢,我也刚看到这个方法
tongpeng1995
2017-03-08 18:54:12 +08:00
@nicevar 并不行,如果你 compile 第三方的库,打包成 aar 后,第三方的库没有引用进去。我也是很头疼这个问题。然后 GitHub 上有 fat-aar 这个插件,但是又报了 multi define dex 的错误。
nicevar
2017-03-08 18:59:29 +08:00
@tongpeng1995 什么并不行,你是根本没搞明白啊,这里面你配置过滤的,想要哪些类完全可以自己决定不要的 exclude 出去,你自己非要打多个进去肯定报错啊
tongpeng1995
2017-03-08 19:07:04 +08:00
@nicevar 比如你在 library A 里面 compile 了一个第三方的库 B ,然后打包成 aar 。
你在你自己的项目 C 中调用 A 里面的代码(用到第三方库 B ),不会报找不到第三方库 B 的错误吗?
我这边一运行就报找不到第三方库 B 的错误。然后在 GitHub 上找到一个项目叫 fat-aar 的,说是会把第三方的库也打包进 aar 。但是我一运行就报 Multiple dex files define 的错误。
我在项目 C 里面并没有重复 compile 这个第三方库 B 呀。还是说我的用法不对?
nicevar
2017-03-08 19:16:33 +08:00
@tongpeng1995 如果你 A 里面只是编译中使用了 B 库,而不是完全将 B 的类打进 aar ,你在 C 里面当然找不到类了,这种情况你依然要引入 B 库也就是你还需要引入 B 的 aar ,最简单的判断方法你解压出来 A 的 aar 看一下里面的 class 不就明白了,同样你用 fat-aar 打包出来的肯定是多次引入了,去检查一下编译过程
另外将 jar 完全打入 aar 中这种需求很少碰到的,一般都是在厂商修改了 Framework 的情况下用到,平时的项目没必要,我觉得你们应该走向了一个误区,其实在 repositories 引入 aar 目录,然后在 dependencies 里面添加所需的 aar 就行了
qw30716
2017-03-09 08:41:48 +08:00
@tongpeng1995 可以参考这个,但是有个问题,如果第三方 jar 包很多的话,最后你的 jar 包也很大 http://www.jianshu.com/p/5ba1a34e3fed
tongpeng1995
2017-03-11 11:13:18 +08:00
@nicevar
@qw30716
我走向一个误区了, AAR 并不需要处理依赖。依赖的处理应该是由 maven 来做。
这是我踩过的坑 https://www.v2ex.com/t/346638
qw30716
2017-03-11 15:44:14 +08:00
@tongpeng1995 你的意思是只要把 Android module 打包成 jar 就行了,然后其中的依赖全部通过 maven 来完成?但是我对 maven 不是很熟悉,当其他工程调用我们的 jar 包时,如何能确保依赖完成?
tongpeng1995
2017-03-14 11:21:22 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/345885

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX