最近,把我們的靈機項目拆分了一下,增加模塊編譯配置,然后,編譯和打包速度快了挺多的,記錄一下。
主要有兩個操作:
一、組件化
之前很多組件都丟在了一個叫l(wèi)ib_plug的module里面,一個大集合,代碼和資源文件啥的,都在里面。現(xiàn)在把組件都一個一個拆出來了,拆為 lib_xxxx 這樣單獨的一個module。module可以單獨運行,也可當成是lib模塊依賴。組件間通信,都依賴基礎(chǔ)的base庫,等等這些就不說了,因為組件化,很多大佬們都寫了博客,大同小異,差不多。
二、組件上傳到倉庫
拆完組件,發(fā)現(xiàn),其實有很多組件是萬年不更新了的,這樣,每次編譯都會過一遍,肯定會影響一點速度。那我們同樣用一個配置解決,需要修改組件時,用本地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"
// 配置每個組件的狀態(tài),是否單獨運行,是否用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"),
]
// 統(tǒng)一,每個組件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里面修改參數(shù)為
"lib_aaa" : new ModuleInfo(false, false, "1.0.0")
然后,就可以對aaa模塊,進行修改,修改完了,傳完maven,再改回
"lib_aaa" : new ModuleInfo(false, true, "1.0.0")
這樣重新編譯后,就ok。速度應(yīng)該是快一點的,可以試下。