美文网首页
架构师(三)——组件化部署

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

作者: 王志强_9380 | 来源:发表于2020-11-28 10:27 被阅读0次

    接上文

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

    相关文章

      网友评论

          本文标题:架构师(三)——组件化部署

          本文链接:https://www.haomeiwen.com/subject/cjrpbktx.html