V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
qw30716
V2EX  ›  Android

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

  •  
  •   qw30716 · 2017-03-08 15:28:12 +08:00 · 16145 次点击
    这是一个创建于 2818 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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')
    }我这样做也不成功,不知道该如何解决
    17 条回复    2017-03-14 11:21:22 +08:00
    475797650
        1
    475797650  
       2017-03-08 15:43:08 +08:00
    module 打成 aar 包吧。资源文件都可以打进去
    nicevar
        2
    nicevar  
       2017-03-08 15:46:09 +08:00
    配置好之后直接用 gradle build 打成 aar 就行了
    qw30716
        3
    qw30716  
    OP
       2017-03-08 15:54:39 +08:00
    @475797650 jar 包不行是吧
    qw30716
        4
    qw30716  
    OP
       2017-03-08 15:57:21 +08:00
    @nicevar 打成 AAR 后也是找不到类,那个类是第三方 jar 包里面的
    475797650
        5
    475797650  
       2017-03-08 16:40:35 +08:00
    @qw30716 google 了一下方法好像跟你一样...
    qw30716
        6
    qw30716  
    OP
       2017-03-08 16:44:32 +08:00
    @475797650 aar 包就是包含了一些第三方 jar 包是吧
    475797650
        7
    475797650  
       2017-03-08 16:46:22 +08:00
    @qw30716 对的.
    nicevar
        8
    nicevar  
       2017-03-08 17:25:17 +08:00   ❤️ 1
    @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
        9
    qw30716  
    OP
       2017-03-08 18:35:31 +08:00
    @nicevar 谢谢,我也刚看到这个方法
    tongpeng1995
        10
    tongpeng1995  
       2017-03-08 18:54:12 +08:00
    @nicevar 并不行,如果你 compile 第三方的库,打包成 aar 后,第三方的库没有引用进去。我也是很头疼这个问题。然后 GitHub 上有 fat-aar 这个插件,但是又报了 multi define dex 的错误。
    nicevar
        11
    nicevar  
       2017-03-08 18:59:29 +08:00
    @tongpeng1995 什么并不行,你是根本没搞明白啊,这里面你配置过滤的,想要哪些类完全可以自己决定不要的 exclude 出去,你自己非要打多个进去肯定报错啊
    tongpeng1995
        12
    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
        13
    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
        14
    qw30716  
    OP
       2017-03-09 08:41:48 +08:00
    @tongpeng1995 可以参考这个,但是有个问题,如果第三方 jar 包很多的话,最后你的 jar 包也很大 http://www.jianshu.com/p/5ba1a34e3fed
    tongpeng1995
        15
    tongpeng1995  
       2017-03-11 11:13:18 +08:00
    @nicevar
    @qw30716
    我走向一个误区了, AAR 并不需要处理依赖。依赖的处理应该是由 maven 来做。
    这是我踩过的坑 https://www.v2ex.com/t/346638
    qw30716
        16
    qw30716  
    OP
       2017-03-11 15:44:14 +08:00
    @tongpeng1995 你的意思是只要把 Android module 打包成 jar 就行了,然后其中的依赖全部通过 maven 来完成?但是我对 maven 不是很熟悉,当其他工程调用我们的 jar 包时,如何能确保依赖完成?
    tongpeng1995
        17
    tongpeng1995  
       2017-03-14 11:21:22 +08:00
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2764 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 11:30 · PVG 19:30 · LAX 03:30 · JFK 06:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.