闲聊
遇到一个项目存在时间比自己开发android的时间还长是一种什么体验,更悲剧的是竟然经历了这个项目重构、组件化。重构的过程犹如过山车,此起彼伏。
组件化完成后,本以为可以登高望远、种豆南山下,过着朝九晚六的悠闲小日子。突然一声:,不和谐的打断了程序员的白日梦......实在编不下去了,直接进入正题。
先让我们思考几个问题
1 经历组件化后,项目moudle剧增,app+libaray一个36个,根据gradle生命周期可知initialization阶段seting.gradle include的每个module会生产一个project将参与后续的编译,所以减少参与编译project很重要。如果把组件都变成aar,以上问题是不是可以得到解决
2 组件化完后,组件之间存在一定的上下级依赖关系,如下图
想想看这个多个module一个一个、自上而下上传修改,在上传在修改,耗时耗力,这与我们初心不符,有没有办法实现一键上传所有module
3 组件以aar可以有效提高编译、运行效率。但是实际版本迭代开发中,特别是业务组件是需要经常修改代码,实现组件aar与源码切换是必备能力
4 一个工程36个module并列,估计屏幕都装不下,看着就让人头皮发麻,如何让项目工程犹如“Hellow word”一样简洁
解决方案
1 组件源码依赖转为组件aar依赖
上传aar相信大家都知道,搭建nexus仓库,每个module配置uploadArchives脚本代码 在module build.gradle中 apply from:"upload.grale",上传仓库的脚本就是如此简单。
当然,大家会遇到一种情况,多渠道module上传制定渠道aar的脚本如何写,这个问题再次暂不讨论
2 组件一键上传:compileOnly + pom.whenConfigured
例如:依赖关系A->B->C,按照以往的惯例发布版本,需要先上传C,修改B中C的aar,然后在上传B,依次操作最终完成A、B、C的aar上传,
这种操作弊端很明显:1)按照依赖关系,由下而上,操作繁琐耗时 2 底层aar变更导致上层被动更新aar版本号
分析:不管项目中由多少个aar最终组合一个apk,只要确保apk中能找到需要的类。分析implement、compieOnly的原理,我们可以使用compileOny方式切断组件aar之间的强制关系。
思路是:组件之间依赖使用compileOnly确保编译通过生产aar,最终app组包时使用implemention实现源码真正加入
在实际开发工程中,存在公共资源module被多个业务依赖,compileOnly方式是无法实现资源编译通过,资源依赖必须使用implementation,这样又回到起点的。使用pom.whenConfigured移除资源module,仔细观察pom文件发现之前依赖的资源module不存在了,说明pom.whenConfigured可以解决资源module的强依赖问题
一键上传命令: gradlew modulname1:uploadArchieve modulname2:uploadArchieve ... modulnameN:uploadArchieve
3 组件aar、组件源码互切
具体思路参考:blog.csdn.net/a774057695/…
三个列表:1)依赖关系 2)依赖方式 3)依赖规则
两个任务:1)app-task 2)module-task
一个方法
实际使用中我们发现,每次aar/project切换时需要修改depRules-value后,setting.gradle文件也需要同步修改,这不是我们想要的理想状态。
这里我们对规则列表数据做了简单的修改。dupRules定义在setting.grale文件且使用全局对应gradle.ext定义
4 “伪”多项目结构
参考多项目的思路:setting.gradle配置module相对路径
优化前的目录结构
优化后的目录结构