转载: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文件。
![](http://static.yjs001.cn/uploadpic/2/2d/22dd42420f304c714432fafd6281e4fc.jpg)
![](http://static.yjs001.cn/uploadpic/c/de/cdec0645add3fc3c328197dda5c76203.jpg)
repositories {
flatDir {
dirs '../myLibrary2/libs';dirs 'libs' // 申明本地库,给aar的全路径
}
}