通常来说,我们在项目中引入第三方 SDK 通常有下面几种方式:

添加 JAR 包文件到项目依赖(对应 Java Library);

添加 AAR 包文件到项目依赖(对应 Android Library,包含资源文件、manifest等);

通过 Maven 仓库形式添加远程依赖 (远程依赖库文件,并且可以传递依赖关系);

Android Studio 创建 module 时可以选择类型,当我们选择 Android Library 的形式构建模块,可以打包得到一个 AAR 包。通常开发一个复杂业务流程的 SDK 项目跟一般应用项目一样,会按照业务拆分成多个 module 进行构建,与开发应用的区别在于,SDK 项目在开发阶段处于可随时编译运行状态,打包时要合并多个 module 产出 AAR 形式的 SDK 包。因为每个 module 都会生成对应的 aar 文件,但是一般来说我们不可能针对每个 module 进行单独打包让开发者接入,那么这时候问题就来了,可不可以把多 Module 合并打包成一个 AAR 文件?

首先明确一点的是 Android 没有帮我们实现这一点,如果你针对单个模块打包 AAR 是不会把它依赖 module 一起打进去的。所以也延伸出下面几种尝试解决的方式:

最简单方案:把所有 module 合并成一个 module,变成单独 module 打包的形式,全部交给 Android Studio 帮我们完成,但这又走回了原先代码未拆分前的老路,最不该优先考虑的方案。

使用 maven 管理 aar 依赖方案:使用 maven 仓库进行远程依赖时,可在其 POM 文件中看到依赖关系,添加依赖时会自动导入其依赖的其他库。对于这种多个 module 的情况,我们可以把每个 module 都上传到 maven 库,因为上传时会 POM 文件中会保留 module 之间的依赖关系,最终用户添加某一库时也能正确引入其他依赖的库。缺点是使用这种方式通常需要 gradle 构建,在兼容一些旧版本的 Unity Editor 或其他场景下最好是能直接提供库文件,可作为保留方案考虑。

使用 fat-aar 方案: 开源项目一开始 fat-aar.gradle 实现脚本你就知道,这是针对特地版本下的构建环境,把 module 构建 aar 时依赖的其他模块进行 copy 以及合并进来打包,这部分对开发者来说是透明的,所以整个流程足够简单又够用。但是因为项目输出结构跟构建环境有关,所以兼容性是个很大的问题,当然如果你也可以自己去兼容新版的 gradle 构建环境。

有兴趣的还可以看看这篇文章,里面提到了一些手动修改文件的失败方案: Android 多module合并打包笔记 ,通常这种非常规的方案在万不得已的情况下最好别考虑,因为就算能用但操作也会相当麻烦而且容易出错,还是那句话能自动完成的工作就不要手动操作。

使用 fat-aar 方案:

把 fat-aar.gradle 文件复制到你的打包模块根目录,再修改 module 的 build.gradle 文件:

apply from: 'fat-aar.gradle'

或者直接从 URL 中获取

apply from: 'https://raw.githubusercontent.com/adwiv/android-fat-aar/master/fat-aar.gradle'

第二步:确定模块嵌套的依赖关系

这里可以使用 compile 和 embedded 两个字段来确定嵌套依赖关系,使用 embedded 添加依赖,表示这是要打包嵌套依赖的库。比如你的打包模块 moduleA 需要把其依赖 moduleB 和 moduleC 一起打包进去,而 support 包不需要一起打包进去,那么 moduleA 的 build.gradle 文件就该是 :

dependencies {

compile fileTree(dir: 'libs', include: ['*.jar'])

embedded project(':moduleB')

embedded project(':moduleC')

compile 'com.android.support:appcompat-v7:22.2.0'

}

使用 fat-aar 注意点:

兼容性:目前项目最新支持的 gradle 版本是 2.3.3 版本,新版本的 gradle 编译输出结果目录因为有变动,需要有针对性地重新适配才行。所以一定要注意项目使用的 gradle 版本:

buildscript {

repositories {

google()

jcenter()

}

dependencies {

// warning: current fat-aar only support gradle 2.3.3!

//noinspection GradleDependency

classpath 'com.android.tools.build:gradle:2.3.3'

}

}

R 文件合并问题:如果打包模块和依赖的模块中都存在资源文件,也就是存在 R 文件的引用,这是需要注意 R 文件合并的问题。因为一个 ARR 包只会存在一个 R 文件,使用 fat-aar 打包时会把依赖模块中的 R 文件进行合并,但是因为原先模块中导入的 R 文件包名还是之前的模块的,所以会存在找不到 R 文件的错误。这里看到有其他人说通过修改脚本文件替换 R 文件 import 导包或者把全部资源文件放到打包模块,不过我觉得这样做都不太合理,于是我自己尝试了下面这种方案:

我们知道 R 文件是根据 AndroidManifest.xml 文件的 package 字段内容来生成的对应包名的,比如 module 中 AndroidManifest.xml 的 package 指定为 com.xx.xxx 时,那么该 module 内的 R 文件导包就是:import com.xx.xxx.R 了。我们可以利用这一点,把所有需要打包的 module 的 package name 改成统一的名称,这样的话,所有 R 文件导包就变成一致的了,就算合并后的 AAR 中只存在一个 R 文件也不会存在找不到的问题。

