跳至主要內容

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

引领潮流大约 3 分钟Android组件化archive

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',