加入收藏 | 设为首页 | 会员中心 | 我要投稿 汽车网 (https://www.0577qiche.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

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'
}

 

(编辑:汽车网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章