组件化开发thor

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

2019-05-13  本文已影响62人  陈桐Caliburn

1、组件化思路

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

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

3、核心逻辑

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、易用性:以用户为中心,编写代码提供插件支持,减少生僻概念,支持用户惯性写法

###是否为主APP
isMainApp=true

###配置方式接入组件
debugComponent=':module_main',\
  ':module_girls',\
  ':module_news'
releaseComponent=':module_main',\
  ':module_girls',\
  ':module_news'

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',
上一篇 下一篇

猜你喜欢

热点阅读