1、Gradle 脚本
在 Android Studio 中,我们经常引用 aar 文件及 maven 库中的资源。一般来说,我们通过 compile 'package:library_name:version'
的方式来引用 maven 库中的包。而通过 compile(name: 'xxx', ext: 'aar')
的方法引用本地生成或其他项目生成的 aar 包(详细请见)。
2、Gradle 引用方式
上面说的本地直接引用 aar 文件的方式有一些问题,比如:
- 资源文件预览等等会有一些 Bug;
- 新生成 aar 后,在多个项目之间共享时,频繁的拷贝同步会很麻烦。
所以我们尝试在本地部署我们的项目,然后在其他项目中直接可以引用了。首先,我们知道,在 Build 脚本运行 compile package:library_name:version
时,会去下面一些目录寻找:
- https://jcenter.bintray.com/package/library_name/version/
- file:/ANDROID_HOME/extras/android/m2repository/package/library_name/version
- file:/ANDROID_HOME/extras/google/m2repository/package/library_name/version
如果你额外在 build.gradle 中自定义配置了本地目录的话,还会去这个目录下面查找,比如在 build.gradle 中配置了:
那么查询的目录会多加四个:
- file:/PROJECT_PATH/commonlibs/library_name.jar
- file:/PROJECT_PATH/commonlibs/library_name-version.jar
- file:/PROJECT_PATH/MODULE_NAME/libs/library_name.jar
- file:/PROJECT_PATH/MODULE_NAME/libs/library_name-version.jar
当在这些目录都找不到依赖后,会运行出错,组建失败。
3、本地部署 aar
在知道了 Gradle 的引用查找原则之后,我们就可以将自己的项目按需部署到本地了。我们一般配置在 ANDROID_HOME/extras/android/m2repository
这个目录中,这样,其他所有工程都可以很方便的访问到,同步更新也只更新一个地方即可。
首先,我们在系统环境变量中设置 ANDROID_HOME
——指向 Android SDK 的安装目录,确保本地部署时能找到相应的目录。
然后,为所需部署的 Module
编写 build.gradle 脚本如下:
我们可以看出,有如下步骤:
-
apply plugin: 'maven'
:引用 maven 插件进行部署; - 增加
uploadArchives
Task,用于部署 Module; - 在
mavenDeployer
中编写相应的配置,包括部署路径、version、groupId、artifactId 等等;
我们可以看到,我们将部署目标路径设为:file://localhost/ANDROID_HOME/extras/android/m2repository/
,这样部署后,相应的 aar、pos、jar 等等文件都会在这个目录中找到。
4、执行部署
执行部署非常简单,我们可以在命令行执行 gradle uploadArchives
这个任务。或者另一种办法是在 Gradle Projects
窗口找到这个 Module 对应的部署 Task,双击执行这个 Task 即可:
在执行完成后,我们在相应的目标目录可以找到部署的文件:
部署完成后,我们在其他工程中,直接 compile 'package:library_name:version'
就可以引用了。Gradle 会自动查找到这个依赖以及相应的库文件,引入到工程中进行组建。
5、多 Module 部署
在比较大的项目中,我们经常会在一个 Project 中拥有多个 Module,而这些 Module 中又有相互引用的情况。比如:
比如这个例子中,project 下有两个 Module,而 ModuleB 又在项目内引用了 ModuleA,这时候,在部署 ModuleB 的时候,为 ModuleB 生成的 pom
文件会有问题:
[站外图片上传中...(image-49af3f-1509673794164)]
我们可以看出,ModuleB 的 pom 中声明引用了 ModuleA,但是 Module A 对应的 groupId
和 version
都不对,这样,在第三方引用 ModuleB 的时候,会出现依赖错误。这个时候,解决办法是在 ModuleA 的 build.gradle 中加入 project.group
和 project.version
,这样在生成 ModuleB 的 pom 的时候,会自动填入这两个值。
ModuleA 的 build.gradle 如下:
如果填写了 project.group
和 project.version
后,就没必要在 mavenDeployer 中填写 pom.groupId
和 pom.version
了,Gradle 会自动使用 project.group
和 project.version
填入。这样,为 ModuleA 和 ModuleB 部署,都不会出现问题了。