實(shí)際意義:
將工程各個(gè)模塊分離,并且能夠獨(dú)立運(yùn)行,方便開(kāi)發(fā)和測(cè)試
項(xiàng)目改造步驟
1.項(xiàng)目目錄下創(chuàng)建config.gradle文件,記錄公用的gradle設(shè)置,對(duì)版本等進(jìn)行統(tǒng)一管理
//注意:自定義的變量請(qǐng)使用 ext_ 開(kāi)頭,方便全局搜索
//擴(kuò)展
ext {
//false:組件模式
//true:集成模式
ext_isModule = true
//android的版本相關(guān)設(shè)置
ext_android = [
compileSdkVersion: 26,
minSdkVersion : 14,
targetSdkVersion : 26,
versionCode : 1,
versionName : "1.0"
]
//各個(gè)組件的appId
ext_appId = [
"app" : "com.tyh.wigdit.zujianhua",
"module1": "com.tyh.wigdit.module1",
"module2": "com.tyh.wigdit.module2"
]
//support庫(kù)的版本 recyclerview等都用這個(gè)版本
ext_supportLibrary = "27.0.1"
ext_dependencies = [
"appcompat-v7": "com.android.support:appcompat-v7:${ext_supportLibrary}",
]
}
2.在項(xiàng)目的gradle文件中,引用config.gradle
apply from: "config.gradle"
3.對(duì)library進(jìn)行修改,使其具備在library和application之間進(jìn)行切換的能力
3.1增加library轉(zhuǎn)換成Application后使用的AndroidManifest.xml文件及其他需要的文件夾,如java文件夾等

Library組件化后的文件目錄.png
3.2修改library的build.gradle文件
//通過(guò)ext_isModule控制是application 還是library
if (ext_isModule) {
apply plugin: 'com.android.application'
} else{
apply plugin: 'com.android.library'
}
def cfg = ext_android
def appId = ext_appId
def dependss = ext_dependencies
android {
compileSdkVersion cfg.compileSdkVersion
defaultConfig {
minSdkVersion cfg.minSdkVersion
targetSdkVersion cfg.targetSdkVersion
versionCode cfg.versionCode
versionName cfg.versionName
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
//全局變量-->是否是組件模式
buildConfigField ("boolean","isModule",String.valueOf(ext_isModule))
//增加application狀態(tài)下的其他配置
if (ext_isModule) {
//applicationId
applicationId appId["module1"]
//資源文件
sourceSets {
main{
//manifest文件
manifest.srcFile 'src/main/module/AndroidManifest.xml'
//java資源文件,
//需要給外部使用的,就放在默認(rèn)的文件夾中src/main/java
//不需要給外部使用的,就放在內(nèi)部文件中
java.srcDirs 'src/main/java','src/main/module/java'
}
}
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
implementation dependss["appcompat-v7"]
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}
4 對(duì)app的build.gradle進(jìn)行改造
apply plugin: 'com.android.application'
//引入頂層的build.gradle文件的設(shè)置
def cfg = ext_android
def appId = ext_appId
def dependss = ext_dependencies
android {
compileSdkVersion cfg.compileSdkVersion
defaultConfig {
applicationId appId["app"]
minSdkVersion cfg.minSdkVersion
targetSdkVersion cfg.targetSdkVersion
versionCode cfg.versionCode
versionName cfg.versionName
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation dependss["appcompat-v7"]
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
//組件狀態(tài)下,才去引用各個(gè)組件
if (!ext_isModule) {
implementation project(':module1')
}
}
通過(guò)以上的設(shè)置,項(xiàng)目完成了組件化開(kāi)發(fā)的改造,我們可以通過(guò)config.gradle文件中的ext_isModule變量來(lái)控制組件的狀態(tài)切換,