Gradle 运用在组件化中
发布时间:2023-05-18 13:06:12 所属栏目:教程 来源:
导读:我们的项目最开始创建时是集成化模式的,但是由于我们一个团队,有很多人在同时开发一个项目,但是大家都负责各自的模块。这样在集成化的模式下,大家要编译跟大家不相关的别的模块相关的代码。所以就出现的组件化模
我们的项目最开始创建时是集成化模式的,但是由于我们一个团队,有很多人在同时开发一个项目,但是大家都负责各自的模块。这样在集成化的模式下,大家要编译跟大家不相关的别的模块相关的代码。所以就出现的组件化模式。在组件化模式下,各个模块可以独立运行。 集成化模式: 就是打包整个项目,编译出一个全业务功能的 apk 文件。各个子模块不能够独立运行,只能依赖于宿主 App。 组件化模式: 就是每个子模块都能够独立运行,不需要依赖宿主 APP 壳。而且每个模块都能够编译出 apk 文件。 Android 项目中组件化运用 我们下面来具体看下 Android 项目中我们怎么来实施组件化。我们知道我们发布市场肯定是要打一个全功能的 apk 包,也就是发布市场时是需要集成化的打包模式,而我们开发过程中是需要组件化模式的,所以我们需要一个开关来控制组件化和集成化打包模式。我们各个模块都会有编译工具版本,SDK 的版本,support 库的版本号等。我们可以将这些抽离出来,单独建立一个 Gradle 文件来配置这些全局变量。 config.gradle 我们创建一个单独的config.gradle文件,定义全局变量,如下所示: ext { // 定义一个项目全局变量isRelease,用于动态切换:组件化模式 / 集成化模式 // false: 组件化模式(子模块可以独立运行),true :集成化模式(打包整个项目apk,子模块不可独立运行) isRelease = false // 建立Map存储,对象名、key可以自定义 androidId = [ compileSdkVersion: , buildToolsversion: "29.0.0", minSdkVersion : , targetSdkVersion : , versionCode : , versionName : "1.0" ] appId = ["app" : "com.bthvi.modular", "order" : "com.bthvi.modular.order", "personal": "com.bthvi.modular.personal"] supportLibrary = "28.0.0" dependencies = [ // ${supportLibrary}表示引用一个变量 "appcompat" : "com.android.support:appcompat-v7:${supportLibrary}", "recyclerview": "com.android.support:recyclerview-v7:${supportLibrary}", "constraint" : "com.android.support.constraint:constraint-layout:1.1.3", "okhttp3" : "com.squareup.okhttp3:okhttp:3.10.0", "retrofit" : "com.squareup.retrofit2:retrofit:2.5.0", "fastjson" : "com.alibaba:fastjson:1.2.58", ] } 在 build.gradle 中引用 config.gradle 我们要引用我们上面定义的 config.gradle 文件,就需要在项目的根目录下的 build.gradle 中加入以下代码 apply from: "config.gradle" 在 module 中引用公共变量 前面我们在 config 定义了我们各个模块可能都会用到的依赖库,编译版本,sdk 版本版本号等一些公共变量。下面我们就需要将这些变量在 module 的 build.gradle 中引入。这里我创建了一个项目有 common,order,person 以及主模块 app 四个 module,下面我们以 order 为例。 def rootAndroidId = rootProject.ext.androidId def appId = rootProject.ext.appId def support = rootProject.ext.dependencies android { compileSdkVersion rootAndroidId.compileSdkVersion buildToolsversion rootAndroidId.buildToolsversion defaultConfig { if (!isRelease) { // 如果是集成化模式,不能有applicationId applicationId appId.order // 组件化模式能独立运行才能有applicationId } minSdkVersion rootAndroidId.minSdkVersion targetSdkVersion rootAndroidId.targetSdkVersion versionCode rootAndroidId.versionCode versionName rootAndroidId.versionName testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" //当前项目的build.config文件里添加了一个boolean类型的变量 buildConfigField("boolean", "isRelease", String.valueOf(isRelease)) } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } } dependencies { implementation filetree(dir: 'libs', include: ['*.jar']) // 循环引入第三方库 support.each { k, v -> implementation v } implementation project(':common') // 公共基础库 } Tips:这里我们在前面加入了buildConfigField,这个的作用是在当前模块的 build.config 中加入一个 isRelease 的布尔型变量。因为 src 代码中有可能需要用到跨模块交互,如果是组件化模块显然不能跨模块交互的。 在 module 的 build.gradle 中使用 isRelease 开关 我们引入定义的变量后,我们就需要在 module 中引入组件化开关,这里我们用 isRelease 表示,如果 isRelease 为 true,则表示当前为集成化模式,否则当前为组件化模式,各模块可相互独立。 Tips: 我们知道默认创建项目只有 app 模块才能运行,那么我们现在组件化中需要各个模块都能独立运行,那么我们就需要根据 isRelease 开关来控制了。能够独立运行取决于为 build.gradle 第一行引入的是com.android.library还是com.android.application,只有引入后者module才能独立运行。 根据上面的知识,我们应该在 module 中加入: if (isRelease) { // 如果是生产发布版本时,各个模块都不能独立运行 apply plugin: 'com.android.library' } else { apply plugin: 'com.android.application' } (编辑:汽车网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |