提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
复习Android组件化开发架构步骤
一、创建
业务组件层
业务组件层创建的Module采用Phone&Table,也就是创建Module的第一个选项,因为我们将要在此对每个Module进行调试
为了让分层结构更加清晰,通常在命名Module name时,将其的分层名置于Module真正的name之前
基础组件层
基础组件层创建的Module通常采用Library进行创建,同样使其放在指定分层文件夹下
功能组件层
功能组件层通过对基础组件层依赖,不需要从Module和Application进行切换,所以采用Library进行构建
二、进行版本管理
目的
不同的Module依赖库的版本可能不一致,如果不进行统一的版本管理,则可能会因为依赖库的版本不一导致依赖冲突
实施方案如下:
1.在Project的build.gradle下加入以下代码
包含如下信息
- isDebug 判断组件能否单独运行
- android 编译调试版本信息
- applicationId 包含能够单独进行Module运行的包名
- library SDK中依赖库的相关信息
- 其他第三方依赖库信息
2.进行其他Module的信息修改
例如,我们在对业务组件层的main的build.gradle信息进行修改,修改过后如下
def cfg = rootProject.ext
//plugins {
// id 'com.android.application'
//}
if (cfg.isDebug) {
apply plugin: 'com.android.application'
} else {
apply plugin: 'com.android.library'
}
android {
compileSdkVersion cfg.android.compileSdkVersion
buildToolsVersion cfg.android.buildToolsVersion
defaultConfig {
if (cfg.isDebug) {
applicationId cfg.applicationId.login
}
minSdkVersion cfg.android.minSdkVersion
targetSdkVersion cfg.android.targetSdkVersion
versionCode cfg.android.versionCode
versionName cfg.android.versionName
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
javaCompileOptions {
annotationProcessorOptions {
arguments = [AROUTER_MODULE_NAME: project.getName()]
}
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
sourceSets {
main {
if (cfg.isDebug) {
manifest.srcFile 'src/main/debug/AndroidManifest.xml'
} else {
manifest.srcFile 'src/main/AndroidManifest.xml'
}
}
}
}
dependencies {
implementation project(':modulesBase:libBase')
annotationProcessor cfg.libARouterCompiler
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}
定义cfg变量引用Project目录下的build.gradle文件,而后在剩下的代码中进行引用修改
需要注意的是,如果是Debug模式下,每个Module才可以拥有各自的application id,否则则会进行报错
三、依赖LibBase
在需要LibBase的组件的build.gradle中的dependencies中添加如下代码
implementation project(':modulesBase:libBase')
修改LibBase的build.gradle文件,对dependencies中的依赖使用api进行代替,从而使其方便向上传递;从而防止重复依赖
具体代码如下:
def cfg = rootProject.ext
apply plugin: 'com.android.library'
android {
compileSdkVersion cfg.android.compileSdkVersion
buildToolsVersion cfg.android.buildToolsVersion
defaultConfig {
minSdkVersion cfg.android.minSdkVersion
targetSdkVersion cfg.android.targetSdkVersion
versionCode cfg.android.versionCode
versionName cfg.android.versionName
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
api cfg.library.appcompat
api cfg.library.material
api cfg.library.constraintlayout
api cfg.libARouter
api project(':modulesBase:libRouter')
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}
四、修改功能组件层
修改功能组件层的build.gradle,但是不进行传递依赖,因为其他Module可能既依赖基础组件层,也依赖功能组件层
def cfg = rootProject.ext
//plugins {
// id 'com.android.application'
//}
if (cfg.isDebug) {
apply plugin: 'com.android.application'
} else {
apply plugin: 'com.android.library'
}
android {
compileSdkVersion cfg.android.compileSdkVersion
buildToolsVersion cfg.android.buildToolsVersion
defaultConfig {
if (cfg.isDebug) {
applicationId cfg.applicationId.login
}
minSdkVersion cfg.android.minSdkVersion
targetSdkVersion cfg.android.targetSdkVersion
versionCode cfg.android.versionCode
versionName cfg.android.versionName
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
javaCompileOptions {
annotationProcessorOptions {
arguments = [AROUTER_MODULE_NAME: project.getName()]
}
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
sourceSets {
main {
if (cfg.isDebug) {
manifest.srcFile 'src/main/debug/AndroidManifest.xml'
} else {
manifest.srcFile 'src/main/AndroidManifest.xml'
}
}
}
}
dependencies {
implementation project(':modulesBase:libBase')
annotationProcessor cfg.libARouterCompiler
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}
五、修改主工程
plugins {
id 'com.android.application'
}
def cfg = rootProject.ext
android {
compileSdkVersion cfg.android.compileSdkVersion
buildToolsVersion cfg.android.buildToolsVersion
defaultConfig {
applicationId cfg.applicationId.app
minSdkVersion cfg.android.minSdkVersion
targetSdkVersion cfg.android.targetSdkVersion
versionCode cfg.android.versionCode
versionName cfg.android.versionName
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
implementation project(':modulesBase:libBase')
if (!cfg.isDebug) {
implementation project(':modulesCore:main')
implementation project(':modulesCore:login')
}
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'com.google.android.material:material:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}
六、业务组件层debug模式切换
业务组件层,在调试的时候,是需要能够有自己的Activity启动入口,而在真正运行的时候,整个APP的运行入口只能有一个,因此对应不同的AndroidManifest.xml文件
我们可以在业务组件层中创建不同的AndroidManifest文件,而后在Build.gradle中进行调试切换(利用SourceSet进行设置切换)
debug目录下的AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.dongnaoedu.module.main">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.Component_demo">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
作为library运行的AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.dongnaoedu.module.main">
<application>
<activity android:name=".MainActivity" />
</application>
</manifest>
七、切换Module能否单独运行
通过对Project下的isDebug属性进行修改