• Android Studio多Module使用 aar 依赖包 丢包解决


    FAQ: AAR打包引用丢包问题, jar, aar, dependency 嵌套层级依赖的丢失

    问: aar包中,如何包含第三方依赖库?

    如果直接作为module 依赖是没有问题的,但是如果打包成aar,确实找不到相关的类。

    Android Library项目中如果使用Android Gradle plugin打aar包,通过maven依赖的库,或者是local依赖的aar都不会包含在生成的aar包里

    如果项目是发布一个SDK,为了方便开发者使用,我们倾向于生成一个包含所有依赖库以及.so等文件的aar包。

     

    需要解决的问题:

    1.aar打包丢失lib库maven远程依赖;

    关于1的解决方案可以参考该链接:

    建立本地或者远程的maven库……

    Androidstudio 打包aar 无法引用类库中 dependencies 远程依赖 - Freetofly白的博客 - 博客频道 - CSDN.NET
    http://blog.csdn.net/u011840744/article/details/50608677

    2.aar打包丢失本地aar依赖

    关于2的解决方案如下:

    方案一、 所有依赖 Module A 的 Module 都添加:  ---给好aar的路径:xxmodule/libs/xx.aar

    repositories {
        flatDir {
            dirs 'xxx/libs' // Module A的libs的目录地址
        }
    }

    把所有的 Module 都添加上 Module A 的 libs 目录的相对地址。

    方案二、 Project 下的 build.gradle 中的 repositories 中添加相应的引用如下:

    allprojects {
        repositories {
            jcenter()
    
            flatDir {
                // 由于Library module中引用了 gif 库的 aar,在多 module 的情况下,
                // 其他的module编译会报错,所以需要在所有工程的repositories
                // 下把Library module中的libs目录添加到依赖关系中
                dirs project(':AppLibrary').file('libs')  
            }
        }
    }
    

      

     方案3、编写脚本,实现aar打包的时候把相应依赖全部打包进aar中

    为项目增加一个sub project(如pkg_project)专门用于打包,该项目中build.gradle内容如下:

    apply plugin: 'java'
    version = 1.0
    buildscript {
        repositories {
            mavenCentral()
        }
        dependencies {
            classpath 'com.android.tools.build:gradle:19.1.0'
        }
    }
    
    repositories {
        mavenCentral()
    }
    
    dependencies {
        compile project(':<your_library_project>') //此处填写需要打包的Android Library Project name
    }
    
    task sync_jars() << {
         //把所有依赖的.jar库都拷贝到build/aar/libs下
        copy {
            into buildDir.getPath() +"/aar/libs"
            from configurations.compile.findAll {
                it.getName().endsWith(".jar")
            }
        }
    }
    
    task sync_aars(dependsOn:':<your_library_project>:assembleRelease') << {
         //把所有依赖的.aar库里包含的classes.jar都拷贝到build/aar/libs下,并重命名以不被覆盖
        def jar_name
        def aar_path
        def dest_dir = buildDir.getPath()+"/aar"
        configurations.compile.findAll {
            it.getName().endsWith(".aar")
        }.collect {
            aar_path = it.getPath()
            jar_name = "libs/"+it.getName().replace(".aar",".jar")
            copy {
                from zipTree(aar_path)
                into dest_dir
                include "**/*"
                rename 'classes.jar', jar_name
            }
        }
    }
    
    task fataar(dependsOn:[sync_aars, sync_jars]) << {
        task (obfuse_classes_jar, type: proguard.gradle.ProGuardTask) {
            //把build/aar/libs/*.jar混淆后生成build/aar/classes.jar
            configuration "proguard.cfg"
            injars buildDir.getPath()+"/aar/libs"
            outjars buildDir.getPath()+"/aar/classes.jar"
            libraryjars "${System.getProperty('java.home')}/lib/rt.jar"
            libraryjars "${System.getProperty('java.home')}/Contents/Classes/classes.jar"
            libraryjars System.getenv("ANDROID_HOME")+"/platforms/android-19/android.jar"
        }.execute()
        task (gen_aar, type: Zip) {
            //把生成最终的aar包,注意libs目录需要被排除
            def dest_dir = buildDir.getPath()+"/aar/"
            baseName = "mysdk-all"
            extension = "aar"
            destinationDir = file(buildDir.getPath())
            from dest_dir
            exclude "libs"
        }.execute()
    }
    

    最后就可以使用gradlew pkg_project:fataar来打包了

    解决办法:

    使用相对路劲来找到这个aar文件。

    repositories {
        flatDir {
            dirs '../myLibrary2/libs';dirs 'libs'  // 申明本地库,给aar的全路径
        }
    }


    ref:

    请问aar包中,如何包含第三方依赖库 · Issue #76 · lovetuzitong/MultiImageSelector
    https://github.com/lovetuzitong/MultiImageSelector/issues/76

    Android Studio 生成aar包多Module引用问题|Android Studio|项目管理|云计算教程网
    http://www.yjs001.cn/project/androidstudio/35538217209882050505.html

    Android Studio多Module使用aar编译报错的解决方案
    http://leehong2005.com/2016/08/28/android-studio-use-aar-issues/

    Android导出aar时嵌套引用的那些坑 - 简书
    http://www.jianshu.com/p/7a532de0b111

    在AndroidStudio中,使用Gradle打包aar到JCenter仓库!完整版教程!填补各种坑 - 阿衰的专栏 - 博客频道 - CSDN.NET
    http://blog.csdn.net/ls1110924/article/details/46470059

    使用Gradle生成包含所有依赖库(.jar或.aar)的aar包 - When Go meets Raspberry Pi
    http://hugozhu.myalert.info/2014/11/05/52-assemble-aar-with-all-dependencies-with-gradle.html

    通用的 Android studio 打包 jar Gradle 插件 - Android - 掘金
    https://juejin.im/entry/57c3bc547db2a200680a07a8

  • 相关阅读:
    使用Parallel计算目录中的文件字节长度
    任务工厂
    启动新任务和子任务
    服务器端小程序
    Java核心技术II读书笔记(三)
    Java核心技术II读书笔记(二)
    Java核心技术II读书笔记(一)
    多线程-线程的中断
    http协议详解
    java UncaughtExceptionHandler 处理线程意外中止
  • 原文地址:https://www.cnblogs.com/bluestorm/p/6757999.html
Copyright © 2020-2023  润新知