架构师(三)——组件化部署

2020-11-28  本文已影响0人  王志强_9380

接上文

ext {

    // 定义一个项目全局变量isRelease,用于动态切换:组件化模式 / 集成化模式
    // false: 组件化模式(子模块可以独立运行),true :集成化模式(打包整个项目apk,子模块不可独立运行)
    isRelease = false
    ......
}

主模块的build.gradle

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    // 循环引入第三方库
    support.each { k, v -> implementation v }

    implementation project(':common') // 公共基础库

    // 如果是集成化模式,做发布版本时。各个模块都不能独立运行了
    if (isRelease) {
        implementation project(':order')
        implementation project(':personal')
    }
}

组件的build.gradle

if (isRelease) { // 如果是发布版本时,各个模块都不能独立运行
    apply plugin: 'com.android.library'
} else {
    apply plugin: 'com.android.application'
}

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"

        // 这个方法接收三个非空的参数,第一个:确定值的类型,第二个:指定key的名字,第三个:传值(必须是String)
        // 为什么需要定义这个?因为src代码中有可能需要用到跨模块交互,如果是组件化模块显然不行
        // 切记:不能在android根节点,只能在defaultConfig或buildTypes节点下
        buildConfigField("boolean", "isRelease", String.valueOf(isRelease))
    }
    ......
}

组件化和集成化的区别在于 apply plugin和applicationId
组件创建的时候,最好创建为module,如果创建成 library,会缺少manifest配置和activity,组件化的时候还要拷贝过去,比较麻烦

测试环境隔离

// 配置资源路径,方便测试环境,打包不集成到正式环境
sourceSets {
    main {
        if (!isRelease) {
            // 如果是组件化模式,需要单独运行时
            manifest.srcFile 'src/main/debug/AndroidManifest.xml'
        } else {
            // 集成化模式,整个项目打包apk
            manifest.srcFile 'src/main/AndroidManifest.xml'
            java {
                // release 时 debug 目录下文件不需要合并到主工程
                exclude '**/debug/**'
            }
        }
    }
}
上一篇下一篇

猜你喜欢

热点阅读