demo地址java
Android組件化專題,詳細講解組件化的使用及配置,以及實現的原理。android
本文章講解了組件化的由來及配置,下期講解頁面路由跳轉及路由原理與aptgit
(摘自百度百科)模塊化是指解決一個複雜的問題時自頂向下逐層把系統劃分爲若干個模塊的過程,各個模塊可獨立工做。github
在技術開發領域,模塊化是指拆分代碼,當代碼特別臃腫的時候,用模塊化將代碼分而治之、解耦分層。bash
在Android的領域模塊化具體的實施方法爲:組件化和插件化。app
更加詳細的講解框架
一套完整的插件化或組件化都必須可以實現單獨調試、集成編譯、數據傳輸、UI 跳轉、生命週期和代碼邊界這六大功能。插件化和組件化最重要並且是惟一的區別的就是:插件化能夠動態增長和修改線上的模塊,組件化的動態能力相對較弱,只能對線上已有模塊進行動態的加載和卸載,不能新增和修改。模塊化
要實現組件化須要考慮的問題主要包括下面幾個:組件化
實現組件化的第一步首先是,整理項目工程結構,明確哪些功能是能夠做爲組件。gradle
建議畫圖整理項目結構,以下圖:
統一整理builde配置以及組件/集成模式的切換,實現組件的單獨調試
ext {
// false 集成模式
// true 組件模式
isComponent = false
androidConfig = [
compileSdkVersion: 27,
minSdkVersion : 19,
targetSdkVersion : 27,
versionCode : 1,
versionName : "1.0"
]
appIdConfig = [
app : "com.prim.component.demo",
moudle1: "demo.prim.com.moudle1"
]
supportLibrary = "27.1.1"
dependencies = [
appcompatv7: "com.android.support:appcompat-v7:${supportLibrary}"
]
}
複製代碼
apply from: "config.gradle"
複製代碼
//配置apply
if (isComponent) {
apply plugin: 'com.android.application'
} else {
apply plugin: 'com.android.library'
}
//獲取config文件中的配置 rootProject 項目的主對象
def config = rootProject.ext.androidConfig
def appIdConfig = rootProject.ext.appIdConfig
def dependenciesConfig = rootProject.ext.dependencies
android {
compileSdkVersion config.compileSdkVersion
defaultConfig {
minSdkVersion config.minSdkVersion
targetSdkVersion config.targetSdkVersion
versionCode config.versionCode
versionName config.versionName
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
//若是moudle爲組件 配置組件的app ID
if (isComponent) {
applicationId appIdConfig.app
}
//配置BuildConfig 代碼中能夠調用判斷moudle是否爲組件
buildConfigField("boolean","isComponent",String.valueOf(isComponent))
//配置資源文件
sourceSets {
main {
if (isComponent) {//若是moudle爲組件則配置 AndroidManifest
manifest.srcFile 'src/main/moudle/AndroidManifest.xml'
// 配置組件模式下的java代碼主文件
java.srcDirs 'src/main/java','src/main/moudle/java'
} else {
manifest.srcFile 'src/main/AndroidManifest.xml'
}
}
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation dependenciesConfig.appcompatv7
implementation 'com.android.support.constraint:constraint-layout:+'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:+'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}
複製代碼
apply plugin: 'com.android.application'
def config = rootProject.ext.androidConfig
def appIdConfig = rootProject.ext.appIdConfig
def dependenciesConfig = rootProject.ext.dependencies
android {
compileSdkVersion config.compileSdkVersion
defaultConfig {
applicationId appIdConfig.app
minSdkVersion config.minSdkVersion
targetSdkVersion config.targetSdkVersion
versionCode config.versionCode
versionName config.versionName
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
//配置BuildConfig 代碼中能夠調用判斷moudle是否爲組件
buildConfigField("boolean","isComponent",String.valueOf(isComponent))
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation dependenciesConfig.appcompatv7
implementation 'com.android.support.constraint:constraint-layout:+'
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'
if (!isComponent){//當moudle1 不爲組件時才容許導入
implementation project(':moudle1')
}
}
複製代碼
下期講解頁面路由跳轉及路由原理與apt。
Android的組件化專題: 組件化配置