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

android 专栏收录该内容
16 篇文章 0 订阅

转载:https://www.cnblogs.com/bluestorm/p/6757999.html

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

1

2

3

4

5

repositories {

    flatDir {

        dirs 'xxx/libs' // Module A的libs的目录地址

    }

}

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

 

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

1

2

3

4

5

6

7

8

9

10

11

12

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内容如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

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的全路径
    }
}
  • 0
    点赞
  • 0
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值