1.組件化項(xiàng)目的意義
不相互依賴 ,可以相互交互,高度解耦 ,分模塊打包,測試,便于統(tǒng)一管理....
這里簡單說說 詳細(xì)的可以網(wǎng)上找找資料 這里就不說過多廢話了
2.PhoneModule和android library的區(qū)別,切換
PhoneModule可以獨(dú)立運(yùn)行
ndroid library 只能作為項(xiàng)目的lib
New Module時(shí)候有如下兩個選項(xiàng)
PhoneModule
可以獨(dú)立運(yùn)行的模塊 可以看出app
配置為:apply plugin: 'com.android.application'
有 applicationId
切換: com.android.library
修改: applicationId
android library
新建出android庫,不能獨(dú)立運(yùn)行
配置為:apply plugin: 'com.android.library'
無 applicationId
切換: com.android.application'
修改: applicationId
3.gradle搭建組件化項(xiàng)目環(huán)境
詳情可以克隆項(xiàng)目查看https://github.com/wangcaiwen5/GradleDemo/tree/master
//
ext {
//生產(chǎn) /開發(fā) 環(huán)境 用來切換組件化 集成化
isRelease = false
androidId = [
compileSdkVersion: 29,
buildToolsVersion: "29.0.3",
applicationId : "com.cw.myapplication",
minSdkVersion : 19,
targetSdkVersion : 29,
versionCode : 1,
versionName : "1.0"
]
appId = [
applicationId: "com.cw.myapplication",
app : "com.cw.myapplication",
order : "com.cw.ordermodule",
personal : "com.cw.personal",
]
//生產(chǎn) 測試環(huán)境
url = [
debug : "http://101.2.2.2:debug",
release: "http://101.2.2.20:release",
]
appcompatLibVersion = "1.1.0"
coreKtxLibVersion = "1.2.0"
constraintlayoutLibVersion = "1.1.3"
junitLibVersion = "4.12"
extJunitLibVersion = "1.1.1"
espressoCoreLibVersion = "3.2.0"
dependenciesLib = [
"appcompat" : "androidx.appcompat:appcompat:${appcompatLibVersion}",
"coreKtx" : "androidx.core:core-ktx:${coreKtxLibVersion}",
"constraintlayout": "androidx.constraintlayout:constraintlayout:${constraintlayoutLibVersion}",
"junit" : "junit:junit:${junitLibVersion}",
"extJunit" : "androidx.test.ext:junit:${extJunitLibVersion}",
"espressoCore" : "androidx.test.espresso:espresso-core:${espressoCoreLibVersion}"
]
}
定義config.gradle文件 http://www.reibang.com/p/ae6b78c78531以上代碼可以看到我們定義了isRelease 通過布爾值來控制 是否生產(chǎn) /開發(fā) 環(huán)境 用來切換組件化 集成化
上圖是大概目錄結(jié)構(gòu)
我們可以看下 ordermodule的build.gradle是如何配置的
//注意:這里加了判斷 通過改變isRelease值來控制是集成化還是組件化
if (isRelease) {
apply plugin: 'com.android.library'
} else {
apply plugin: 'com.android.application'
}
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
//這里是讀取config.gradle中的變量
def androidId = rootProject.ext.androidId
def appId = rootProject.ext.appId
def dependenciesLib = rootProject.ext.dependenciesLib
def url = rootProject.ext.url
android {
compileSdkVersion androidId.compileSdkVersion
buildToolsVersion androidId.buildToolsVersion
defaultConfig {
//只有是組件化的時(shí)候 才有applicationId 獨(dú)立運(yùn)行
if (!isRelease) {
applicationId appId.order
}
minSdkVersion androidId.minSdkVersion
targetSdkVersion androidId.targetSdkVersion
versionCode androidId.versionCode
versionName androidId.versionName
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
buildConfigField("boolean", "isRelease", String.valueOf(isRelease))
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
//配置資源路徑 方便測試環(huán)境 ,打包不集成到正式環(huán)境
sourceSets {
main {
if (!isRelease) {
// 如果是組件化模式最疆,需要單獨(dú)運(yùn)行時(shí)
manifest.srcFile 'src/main/debug/AndroidManifest.xml'
/*java.srcDirs = ['src/main/java']
res.srcDirs = ['src/main/res']
resources.srcDirs = ['src/main/resources']
aidl.srcDirs = ['src/main/aidl']
assets.srcDirs = ['src/main/assets']*/
} else {
// 集成化模式杯巨,整個項(xiàng)目打包
manifest.srcFile 'src/main/AndroidManifest.xml'
java {
//release 時(shí) debug目錄下的文件不合并到主工程目錄
exclude '**/debug/**'
}
}
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation dependenciesLib.junit
androidTestImplementation dependenciesLib.extJunit
androidTestImplementation dependenciesLib.espressoCore
implementation project(":library")
dependenciesLib.each { k, v -> implementation v }
}
圖中的personal_module也是同理配置
這些配置好 我們再看app下的build.gradle的主要配置
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
testImplementation dependenciesLib.junit
androidTestImplementation dependenciesLib.extJunit
androidTestImplementation dependenciesLib.espressoCore
/*implementation dependenciesLib.appcompat
implementation dependenciesLib.coreKtx
implementation dependenciesLib.constraintlayout*/
//最簡潔的方式
dependenciesLib.each { k, v -> implementation v }
implementation project(":library")
//這一部分 也是通過isRelease來切換是集成化/組件化
//isRelease為true的時(shí)候ordermodule就相當(dāng)于一個library 所以是集成化
//isRelease為false的時(shí)候ordermodule并不會依賴到app中 他相當(dāng)于一個能獨(dú)立運(yùn)行的項(xiàng)目 所以是組件化
if (isRelease) {
implementation project(":ordermodule")
implementation project(":personal_module")
}
}
4.集成化模式開發(fā)&組件化模式開發(fā)
組件化:可以獨(dú)立運(yùn)行,每個模塊都可以獨(dú)立運(yùn)行
集成化:不可獨(dú)立運(yùn)行,將整個項(xiàng)目打包成apk
5.組件化開發(fā)的臨時(shí)代碼,集成化開發(fā)打包時(shí)的動態(tài)隔離
組件化的好處就是每個模塊可以單獨(dú)運(yùn)行 但是肯定會有開發(fā)時(shí)存在的臨時(shí)調(diào)試用的文件,但是我們又不能正式打包得時(shí)候,打包進(jìn)項(xiàng)目里
下圖我們可以看到有debug目錄 這些就需要我們動態(tài)的去隔離 代碼在最下面
android {
......... 省略
//配置資源路徑 方便測試環(huán)境 ,打包不集成到正式環(huán)境
sourceSets {
main {
if (!isRelease) {
// 如果是組件化模式,需要單獨(dú)運(yùn)行時(shí)
manifest.srcFile 'src/main/debug/AndroidManifest.xml'
/*java.srcDirs = ['src/main/java']
res.srcDirs = ['src/main/res']
resources.srcDirs = ['src/main/resources']
aidl.srcDirs = ['src/main/aidl']
assets.srcDirs = ['src/main/assets']*/
} else {
// 集成化模式努酸,整個項(xiàng)目打包
manifest.srcFile 'src/main/AndroidManifest.xml'
java {
//release 時(shí) debug目錄下的文件不合并到主工程目錄
exclude '**/debug/**'
}
}
}
}
}
最后貼出項(xiàng)目的地址https://github.com/wangcaiwen5/GradleDemo.git