美文网首页组件化开发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章 组件单独调试与集成发布

    1、组件化思路 “聚合和解耦是项目架构的基础”,站在组件化项目角度,第一步期望子组件可以作为APP单独调试和壳AP...

  • Android组件化

    1、本文主要内容 什么是组件化 组件化要解决的问题 组件的单独调试及集成 组件间通信 组件界面跳转 主项目获取并显...

  • Flutter module方式集成到iOS工程中

    本篇讲述Flutter module如何集成、调试、打包发布三个问题 一、集成 Flutter module集成方...

  • Android(49)组件化开发

    组件化的优势 加快编译速度:每个业务组件都可单独运行调试,速度提升很多。提高协作效率:每个组件都有专人维护,不用关...

  • AliHotFixDebug 本地调试用法

    一、为什么要单独写本地调试的用法 在集成AliHotFix的过程中,发现官方文档对于本地调试的文档支持几乎没有,导...

  • Android 组件化方案探索与思考

    组件化项目,通过gradle脚本,实现module在编译期隔离,运行期按需加载,实现组件间解耦,高效单独调试。 本...

  • Android笔记:Android 组件化方案探索与思考

    组件化项目,通过gradle脚本,实现module在编译期隔离,运行期按需加载,实现组件间解耦,高效单独调试。 本...

  • Android组件化手写实践

    组件化就是将一个app分成多个Module,每个Module都是一个组件,开发的过程中可以单独调试部分组件,也可以...

  • vue基础概念介绍

    组件化 vue的组件化是指把传统的html, css, js资源集成到一个.vue文件中,组成一个单独的组件,被其...

  • Android 组件化实践-最简Demo

    背景 什么是组件化?组件化就是模块化,在Android工程实践中可以实现单独编译、运行、调试。 --个人见解 为什...

网友评论

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

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