美文网首页
组件化项目部署

组件化项目部署

作者: 面熟_gson | 来源:发表于2020-02-18 15:44 被阅读0次

    1.组件化项目的意义

    不相互依赖 ,可以相互交互,高度解耦 ,分模块打包,测试,便于统一管理....
    这里简单说说 详细的可以网上找找资料 这里就不说过多废话了

    2.PhoneModule和android library的区别,切换

    PhoneModule可以独立运行
    ndroid library 只能作为项目的lib

    New Module时候有如下两个选项


    1582012482260.jpg
    PhoneModule

    可以独立运行的模块 可以看出app
    配置为:apply plugin: 'com.android.application'
    有 applicationId

    切换: com.android.library
    修改: applicationId

    android library

    新建出android库,不能独立运行
    配置为:apply plugin: 'com.android.library'
    无 applicationId

    切换: com.android.application'
    修改: applicationId

    3.gradle搭建组件化项目环境

    详情可以克隆项目查看https://github.com/wangcaiwen5/GradleDemo/tree/master

    //
    ext {
        //生产 /开发  环境  用来切换组件化 集成化
        isRelease = false
        androidId = [
                compileSdkVersion: 29,
                buildToolsVersion: "29.0.3",
                applicationId    : "com.cw.myapplication",
                minSdkVersion    : 19,
                targetSdkVersion : 29,
                versionCode      : 1,
                versionName      : "1.0"
    
        ]
    
        appId = [
                applicationId: "com.cw.myapplication",
                app          : "com.cw.myapplication",
                order        : "com.cw.ordermodule",
                personal     : "com.cw.personal",
        ]
    
        //生产 测试环境
        url = [
                debug  : "http://101.2.2.2:debug",
                release: "http://101.2.2.20:release",
        ]
    
        appcompatLibVersion = "1.1.0"
        coreKtxLibVersion = "1.2.0"
        constraintlayoutLibVersion = "1.1.3"
        junitLibVersion = "4.12"
        extJunitLibVersion = "1.1.1"
        espressoCoreLibVersion = "3.2.0"
    
    
        dependenciesLib = [
                "appcompat"       : "androidx.appcompat:appcompat:${appcompatLibVersion}",
                "coreKtx"         : "androidx.core:core-ktx:${coreKtxLibVersion}",
                "constraintlayout": "androidx.constraintlayout:constraintlayout:${constraintlayoutLibVersion}",
                "junit"           : "junit:junit:${junitLibVersion}",
                "extJunit"        : "androidx.test.ext:junit:${extJunitLibVersion}",
                "espressoCore"    : "androidx.test.espresso:espresso-core:${espressoCoreLibVersion}"
        ]
    
    }
    

    定义config.gradle文件 https://www.jianshu.com/p/ae6b78c78531以上代码可以看到我们定义了isRelease 通过布尔值来控制 是否生产 /开发 环境 用来切换组件化 集成化

    1582093186802.jpg

    上图是大概目录结构
    我们可以看下 ordermodule的build.gradle是如何配置的

    //注意:这里加了判断  通过改变isRelease值来控制是集成化还是组件化
    if (isRelease) {
        apply plugin: 'com.android.library'
    } else {
        apply plugin: 'com.android.application'
    }
    
    apply plugin: 'kotlin-android'
    apply plugin: 'kotlin-android-extensions'
    
    //这里是读取config.gradle中的变量
    def androidId = rootProject.ext.androidId
    def appId = rootProject.ext.appId
    def dependenciesLib = rootProject.ext.dependenciesLib
    def url = rootProject.ext.url
    android {
        compileSdkVersion androidId.compileSdkVersion
        buildToolsVersion androidId.buildToolsVersion
    
    
        defaultConfig {
            //只有是组件化的时候 才有applicationId  独立运行
            if (!isRelease) {
                applicationId appId.order
            }
            minSdkVersion androidId.minSdkVersion
            targetSdkVersion androidId.targetSdkVersion
            versionCode androidId.versionCode
            versionName androidId.versionName
    
            testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
            buildConfigField("boolean", "isRelease", String.valueOf(isRelease))
        }
    
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            }
        }
    
        //配置资源路径  方便测试环境 ,打包不集成到正式环境
        sourceSets {
            main {
                if (!isRelease) {
                    // 如果是组件化模式,需要单独运行时
                    manifest.srcFile 'src/main/debug/AndroidManifest.xml'
                    /*java.srcDirs = ['src/main/java']
                    res.srcDirs = ['src/main/res']
                    resources.srcDirs = ['src/main/resources']
                    aidl.srcDirs = ['src/main/aidl']
                    assets.srcDirs = ['src/main/assets']*/
                } else {
                    // 集成化模式,整个项目打包
                    manifest.srcFile 'src/main/AndroidManifest.xml'
                    java {
                        //release 时 debug目录下的文件不合并到主工程目录
                        exclude '**/debug/**'
                    }
                }
            }
        }
    
    }
    
    dependencies {
        implementation fileTree(dir: 'libs', include: ['*.jar'])
        implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
        implementation 'androidx.appcompat:appcompat:1.1.0'
        implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
        testImplementation dependenciesLib.junit
        androidTestImplementation dependenciesLib.extJunit
        androidTestImplementation dependenciesLib.espressoCore
        implementation project(":library")
        dependenciesLib.each { k, v -> implementation v }
    }
    
    

    图中的personal_module也是同理配置

    这些配置好 我们再看app下的build.gradle的主要配置

    dependencies {
        implementation fileTree(dir: 'libs', include: ['*.jar'])
        implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
        testImplementation dependenciesLib.junit
        androidTestImplementation dependenciesLib.extJunit
        androidTestImplementation dependenciesLib.espressoCore
    
        /*implementation dependenciesLib.appcompat
        implementation dependenciesLib.coreKtx
        implementation dependenciesLib.constraintlayout*/
    
        //最简洁的方式
        dependenciesLib.each { k, v -> implementation v }
    
        implementation project(":library")
        //这一部分 也是通过isRelease来切换是集成化/组件化
        //isRelease为true的时候ordermodule就相当于一个library  所以是集成化
        //isRelease为false的时候ordermodule并不会依赖到app中   他相当于一个能独立运行的项目  所以是组件化
        if (isRelease) {
            implementation project(":ordermodule")
            implementation project(":personal_module")
        }
    }
    
    

    4.集成化模式开发&组件化模式开发

    组件化:可以独立运行,每个模块都可以独立运行
    集成化:不可独立运行,将整个项目打包成apk
    

    5.组件化开发的临时代码,集成化开发打包时的动态隔离

    组件化的好处就是每个模块可以单独运行 但是肯定会有开发时存在的临时调试用的文件,但是我们又不能正式打包得时候,打包进项目里

    下图我们可以看到有debug目录 这些就需要我们动态的去隔离 代码在最下面

    1582093981812.jpg
    android {
        ......... 省略
    
        //配置资源路径  方便测试环境 ,打包不集成到正式环境
        sourceSets {
            main {
                if (!isRelease) {
                    // 如果是组件化模式,需要单独运行时
                    manifest.srcFile 'src/main/debug/AndroidManifest.xml'
                    /*java.srcDirs = ['src/main/java']
                    res.srcDirs = ['src/main/res']
                    resources.srcDirs = ['src/main/resources']
                    aidl.srcDirs = ['src/main/aidl']
                    assets.srcDirs = ['src/main/assets']*/
                } else {
                    // 集成化模式,整个项目打包
                    manifest.srcFile 'src/main/AndroidManifest.xml'
                    java {
                        //release 时 debug目录下的文件不合并到主工程目录
                        exclude '**/debug/**'
                    }
                }
            }
        }
    
    }
    

    最后贴出项目的地址https://github.com/wangcaiwen5/GradleDemo.git

    相关文章

      网友评论

          本文标题:组件化项目部署

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