如何优雅的导入 AAR 文件

和 JAR 一样,AAR 也是一种软件模块化封装提高可复用性的方式。相比于 JAR,AAR 除了 Java 代码之外还能打包 Android App 资源(如:String、Drawable 等等)、JNI 库文件(.so),AAR 仅能用于 Android 软件而 JAR 则 Java 软件通用。将一些常用的、通用的功能代码或是界面封装到一个 AAR 模块里,以便后续再次使用,是提升开发效率的好做法。

自 Androd 操作系统发布以来,Google 对 Android 的技术更新一直都比较频繁,Android App 开发以及 Android Studio、Gradle 的使用也时常发生变化,从而导致两三年前的代码放到现在就未必是最科学最优雅的。本文接下来即介绍一种优雅的导入 AAR 文件的方法。_本文内容简单且基础_。

自定义 AAR 文件名,自动复制输出文件

既然是优雅的导入,那首先要优雅的输出 AAR 文件。下面的代码是重定义输出文件名称,并且在构建完成时复制输出文件到目标目录(默认的输出路径比较深,手动复制麻烦)。

android {
    ...//省略部分代码
    libraryVariants.all { variant ->
        def aarVersion = android.defaultConfig.versionName
        variant.outputs.all { output ->
            if (outputFileName != null && outputFileName.endsWith('.aar')) {
                //custom aar file name
                outputFileName = "${archivesBaseName}-${aarVersion}.aar"
                //copy aar file
                variant.assemble.doLast {
                    copy {
                        from outputFile
                        into '../[AAR]'
                    }
                }
            }
        }
    }
}
  • outputFileName 即输出文件名称,这里被改为:“模块名-版本号.aar” 的形式。
  • variant.assemble.doLast 添加装配完成动作,复制输出文件到上一层目录的 [AAR] 下,模块的 build.gradle 所在目录为当前目录,复制到的目标文件夹如果不存在会自动创建。

比如模块名称是 XinLake 模块版本号为 1.0.0,则输出文件为 XinLake-1.0.0.aar,该文件将会复制到项目目录的 [AAR] 下。

导入 AAR 文件

AAR 模块可以直接被导入,导入动作将会把 AAR 模块工程复制到项目目录下,后续修改调试均使用项目目录下的代码文件。不过,一个公共模块不需要针对项目应用而修改,直接导入 AAR 文件即可。(这里不讨论公共仓库服务器上的 AAR 导入)

参考 Gradle 官方文档,文件依赖的代码:configurationName files('a file')。在模块的 build.gradle 添加文件即可导入 AAR,不需要做其他任何设置。下面的代码是导入 AAR 文件的例子。

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation files('libs/XinLake-1.0.0.aar') //example
    implementation 'com.android.support:design:27.1.1'
    implementation 'com.android.support:support-v4:27.1.1'
    implementation 'com.android.support:support-annotations:27.1.1'
}

如果有多个 AAR 文件导入,用逗号隔开就行如: implementation files('libs/XinLake-1.0.0.aar','Knight-1.0.0.aar') 也可以这样,包含目录下的所有 AAR 文件: implementation fileTree(dir: 'libs', include: ['*.aar']) 文件路径也可以是绝对路径,不过 Android Studio 会提示避免使用绝对路径信息, “Avoid using absolute paths …” ,“to keep projects portable and repeatable”

本文使用的开发环境为 Android Studio 3.1.4。代码仅供参考


2018-09-11