第1章 组件单独调试与集成发布
2019-05-13 本文已影响62人
陈桐Caliburn
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',