|
第一部分 :设计项目架构,我这边创建了三个模块,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.
来源:https://www.cnblogs.com/smile908/p/16575704.html |