【Android 组件化】使用 Gradle 实现组件化 ( 组件模式与集成模式切换 )
文章目录
- 一、模块化 与 组件化 模式控制
- 二、applicationId 设置
- 三、使用 sourceSets 配置组件模式下使用的清单文件
- 四、组件模式 与 集成模式 切换示例
- 五、完整的 Gradle 配置
- 1、Project 层级的 build.gradle
- 2、Project 层级的扩展变量定义
- 3、主应用的 build.gradle
- 4、Library 模块的 build.gradle
- 六、博客资源
上一篇博客 【Android 组件化】使用 Gradle 实现组件化 ( Gradle 变量定义与使用 ) 中 , 在顶层的 build.gradle 中定义了相关参数变量 ;
在顶层的 build.gradle 中定义全局的变量 , 用于统一管理各个 Module 的编译相关版本号 ;
全局变量可以定义在 ext 扩展 中 , 也可以定义在 gradle.properties 属性 中 ;
组件化的本质就是可以实时切换依赖库 Module 的属性 , 该 Module 是 Application 可执行模块 , 还是 Library 依赖库模块 ;
一、模块化 与 组件化 模式控制
在顶层 build.gradle 定义扩展变量 , 用于标识当前是 模块化模式 还是 组件化模式 , 模块化模式 就是默认的模式 ;
// ext 是 extension 扩展的含义 // ext 后的 {} 花括号 , 是闭包 , ext{// 是否是模块化模式// 集成模式 true ( 默认模式 , 模块化 )// 组件模式 false ( 组件化 )isModuleMode = false }如果将变量定义在 build.gradle 构建脚本中 , 需要使用 ext 扩展变量 , 在 gradle.properties 可以直接定义 ;
在 Application Module 下的 build.gradle 保持不变 :
apply plugin: 'com.android.application' apply plugin: 'kotlin-android'在 Library Module 下的 build.gradle 中控制当前 Module 是 Application 模块还是 Library 模块 ;
// 根据 isModuleMode 动态切换 集成模式 / 组件模式 if (isModuleMode){// 集成模式apply plugin: 'com.android.library' }else{// 组件模式apply plugin: 'com.android.application' } apply plugin: 'kotlin-android'二、applicationId 设置
Application 模块在 " android/defaultConfig " 层级下 , 必须有 applicationId ;
Library 模块不需要配置 applicationId ;
这里需要进行分别处理 , 如果是 Library 模块 , 在 组件模式 下 , 必须配置 " android / defaultConfig / applicationId " 选项 ; 但是在 集成模式 下 , 必须不能配置 " android / defaultConfig / applicationId " 选项 ;
主要配置如下 : 在 集成模式 下 , 不配置 applicationId ; 在 组件模式 下 , 才配置 applicationId 选项 ;
android {defaultConfig {if (!isModuleMode){// 组件模式 : 必须配置 applicationIdapplicationId appId["library1"]}} }注意 : 在 Application Module 下不进行上述配置 , 只有在 Library Module 下才进行上述配置 ;
三、使用 sourceSets 配置组件模式下使用的清单文件
使用 sourceSets 资源配置选项 , 可以配置 java , manifest , res , assets , 等目录 ;
Android Studio 中
- 默认的 Java 代码的路径是 Component\app\src\main\java ,
- 默认的清单文件路径是 Component\app\src\main\AndroidManifest.xml ,
- 默认的资源路径是 Component\app\src\main\res ,
- 默认的 Assets 资源路径是 Component\app\src\main\assets
在 Library Module 中 , 一般不会配置 Launcher Activity , 因此在 组件模式 下 , 需要指定一个新的 AndroidManifest.xml 清单文件 ;
这里在 main 目录下创建 component 目录 , 组件化 相关文件 , 都放在该目录中 ;
下图中 , 蓝色矩形框中是默认的清单文件 , 在 集成模式 下的 Library Module 中使用 ; 红色矩形框中是 组件模式 下使用的清单文件 , 在 Application Module 中使用 ;
配置 清单文件 示例 :
android {compileSdkVersion androidConfig.compileSdkVersionbuildToolsVersion "30.0.3"defaultConfig {if (!isModuleMode){// 组件模式 : 必须配置 applicationIdapplicationId appId["library2"]}// 资源配置sourceSets{main{if (!isModuleMode){// 组件化模式下使用 ComponentAndroidManifest.xml 作为清单文件manifest.srcFile 'src/main/component/AndroidManifest.xml'}}}} }四、组件模式 与 集成模式 切换示例
将 component.gradle 中的 isModuleMode 变量设置为 true , 当前的模式就是默认的模块化模式 ;
编译后效果如下 : 111 个 Application 应用 , 222 个 Library 应用 ;
将 component.gradle 中的 isModuleMode 变量设置为 false , 当前的模式就是 组件模式 ;
编译后效果如下 : 333 个 Application 应用 ;
五、完整的 Gradle 配置
1、Project 层级的 build.gradle
// Top-level build file where you can add configuration options common to all sub-projects/modules.// 将 component.gradle 配置文件中的内容导入到该位置 // 相当于引入头文件 apply from: "component.gradle"buildscript {ext.kotlin_version = "1.4.10"repositories {google()jcenter()}dependencies {classpath "com.android.tools.build:gradle:4.1.0"classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"// NOTE: Do not place your application dependencies here; they belong// in the individual module build.gradle files} }allprojects {repositories {google()jcenter()} }task clean(type: Delete) {delete rootProject.buildDir }
2、Project 层级的扩展变量定义
// ext 是 extension 扩展的含义 // ext 后的 {} 花括号 , 是闭包 , ext{// 是否是模块化模式// 集成模式 true ( 默认模式 , 模块化 )// 组件模式 false ( 组件化 )isModuleMode = false// 定义 android 变量 , 类型是字典 Map 集合// 其中定义了若干键值对集合androidConfig = [compileSdkVersion : 30,minSdkVersion : 18,targetSdkVersion : 30,versionCode : 1,versionName : "1.0"]applicationId = ["app" : "kim.hsl.component","library1" : "kim.hsl.library1","mylibrary2" : "kim.hsl.library2",]// androidx 版本号androidxVersion = "1.2.0"// 统一管理依赖库dependencies = [// ${} 表示引用之前定义的变量"appcompat" : "androidx.appcompat:appcompat:${androidxVersion}"] }
3、主应用的 build.gradle
apply plugin: 'com.android.application' apply plugin: 'kotlin-android'println("Print Variable : rootProject.ext.androidConfig : ${rootProject.ext.androidConfig}")// def 相当于 Java 中的 Object // 声明 config 和 appId 变量 , 并为其赋值 def androidConfig = rootProject.ext.androidConfig def appId = rootProject.ext.applicationIdandroid {compileSdkVersion androidConfig.compileSdkVersionbuildToolsVersion "30.0.3"defaultConfig {applicationId appId["app"]minSdkVersion androidConfig.minSdkVersiontargetSdkVersion androidConfig.targetSdkVersionversionCode androidConfig.versionCodeversionName androidConfig.versionNametestInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}}compileOptions {sourceCompatibility JavaVersion.VERSION_1_8targetCompatibility JavaVersion.VERSION_1_8}kotlinOptions {jvmTarget = '1.8'} }dependencies {implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"implementation 'androidx.core:core-ktx:1.3.2'implementation 'androidx.appcompat:appcompat:1.2.0'implementation 'com.google.android.material:material:1.3.0'implementation 'androidx.constraintlayout:constraintlayout:2.0.4'testImplementation 'junit:junit:4.+'androidTestImplementation 'androidx.test.ext:junit:1.1.2'androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'if (isModuleMode){// 集成模式下才能引用这两个 Library Moduleimplementation project(':library1')implementation project(':library2')} }
4、Library 模块的 build.gradle
// 根据 isModuleMode 动态切换 集成模式 / 组件模式 if (isModuleMode){// 集成模式apply plugin: 'com.android.library' }else{// 组件模式apply plugin: 'com.android.application' } apply plugin: 'kotlin-android'println("Print Variable : rootProject.ext.androidConfig : ${rootProject.ext.androidConfig}")// def 相当于 Java 中的 Object // 声明 config 和 appId 变量 , 并为其赋值 def androidConfig = rootProject.ext.androidConfig def appId = rootProject.ext.applicationIdandroid {compileSdkVersion androidConfig.compileSdkVersionbuildToolsVersion "30.0.3"defaultConfig {if (!isModuleMode){// 组件模式 : 必须配置 applicationIdapplicationId appId["library1"]}minSdkVersion androidConfig.minSdkVersiontargetSdkVersion androidConfig.targetSdkVersionversionCode androidConfig.versionCodeversionName androidConfig.versionNametestInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"// 资源配置sourceSets{main{if (!isModuleMode){// 组件化模式下使用 ComponentAndroidManifest.xml 作为清单文件manifest.srcFile 'src/main/component/AndroidManifest.xml'}}}}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}}compileOptions {sourceCompatibility JavaVersion.VERSION_1_8targetCompatibility JavaVersion.VERSION_1_8}kotlinOptions {jvmTarget = '1.8'} }dependencies {implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"implementation 'androidx.core:core-ktx:1.3.2'implementation 'androidx.appcompat:appcompat:1.2.0'implementation 'com.google.android.material:material:1.3.0'implementation 'androidx.constraintlayout:constraintlayout:2.0.4'testImplementation 'junit:junit:4.+'androidTestImplementation 'androidx.test.ext:junit:1.1.2'androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' }
六、博客资源
博客源码 :
- GitHub : https://github.com/han1202012/Component
- CSDN 下载 : https://download.csdn.net/download/han1202012/18742538
总结
以上是生活随笔为你收集整理的【Android 组件化】使用 Gradle 实现组件化 ( 组件模式与集成模式切换 )的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 【Android 组件化】使用 Grad
- 下一篇: 【Android 组件化】使用 Grad