为了避免相同模块使用相同包名导致的编译失败的问题,我们可以使用 enforceUniquePackageName = false 配置各个 module 的 build.gradle 文件,这样可以不强制各 module 使用唯一包名。

BuildConfig 合并问题:因为每个模块也会对应生成 BuildConfig.class 文件,为了在开发阶段可以正常运行,我们还需要处理相同包名时各模块的 BuildConfig.class 合并的问题,这里我们可以选择设置 packageBuildConfig(false) 这样可以让依赖的子模块不把 BuildConfig.class 打包进去,而打包模块可以保留,所以 build.gradle 文件配置如下:

android {

enforceUniquePackageName = false

packageBuildConfig(false)

lintOptions {

abortOnError false

}

}

android多个module打包aar,Android 多 Module 合并打包 AAR相关推荐

  1. android多个module打包aar,android 多module打包aar

    一.打包 aar 1.单个模块打包 打开 Gradle 工具窗口,找到 Android Library 模块. 在 build 任务中双击 assemble. 执行成功后,在 mylibrary/bu ...

  2. android打包规范包含第三方库aar,Android Studio 打包AAR和第三方静态库(示例代码)

    需求 现在有一个第三方库libstatic_add.a和对应的头文件static.h,要求封装一个Module,该Module依赖这个静态库,要求打包的Module包含该静态库. 方案 创建Andro ...

  3. android服务器打包jar,Android Studio打包apk,aar,jar包方法

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

  4. android studio方法的调用树,Android Studio 多层级 Module 对 aar 引用问题解决方法

    最近碰到这么个恶心的问题 问题:有个arr文件被放到Module A中引用,现在Module B又依赖了Module A,则在编译过程中会发生错误,Module B找不到aar文件.(同时如果又有Mo ...

  5. 一个android工程生成两个aar,android studio生成aar包并在其他工程引用aar包(示例代码)...

    1.aar包是android studio下打包android工程中src.res.lib后生成的aar文件,aar包导入其他android studio 工程后,其他工程可以方便引用源码和资源文件 ...

  6. android studio 打包慢,[Android Studio系列(三)]Android Studio 编译、同步慢的解决方法

    1 问题 (1) 当项目中引用的第三方模块太多,打开Android Studio的时候就会非常慢,提示一直在解决模块依赖,点击sync按钮同步第三方代码的时候也是巨慢,慢的原因是: 在gradle中引 ...

  7. android aar编程,AndroidStudio脚本命令指定AAR生成目录与版本号

    A build.gradle全局常量: //根路径 def ROOT_PATH = rootProject.rootDir.path def GROUP = "com.genialsir.m ...

  8. Android 批量打包 基于Walle的多渠道快速打包自动脚本

    Android 批量打包 基于Walle的多渠道快速打包自动脚本 Android Signature V2 Scheme签名下的新一代渠道包打包神器 github主页:https://github.c ...

  9. android 打包版本号,Android打包版本号设置

    之前没有设置过打包的命名,每次打包都是默认的"app-realease.apk",之后手动修改名字来显示出它是一个新版本. 晚上学习了如何配置打包名称,很简单,修改build.gr ...

最新文章

  1. 皮一皮:现在想上个节目一定要注明这些...
  2. JQuery.Ajax 错误调试帮助信息
  3. 第一章--最小的“操作系统”
  4. JSP 热部署 源码解析
  5. 159个故事串起三千年大历史!这套“儿童版史记”太无敌了!
  6. ajax 如何使 dropdownlist 无刷新,Jquery实现无刷新DropDownList联动实现代码
  7. 第二篇:Spring Boot 热部署
  8. Java——枚举:优雅而干净的enum
  9. thymeleaf条件表达式
  10. 清除SQL SERVER日志
  11. linux使用shell脚本利用expect工具实现SCP传输文件到多台服务器
  12. Dos攻击工具burpsuite完整使用指南
  13. 写一个函数,求一个字符串的长度。
  14. Mac 输入法小技巧
  15. HDU - 6287 口算训练
  16. limbo模拟器安装linux,limbo模拟器win10镜像安装使用教程(附下载)
  17. 找出数组中最大元素的位置(下标值)
  18. 任正非文章:一江春水向东流
  19. 基于java的宠物管理系统设计与实现(项目报告+答辩PPT+源代码+数据库+截图+部署视频)
  20. 达内学习的java类库01

热门文章

  1. download sources报错: Cannot connect to the Maven process. Try again later. If the problem persists
  2. python获取B站单个视频的封面
  3. 中小企业的公司财务管理系统
  4. 访问服务器文件夹缩略图加载很慢,win10缩略图加载慢怎么办_win10电脑加载缩略图很慢处理方法-win7之家...
  5. JAVA 学习日志 测试抽象类的程序,每天进步/退步一点点,变化很大哦,努力!
  6. Android activity进出动画,类似于左右拉窗帘效果
  7. 移动端布局三种视口_移动H5的meta视口标签、弹性布局原则和背景图片适配
  8. Linux下怎么进入波浪线目录,linux 波浪线 ~ 使用方法
  9. 【OpenGL】二十一、OpenGL 矩阵压栈与出栈 ( 不同类型矩阵变换先后顺序 | 渲染前不设置单位阵 | 压栈出栈原理分析 | 代码示例 )
  10. Linux--gcc的基本用法