gradle管理子模块,上传本地maven库
为什么要这样做:
- AndroidStudio中项目引用了多个模块(module),编译的时候都会把每个模块的代码重新编译一遍,非常耗时,尤其是这些模块的代码基本不怎么改动
- 为了减少不必要的编译时间,把模块现编译好,主工程模块(:app)直接调用编译好的模块
前提准备:
- 在project的build.gradle(和setting.gradlle平级,最外层的build.gradle)先定义本地maven仓库的位置
buildscript {
repositories {
//其他配置语句
...
maven {url 'file://' + "$rootDir" + '/mavenLocalDir'}
}
}
ext {
//其他配置语句
...
MAVEN_LOCAL_PATH='file://' + "$rootDir" + '/mavenLocalDir'
}
- 最终mavenLocalDir在如下的位置(由于文件过多,以下只显示部分重要文件及目录信息)
localhost:myAndroidProject yfjin$ tree
.
├── app
│ └── build.gradle
├── build.gradle
├── mavenLocalDir
├── module1
│ └── build.gradle
├── module2
│ └── build.gradle
└── setting.gradle
Step1 配置模块build.gradle:
- 进入module1(或module2)的build.gradle,添加maven插件和uploadArchives函数
apply plugin: 'com.android.library'
apply plugin: 'maven'
android {
...
}
dependencies {
...
//注意:如果module调用其他库,请使用compileOnly(provided),且在主工程implementation(api或compile)
//模块默认打包是不会把引用库打入aar中的
//example: compileOnly "com.android.support:appcompat-v7:27.0.2"
}
uploadArchives {
repositories {
mavenDeployer {
repository(url: "${rootProject.ext.MAVEN_LOCAL_PATH}")
pom.project {
name 'module1'
groupId 'locallib'
artifactId 'module1'
version '1.0.2.233'
packaging 'aar'
}
}
}
}
- 运行uploadArchives这个task即把编译好的模块上传到了mavenLocalDir目录下。成功后mavenLocalDir会产生一堆文件。
如何运行:
- method1.可以进入moduel1的目录,使用用命令行 ../gradlew uploadArchives
- method2.如果不想用命令行,可以在androidstudio UI界面,展开最右侧的gradle选卡标签,找到module1下的upload中uploadArchives这个task,双击一下就会自动运行了
Step2 主工程引用编译好的模块:
- 进入项目的build.gradle(:app模块下的build.gradle)
dependencies{
//com.android.support:appcompat-v7的版本号建议子模块和主项目相同,你可以把版本号当做变量配置在最外层的build.gradle中,参考教程的ext下的MAVEN_LOCAL_PATH调用
implementation "com.android.support:appcompat-v7:27.0.2"
//如下替换moduel1
// compile project(path: ':module1')
implementation 'locallib:module1:1.0.2.233@aar'
}
注意事项:
- 每次修改模块代码,记得更新一下模块版本,并重新上传(运行一下uploadArchives这个task)
- 当然,如果不想改版本,你可以把mavenLocalDir下的相关模块文件删干净,然后再上传。
- 如果子模块有调用其他模块,记得在主工程引用。运用compileOnly(provided),和implementation(api或compile)