项目模块优化总结
一、问题分析
- 随着迅捷开发进行,破窗效应日渐明显,没有代码审查互检,为方便需求随意添加的资源和三方sdk,加重了项目构建压力,也增加了项目的体积
- 老的框架已经不能负担插拔的需求,需要将新引进的aop和flutter做好隔离处理
- 需要将开发和测试的版本区分开来,在保证开发的高效编译的前提下,又不能影响测试时项目的完备性
二、方案
1.结构设计
-
将app层独立,可以保证app层独立运行,代码中需要的class可以通过中间件(仅与toolcore联系)或者aar拿到,从而实现与模块层断开链接
-
需要资源独立,不能拿模块中的res
-
application中做好开关控制,当模块卸载时会引起异常的初始化要用开关控制
-
这些模块的控制开关要做好isDev的总开关控制,可以一键控制好模块的集成
-
这样做以后的模块需要替换的资源要整合到app层,以前用duiacore承接的,现在都合并了,app层的代码量和资源量增加
-
module的设计
-
资源独立,每个模块需要给资源文件加上前缀防止和别的模块冲突,记得总结可以替换的颜色、文案、图片的命名,方便其他app集成
-
数据通信,需要从app层获取的数据或操作可以通过初始化回调完成,或者通过广播完成
-
对于模块比较大的,建议使用中间件进行隔离,因为即使有线上aar但项目在构建时文件越少资源越少构建越快
-
对应没有中间件的模块,每次有api变动时(即app层有相关代码变动)都要重新打个新的aar发到mevan并变更本地依赖的版本
-
建议需要提供模块的不同app,有个公用的工具module
-
用来存放不同模块的中间件
-
项目中的公共资源,ps图片,文案,颜色(建议用cl_小写英文和数值 命名)等,除色值用通用的命名外其他的资源需要加上前缀,防止冲突
-
对于好用的工具代码,建议添加readme,向不用app展示成果,向开源致敬
2.gradle优化
- 项目中目前tinker最高用到5.4.1 greendao最高用到5.6.4 项目若没有这些建议用最新的gradle体验急速
- 项目中创建gradle.properties,优化参数
- org.gradle.jvmargs=-Xms2048m -Xmx4096m//设置jvm内存
- org.gradle.parallel=true//并行执行构建task
- org.gradle.configureondemand=true//启用新的孵化模式
- 项目下的build.gradle
- buildscript中的repositories用来给gradle.plugin设置寻址的,主要优化下面的allprojects->repositories,让只有个别module用的地址就不要出现在这里了,可以放在module的build里,防止给sdk寻址时造成过多尝试
- module下的build.gradle
- android层设置aaptOptions {cruncherEnabled = false useNewCruncher = false}减少.9.png的检测
- android层defaultConfig下resConfigs “zh-rCN”//string 只保留中文 还以减少drawable的引用
- dependencies层下尽量使用implementation控制依赖关系,加速构建
- dexoptions如下,线程数不能乱写,最多和cup的核数-1
dexOptions {
//使用增量模式构建
incremental true
//最大堆内存
javaMaxHeapSize "8g"
//是否支持大工程模式
jumboMode = true
//预编译
preDexLibraries = true
//线程数
threadCount = 4
}
3.分析task中耗时多的
- aop的一般都是gradle.plugin中的task,只需要在开发情况下不依赖插件即可如mobtransform 和lancettranform
- app:mergeDebugResources 和 app:mergeDebugjavaWithJavac这就只能减少res和class优化了
- app:mergeDebugNativeLibs 这个可以在module build中指定ndk对应的平台如arm64-v8a
三、成果
- 极限情况下(只剩app和工具module),先clean再build的构建速度提升80%(从8-10分钟到1-2分钟),项目体积从157M到40M
- 改动一行代码再运行起来的平均时间从4分钟优化到40s左右
四、工具分享
- sharesdk改为线上依赖后编译速度严重变慢,我通过查找项目中用到的class,用jar -cvf dev_share.jar *生成jar包用来做开发时隔离
- flutter的隔离用到了flutter生成的flutter_embedding.jar来隔离
- 对于这些只用来开发时加速的jar或aar,build.gradle中不要直接把libs都依赖,需要依赖指定文件