美文网首页组件化开发thor
第1章 组件单独调试与集成发布

第1章 组件单独调试与集成发布

作者: 陈桐Caliburn | 来源:发表于2019-05-13 12:34 被阅读62次

    1、组件化思路

    “聚合和解耦是项目架构的基础”,站在组件化项目角度,第一步期望子组件可以作为APP单独调试和壳APP集成发布。好处在于开发者在一个子项目中把子组件作为一个子app开发,而不影响别人。APP上线,发布者只需关心是否合并子组件功能。

    2、单独调试与集成发布需求拆解

    • 1、单独调试:指通过一个标志isRunAlone, 若isRunAlone==true,当前lib项目转化为app项目,反之为lib项目,移除调试代码
    • 2、集成发布:指壳工程,IDE编写代码时,不能引用子组件代码,做到编写隔离,而编译时,又要将子组件代码编译到主项目中,最好配置是在壳工程中gradle.propetties,建议也要支持扩展方法addComponent,以函数方式支持

    3、核心逻辑

    • 1、初始化当前项目
    • 2、获取当前任务类型
    • 3、若当前是壳工程,支持编译隔离
    • 4、若当前是子组件,支持单独调试和发布
    3.1 示例代码
        void apply(Project project) {
            this.mProject = project
    
            //1、初始化当前项目
            initAlone(project)
    
            //2、判断当前任务 只有assemble任务才添加依赖
            assembleTask = getTaskInfo(project)
    
            //3、当前是壳工程 不许被引用
            if (isMainApp(project)) {
                //运行壳工程配置
                runMainApp(project)
                //添加配置依赖
                compileComponents(assembleTask, project)
                //添加扩展方法 (选项) 参数
                project.ext.addComponent = { dependencyName -> addComponent(dependencyName) }
                return
            }
    
            //4、支持单独调试和发布
            runAlone(project)
    
        }
    
    3.2单独调试
        private static final String DEBUG_DIR = "src/main/debug/"
    
        /**
         * 支持单独调试和发布
         */
        private void runAlone(Project project) {
            //1.找当前module的状态
            boolean isRunAlone = fetchAloneStatus(project)
            if (isRunAlone) {
                project.apply plugin: 'com.android.application'
                log("apply plugin is " + 'com.android.application')
                project.android.sourceSets {
                    main {
                        //debug模式下,如果存在src/main/debug/AndroidManifest.xml,则自动使用其作为manifest文件
                        def debugManifest = "${DEBUG_DIR}AndroidManifest.xml"
                        if (project.file(debugManifest).exists()) {
                            manifest.srcFile debugManifest
                        }
                        java.srcDirs = ['src/main/java', "${DEBUG_DIR}java"]
                        res.srcDirs = ['src/main/res', "${DEBUG_DIR}res"]
                        assets.srcDirs = ['src/main/assets', "${DEBUG_DIR}assets"]
                        jniLibs.srcDirs = ['src/main/jniLibs', "${DEBUG_DIR}jniLibs"]
                    }
                }
            } else {
                project.apply plugin: 'com.android.library'
                log("apply plugin is " + 'com.android.library')
                //main下删除所有debug目录下的文件
                project.android.sourceSets.main {
                    //默认这个位置,为代码清晰
                    manifest.srcFile 'src/main/AndroidManifest.xml'
                    //删除所有debug目录下内容
                    java {
                        exclude 'debug/**'
                    }
                    res {
                        exclude 'debug/**'
                    }
                    assets {
                        exclude 'debug/**'
                    }
                    jniLibs {
                        exclude 'debug/**'
                    }
                }
            }
        }
    

    4、插件编写原则

    1、单一职责:一个插件只做好一件事,不要与其他组件化插件功能耦合。
    2、配置化:用户最小情况修改代码,可以带来稳定
    3、易用性:以用户为中心,编写代码提供插件支持,减少生僻概念,支持用户惯性写法

    • 1、单一职责
      单独调试和集成发布功能属于通用功能,即使不做插件化,在开发中也有好处。过于强大插件功能,易用性反而降低,进而限制了

    • 2、配置化
      在根目录下gradle.propetties配置isRunAlone,就可以设置设置项目中组件lib与app形式切换
      在空壳app下gradle.propetties配置,就可以动态引入子组件

    ###是否为主APP
    isMainApp=true
    
    ###配置方式接入组件
    debugComponent=':module_main',\
      ':module_girls',\
      ':module_news'
    releaseComponent=':module_main',\
      ':module_girls',\
      ':module_news'
    
    • 易用性 支持壳工程 addComponent(':module_main')函数,在gradle中引入子组件,配置还支持容错性trimAll不可见字符

    5、使用示例

    根目录配置gradle.propetties

    ##集成与独立模式
    isRunAlone=false
    

    1、壳工程
    gradle配置

    apply plugin: 'thorAlone'
    并且删除原来的app引用
    //apply plugin: 'com.android.application'
    
    //或采用这种方式
    dependencies{
        //组件解耦采用这种方式  assemble 才会引入依赖 build并不引入达到组件间代码隔离
        addComponent(':module_main')
        addComponent(deps.support.multidex)
    }
    

    gradle.propetties

    ###是否为主APP
    isMainApp=true
    
    ###配置方式接入组件
    debugComponent=':module_main',\
      ':module_girls',\
      ':module_news'
    releaseComponent=':module_main',\
      ':module_girls',\
      ':module_news'
    

    2、子组件配置
    gradle配置,删除sourceSets

    apply plugin: 'thorAlone'
    并且删除原来的lib引用
    //apply plugin: 'com.android.library'
    
    //删除 sourceSets
    //sourceSets{
    //main{}
    //}
    

    子组件代码配置


    6、项目代码

    https://github.com/yinlingchaoliu/AndroidComponent

    插件位置
    AndroidComponent/thor_alone_gradle_plugin

    //诸神黄昏
    include ':component:thor_alone_gradle_plugin',
    

    相关文章

      网友评论

        本文标题:第1章 组件单独调试与集成发布

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