前言
何为组件化?
即解耦与聚合
。
主要 是代码优化,却不限于代码。
程序员需要 理解整个工序流程,对优化的主体进行拓展。
Think Outside Of The Box
这是对效率的思考,对组织形式的思考。拓展探索现阶段效率的瓶颈。
本文从Gradle的角度去考虑这个问题。
Gradle基础
每个build.gradle是个project对象,Gradle管理着project对象的生命周期。
一、初始化读取settings.gradle,圈定 需要include的module
二、根据gradle生成的索引树,配置project对象,产生tasks。
三、Gradle根据tasks执行相关依赖任务
Gradle优化
每个module都有build.gralde,不同build.gradle的buildToolsVersion、buildToolsVersion等可能会不一样。
这里需要统一的引用
。
一:避免sdk不一致导致的资源重复、包量增大
二:避免编译效率降低,编译时长增加
使用project对象配置
新建config.gradle文件,并配置基础信息
/**全局配置信息及第三方依赖统一管理*/
project.ext {
//统一设置APP配置
setDefaultConfig = { extension ->
//相对于APP中的build.gradle android {}的内容
extension.android {
compileSdkVersion rootProject.compileSdkVersion
buildToolsVersion rootProject.buildToolsVersion
defaultConfig {
minSdkVersion rootProject.minSdkVersion
targetSdkVersion rootProject.targetSdkVersion
versionCode getAppVersionCode()
versionName rootProject.versionName
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
}
}
}
当然在这里,可以进行各种其他配置。
比如setAppDefaultConfig、setLibDefaultConfig、setAndroidConfig进行分别的配置
在各个module中进行引用
在这里,通过调用project.ext获取setDefaultConfig的配置,传入project。
apply from: "${rootProject.rootDir}/config.gradle" //#这里进行了import
android {
project.ext.setDefaultConfig project
}
分开编写共性,为公共库添加引用,可以尽可能的抽取共性逻辑,减少统一修改的地方。
统一管理lib库版本信息
在project的build.gradle中进行基础设置的设置。
buildscript {
//使用这种统一的依赖定义,ide会主动提示版本升级,如果放在config.gradle ide就不会主动提示版本升级
ext {
compileSdkVersion = 28
buildToolsVersion = '27.0.3'
minSdkVersion = 21
targetSdkVersion = 26
versionCode = 1
versionName = "1.3.6"
applicationId = "com.wangxueming.demo"
androidSupportSdkVersion = "27.1.1"
multidex = '1.0.2'
constraintLayoutVersion = '1.1.1'
butterknifeVersion = '8.4.0'
glideVersion = '4.5.0'
retrofitVersion = '2.3.0'
arouterApiVersion = '1.2.4'
arouterCompilerVersion = '1.1.4'
arouterAnnotation = '1.0.4'
}
}
所有的lib有统一的版本管理
避免lib多版本混乱,冲突
减少包大小、减少编译时间
分模块编译
根据组件化的思维,程序员只需要管理 当前需要的功能,module分而治之。
在project的build.gradle配置所有的模块信息
buildscript {
//使用这种统一的依赖定义,ide会主动提示版本升级,如果放在config.gradle ide就不会主动提示版本升级
ext {
buildWholeApp = true
//注意这里只有当buildWholeApp=false时,设置下面的子模块才有用
buildModuleLogin = false
buildModuleFirstPage = false
buildModuleAbout = false
buildModuleAccount = false
buildModuleMy = false
buildModuleCommon = false
}
}
功能module进行独立引用
if (!Boolean.valueOf(rootProject.ext.buildWholeApp)
&& Boolean.valueOf(rootProject.ext.buildModuleLogin)) {
apply plugin: 'com.android.application'
} else {
apply plugin: 'com.android.library'
}
这样就能独立进行编译单独的module
当然,module独立成app进行编译。还需要配套的AndroidManifest以及Application
android{
sourceSets {
main {
if (!Boolean.valueOf(rootProject.ext.buildWholeApp)) {
manifest.srcFile 'src/main/debug/AndroidManifest.xml'
} else {
manifest.srcFile 'src/main/AndroidManifest.xml'
java {
//排除java/debug文件夹下的所有文件
exclude '*debug'
}
}
}
}
}
在android中,配置AndroidManifest的切换,从而达到module独立成application编译的效果
。
大幅减少编译时间。
来看下流程图
小结
改善工作环境 ->改善人的状态 -> 提高工作效率 -> 提升单位产出 -> 绩效提升、幸福感提升
思维模式 很大程度 决定的 思考高度
大部分人都可以站在略微 高一点的高度去思考
熟悉代码的量级、代码规范、工程结构、人员配置,才能切合实际的提升开发和工作方式。