转自:https://www.cnblogs.com/bluestorm/p/6757999.html
我使用了方案2解决
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的全路径 } }
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