smile908

导航

Android模块化开发实例

第一部分 :设计项目架构,我这边创建了三个模块,app模块为项目的主界面,上面有两个按钮,分别来调用另外两个模块,通过按钮实现

主要项目结构为

 

 

 这个界面是app的发布,两个按钮分别调用另外两个模块,在debug版另外两个模块是独立板块,可以运行。但是在整个项目的发布的时候,我们需要将另外的两个模块打包为library,统一通过app模块进行一个调用。

 

 

 我们需要新建一个gradle文件,进行一个测试版和发布板的控制以及第三方库依赖的一个管理,我们将这些模块的第三库抽离出来,模块进行调用,这样我们就能够更好的管理三方库的一个版本问题,避免了代码冗余和一个循环依赖的问题。新建的gradle文件如下。

ext{
isRelease=false

androidx=[
ktx:"androidx.core:core-ktx:1.7.0",
appcompat:"androidx.appcompat:appcompat:1.3.0",
material:"com.google.android.material:material:1.4.0",
constraintlayout:"androidx.constraintlayout:constraintlayout:2.0.4"

]
test=[
junit: "junit:junit:4.13.2",
junit_android:"androidx.test.ext:junit:1.1.3",
espresso:"androidx.test.espresso:espresso-core:3.4.0"
]
}


我们需要用这个gradle必须通过项目的gradle进行引入,在项目的gradle文件中加上你想要引入的gradle文件,如下所示
apply from:'xlc.gradle'

在app-setting模块和vedio模块的gradle文件中,我们会利用是否是发布坂本进行一个判断。如下所示

这部分判断该模块是测试版还是发布版本,如果是发布板,该模块就是一个lib,不能独立运行,可以通过app模块进行一个统一的调用,如果该模块是一个测试版,他就是一个独立的应用,这个模块就可以单独的去运行,方便我们进行一个模块间的一个调试

plugins.apply('org.jetbrains.kotlin.android')
if (isRelease){
plugins.apply("com.android.library")
}else {
plugins.apply('com.android.application')
}


这个地方是安卓的默认配置,但是在独立模块中他不需要就行判断,当他是一个发布版本,他的应用id就不能跟app模块的应用id有一个重复,也可以这样理解,一个完整的应用只能有一个应用id号码。
android {
    defaultConfig {
if (!isRelease){
applicationId "com.example.app_setting"
versionCode 1
versionName "1.0"
}
}
}


这个地方我们需要进行一个判断,因为当项目为发布版本的时候,其他的两个模块将会变成两个lib,供app模块进行一个调用,故我们引入这两个依赖的时候也要进行一个判断,我们将在app的gradle文件中
进行一个依赖的判断,如果是发布版本,就依赖这两个库,如果不是,就不进行一个引用。
dependencies {
dependencies {
implementation androidx.ktx
implementation androidx.appcompat
implementation androidx.material
implementation androidx.constraintlayout
testImplementation test.junit
androidTestImplementation test.junit_android
androidTestImplementation test.espresso
}
if (isRelease){
implementation project(':app-setting')
implementation project(':app-video')
}
}

我们只需要更改gradle的isRelease的属性就可以进行一个版本控制。测试版和发布版的区别如下

 

 

 

 

一个比较关键的地方,当我们修改了gradle的配置信息,我们一定记得同步,不然配置的信息无法生效,项目的版本控制到这里结束啦。

 

 

第二部分,实现第三方依赖的统一管理,我们还是在刚刚的那个配置文件里面进行配置

androidx=[
ktx:"androidx.core:core-ktx:1.7.0",
appcompat:"androidx.appcompat:appcompat:1.3.0",
material:"com.google.android.material:material:1.4.0",
constraintlayout:"androidx.constraintlayout:constraintlayout:2.0.4"

]
test=[
junit: "junit:junit:4.13.2",
junit_android:"androidx.test.ext:junit:1.1.3",
espresso:"androidx.test.espresso:espresso-core:3.4.0"
]
这是项目默认的七个三方库,我们将他们写到gradle中,其他模块的gradle进行调用,注意这是一个依赖的分类,分为Androidx和test两个大类,这两个大类都是map的结构。
我们将app-setting的gradle的依赖进行一个更改,使他能够应用到我们配置的gradle文件。三个模块的依赖部分大致相同,我们举例一个。
dependencies {
implementation androidx.ktx
implementation androidx.appcompat
implementation androidx.material
implementation androidx.constraintlayout
testImplementation test.junit
androidTestImplementation test.junit_android
androidTestImplementation test.espresso
}
这样我们通过类型名加上map的key就能够取到依赖了

 第三部分,我们会发现setting模块和vedio模块的gradle大致相同,要是模块多起来也会造成大量的冗余,所以我们需要提取相同的一个部分,抽离成一个gradle,保留不同的部分,后续我们如果需要进行一个项目配置的更改,我们修改这一个gradle文件即可。这个gradle命名2为common.gradle,因为这是一个公共的gradle。

plugins.apply('org.jetbrains.kotlin.android')
if (isRelease){
plugins.apply("com.android.library")
}else {
plugins.apply('com.android.application')
}
android {
compileSdk 32

defaultConfig {
minSdk 28
targetSdk 33
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
}
kotlinOptions {
jvmTarget = '1.8'
}
}

dependencies {
implementation androidx.ktx
implementation androidx.appcompat
implementation androidx.material
implementation androidx.constraintlayout
testImplementation test.junit
androidTestImplementation test.junit_android
androidTestImplementation test.espresso
}

setting模块的gradle和video模块的gradle如下所示。

apply from:'../x.gradle'
android {
defaultConfig {
if (!isRelease){
applicationId "com.example.app_setting"
versionCode 1
versionName "1.0"
}
}
}
dependencies {
}
apply from:'../x.gradle'
android {
defaultConfig {
if (!isRelease){
applicationId "com.example.app_video"
versionCode 1
versionName "1.0"
}
}
}
dependencies {
}

 

最后,这个分模块开发的一些步骤如上,如果出现问题,可能是compileSdk的版本有问题,如遇到了不可解决的问题:可咨询笔者的QQ:2644277747.

 

posted on 2022-08-11 13:07  smile908  阅读(636)  评论(0编辑  收藏  举报