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

Android Studio多Module使用 aar 依赖包 丢包解决的更多相关文章

  1. Android tips(八)-->Android Studio打包apk,aar,jar包

    文本我们将讲解android studio打包apk,aar,jar包的相关知识.apk包就是android系统的安装包,这里没什么好说的,aar包是android中独有的类库包,而jar包是java ...

  2. Android studio 将 Module 打包成 Jar 包

    整理记录 AndroidStudio 把一个 module 项目打包成 jar 包. 一.默认自动生成的 jar 包 众所周知 android studio 会在library所依赖的 app运行 或 ...

  3. Android Studio打包apk,aar,jar包

    转载请标明出处:一片枫叶的专栏 文本我们将讲解android studio打包apk,aar,jar包的相关知识.apk包就是android系统的安装包,这里没什么好说的,aar包是android中独 ...

  4. Android Studio 打包及引用 aar

    Android Studio 打包及引用 aar 1. 简述 在比较大的 Android 项目的开发中,我们经常会遇到工程.jar 包等等之间相互引用的方式.一般我们通过在 gradle 文件中配置依 ...

  5. 在Xcode5和Android Studio添加工程间的依赖

    正在编辑中,尚未完成 先看看ios的target是什么,请先参看http://www.cocoachina.com/bbs/read.php?tid-10884.html做个大概了解 这里有一篇文章, ...

  6. Android studio 中NameValuePair跟BasicNameValuePair 不能正常导包问题

    Android studio 中NameValuePair跟BasicNameValuePair 不能正常导包问题 针对一个post请求,android studio中无法正常导入以下两个包: imp ...

  7. 记录一个UDP收包丢包的问题

    这几天写GB28181平台接入层代码,对收到的PS包进行解包时,总是出现误码,最终导致rtsp点播服务中画面花屏. 分析了码流抓包数据之后,发现网络上没有丢包,遂认为PS流解包代码有bug,于是埋头分 ...

  8. Android Studio 1.1 使用介绍及导入 jar 包和第三方依赖库

    导入 jar 包 导入 jar 包的方式非常简单,就是在项目中的 libs 中放入你需要导入的 jar 包,然后右键你的 jar 文件,选择“add as a library”即可在你的项目中使用这个 ...

  9. Android Studio 更换国内源下载依赖库

    我的博客:http://daycoding.com 小小程序猿 由于国内GFW的原因,经常导致android studio 莫名其妙的编译不了,多数原因是由于不能下载依赖库 Gradle支持三种不同的 ...

随机推荐

  1. OpenFastPath(1):快平面接口是否支持多ip

    1.配置环境 fp0接口上配置两个IP地址: fp0       Link encap:Ethernet  HWaddr 00:0c:29:30:38:db inet addr:192.168.56. ...

  2. 使用json.dumps转换django queryset的datatime报错问题解决

    转换成json时使用的方法如下: json.dumps(list(models.userlist.objects.values("vu"))) 报错信息如下: Traceback ...

  3. Nginx是如何配置为 Web 服务器的【转载】

    详解 Nginx是如何配置为 Web 服务器的 林涛 发表于:2016-11-29 23:23 分类:WebServer 标签:Nginx,web,web服务器 521次 抽象来说,将 Nginx 配 ...

  4. Notes of Daily Scrum Meeting(11.14)

    Notes of Daily Scrum Meeting(11.14) 今天是项目第三周的周五,按原计划这时我们的项目应该已经要进入尾声进行组装调试了,但由于之前放假还有队员们的 效率比较低的原因,我 ...

  5. OO第二阶段作业总结

    第五次作业:         设计策略: 本次作业设计的基本思路是按照指导书所给的推荐方法来完成的,即共用对象为队列盘,线程有电梯.调度器.以及扫描器,扫描器将控制台输入的有效指令加入到队列盘中,调度 ...

  6. Linux 环境下Web环境搭建————ActiveMQ

    1.下载安装包http://activemq.apache.org/activemq-5143-release.html 2.解压至指定目录 bin目录下为执行脚本 (脚本无法执行需要修改权限(chm ...

  7. servlet的方法解析

    一般来说servlet继承了HttpServlet,我们可以覆盖某些方法来实现自己的功能. Init()和Init(ServletConfig config),我们一般只需覆盖后者,因为这个可以从se ...

  8. Structs2笔记①--structs的背景、structs2框架的意义、第一个helloworld

    Struts2的背景 由出色稳定的框架struts1和webwork框架整合而来的 吸取了两大框架的优点 提高了开发的效率和规范性 更好的实现了MVC架构 解除了与servlet的强耦合性 使用str ...

  9. 【Coursera】基于朴素贝叶斯的中文多分类器

    一.算法说明 为了便于计算类条件概率\(P(x|c)\),朴素贝叶斯算法作了一个关键的假设:对已知类别,假设所有属性相互独立. 当使用训练完的特征向量对新样本进行测试时,由于概率是多个很小的相乘所得, ...

  10. python learning IO.py

    f = open('test.txt', 'r') # 'r' 表示只读 s = f.read() # 调用read()方法可以一次读取文件的全部内容,Python把内容读到内存,用一个str对象表示 ...