前言
想了一下暫時好像也沒什么要逼逼的,那就直接拿起鍵盤來一梭子吧。
1.創(chuàng)建工程
首先在AS上創(chuàng)建一個項目并命名為Component,我們把AS默認生成的app module作為主(host)模塊,然后再創(chuàng)建兩個module分別命名為order、personal,好了此時已經有了三個獨立的模塊,那么如何將這三個模塊關聯(lián)起來是我們下一步要做的事情了。
2.build.gradle配置
三個moudle都能獨自運行,模塊化開發(fā)初衷是要做到模塊之間既可以單獨運行又可以集成在一起,那么現(xiàn)在三個可單獨運行得模塊是如何集成到一起的?目前來看AS是不允許將它們直接關聯(lián)的,所以接下來要修改兩個依賴模塊的build.gradle中的apply plugin屬性:
//apply plugin: 'com.android.application' //表示Android module能單獨運行
//上邊為創(chuàng)建事默認配置,將其改為如下
apply plugin: 'com.android.library' //表示Android library不能單獨運行
這個時候我們創(chuàng)建得三個模塊就可以通過Procejt Structure(Ctrl+alt+shift+s)來關聯(lián)起來了,

至于如何依賴Android Library這里就不做細說了。
通過上邊修改配置增加兩個(order&personal)模塊的依賴,目前主模塊App已經可以調用home和personal中的界面了,現(xiàn)在這和要實現(xiàn)的目標還差很遠,由于要同時管理多個模塊的build.gradle文件,所以這里我們要引入一個公共的配置config.gradle。
3.config.gradle創(chuàng)建與配置
我們在工程的根目錄下右鍵創(chuàng)建File并命名為config.gradle,在文件添加ext{}屬性,這ext中就可以加入我們需要配置的公共項了,
ext{
//組件化|集成化開關
isDebug = false
// 包名,用于存放APT生成的類文件
packageNameForAPT = "per.xxx.modular.apt"
//項目中的服務器地址
url = [
debug:'http://127.0.0.1/',
release:'http://release/',
]
android = [
"compileSdkVersion": 29 ,
"buildToolsVersion": "29.0.2"
]
defaultConfig = [
"minSdkVersion": 21 ,
"targetSdkVersion": 29,
"versionCode": 1,
"versionName": "1.0",
"testInstrumentationRunner":"androidx.test.runner.AndroidJUnitRunner"
]
applicationId = [
"app":"per.xxx.modular_app",
"order":"per.xxx.modular_order",
"personal":"per.xxx.modular_personal"
]
//模塊中的依賴庫
dependencies = [
"appcompat":"androidx.appcompat:appcompat:1.1.0",
"constraintlayout":"androidx.constraintlayout:constraintlayout:1.1.3",
"recyclerview":"androidx.recyclerview:recyclerview:1.2.0-alpha01"
]
}
然后引入該配置文件,在工程的build.gradle中最外層添加
apply from: "config.gradle"
那么這個時候我們三個模塊就可以通過該配置文件統(tǒng)一管理了。
4.如何使用config.gradle中配置項
在各個模塊的build.gradle中可以通過rootProject.ext來獲取config.gradle配置的屬性,這里將rootProject.ext 賦值到一個變量def rootSet = rootProject.ext,然后在android和dependencies標簽中我們就可以替換掉原來的配置項了,如下
//order模塊的配置
def rootSet = rootProject.ext
if(rootSet.isDebug){//這里可以通過布爾值來切換是否可以單獨運行
apply plugin: 'com.android.application'
}else {
apply plugin: 'com.android.library'
}
android {
compileSdkVersion rootSet.android.compileSdkVersion
buildToolsVersion rootSet.android.buildToolsVersion
defaultConfig {
if(rootSet.isDebug){
applicationId rootSet.applicationId.personal
}
minSdkVersion rootSet.defaultConfig.minSdkVersion
targetSdkVersion rootSet.defaultConfig.targetSdkVersion
versionCode rootSet.defaultConfig.versionCode
versionName rootSet.defaultConfig.versionName
testInstrumentationRunner rootSet.defaultConfig.testInstrumentationRunner
//傳入APT參數(shù)
javaCompileOptions {
annotationProcessorOptions {
arguments = [moduleName: project.getName(), packageNameForAPT: packageNameForAPT]
}
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
sourceSets {
main{
if(rootSet.isDebug){
manifest.srcFile 'src/main/debug/AndroidManifest.xml'
}else {
manifest.srcFile 'src/main/AndroidManifest.xml'
// exclude{
// java{
// '**/debug/**'
// }
// }
}
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
//此處通過遍歷Map方式來循環(huán)引入依賴,減少代碼
//也可以通過implementation rootSet.dependencies.appcompat 單獨引入
rootSet.dependencies.each{k,v -> implementation v }
api project(':common')//此為公共組建
//測試相關庫
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test:runner:1.2.0'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}
可以看到我們通過rootSet.android.鍵來引入需要配置的值,這樣做好處是只用修改config.gradle中的內容即可,便于統(tǒng)一管理,其中有兩處用到了isDebug屬性,這里大家應該能猜到其用處就是來區(qū)分是否能單獨調試該模塊的,需要注意的是App模塊中是不需要加這兩處判斷的,因為App自始至終都是可以單獨運行的,但是需要在dependencies 中加入如下判斷:
if (!rootSet.isDebug) {
implementation project(':order')
implementation project(':personal')
}
否則,切換為單獨調試模式時,我們的app會提示模塊之間不能相互依賴的錯誤。
至此項目的grdle配置已經差不多了。