最近,把我们的灵机项目拆分了一下,增加模块编译配置,然后,编译和打包速度快了挺多的,记录一下。
主要有两个操作:
一、组件化
之前很多组件都丢在了一个叫lib_plug的module里面,一个大集合,代码和资源文件啥的,都在里面。现在把组件都一个一个拆出来了,拆为 lib_xxxx 这样单独的一个module。module可以单独运行,也可当成是lib模块依赖。组件间通信,都依赖基础的base库,等等这些就不说了,因为组件化,很多大佬们都写了博客,大同小异,差不多。
二、组件上传到仓库
拆完组件,发现,其实有很多组件是万年不更新了的,这样,每次编译都会过一遍,肯定会影响一点速度。那我们同样用一个配置解决,需要修改组件时,用本地module,修改完了传maven,用aar依赖。那这样,速度会快一些。
主要就是上面两个操作,那剩下的就是配置了,怎样通过一个变量来控制组件是否单独运行,是否用maven版本?
1、先在项目的根目录,新建一个 version.gradle 的文件,里面配置组件的信息。类似下面:
class ModuleInfo {
/**
* 是否单独运行
*/
boolean alone
/**
* 是否用maven版本
*/
boolean maven
/**
* 版本
*/
String version
ModuleInfo() {
}
ModuleInfo(boolean alone, boolean maven, String version) {
this.alone = alone
this.maven = maven
this.version = version
}
@Override
String toString() {
return "ModuleInfo{" +
"alone=" + alone +
", maven=" + maven +
", version='" + version + '\'' +
'}'
}
}
ext {
// 组名,防止上传maven的时候覆盖掉其他,可以用包名来代替
moduleGroup = "com.lingjimiaosuan"
// 配置每个组件的状态,是否单独运行,是否用maven版本,版本号
modules = [
"lib_aaa" : new ModuleInfo(false, true, "1.0.0"),
"lib_bbb" : new ModuleInfo(false, true, "1.0.0"),
"lib_ccc" : new ModuleInfo(false, true, "1.0.0"),
"lib_ddd" : new ModuleInfo(false, true, "1.0.0"),
"lib_eee" : new ModuleInfo(false, true, "1.0.0"),
]
// 统一,每个组件module都是这个版本
android = [
compileSdkVersion: 28,
minSdkVersion : 18,
targetSdkVersion : 28,
]
}
2、修改 settings.gradle 的配置文件,读取 version.gradle 里面的配置,看是否要引入module。如下:
// 引入配置文件
apply from: 'version.gradle'
//必用模块,就不需要判断了
include ':app_cn'
if (!ext.modules.get("lib_aaa").maven) {
include ':lib_aaa'
}
if (!ext.modules.get("lib_bbb").maven) {
include ':lib_bbb'
}
if (!ext.modules.get("lib_ccc").maven) {
include ':lib_ccc'
}
if (!ext.modules.get("lib_ddd").maven) {
include ':lib_ddd'
}
3、新建上传maven配置,upload.gradle ,用来上传组件到maven。
//是否提交到仓库
def upload = true
def release = false
def name = project.name
def info = rootProject.ext.modules.get(name)
def vername = info.version
if (upload) {
apply plugin: 'maven'
print('upload library logn to maven...')
group = rootProject.ext.moduleGroup
version = release ? vername : vername + '-SNAPSHOT'
task androidSourcesJar(type: Jar) {
classifier = 'sources'
from android.sourceSets.main.java.sourceFiles
}
artifacts {
archives androidSourcesJar
}
uploadArchives {
repositories.mavenDeployer {
repository(url: MAVEN_R_URL) {
authentication(userName: MAVEN_D_USERNAME, password: MAVEN_D_PASSWORD)
}
snapshotRepository(url: MAVEN_S_URL) {
authentication(userName: MAVEN_D_USERNAME, password: MAVEN_D_PASSWORD)
}
pom.artifactId = name
}
}
}
4、在组件里面引入 upload.gradle,在组件的build加上:
apply from: '../upload.gradle'
当我们对这个组件修改完毕时,就把这个组件上传到maven
5、在APP的build里面配置引用组件
def lib_aaa = "lib_aaa"
def aaaInfo = rootProject.ext.modules.get(lib_aaa)
if (aaaInfo.maven) {
api rootProject.ext.moduleGroup + ":" + lib_aaa + ":" + aaaInfo.version + "-SNAPSHOT"
} else {
api project(':lib_aaa')
}
读取version.gradle的配置,来决定是用maven版本,还是用本地module。
大概这样就ok啦。比如我们要修改aaa模块,就去version.gradle里面修改参数为
"lib_aaa" : new ModuleInfo(false, false, "1.0.0")
然后,就可以对aaa模块,进行修改,修改完了,传完maven,再改回
"lib_aaa" : new ModuleInfo(false, true, "1.0.0")
这样重新编译后,就ok。速度应该是快一点的,可以试下。
网友评论