编译优化:组件aar、源码切换

3,470 阅读3分钟

闲聊

遇到一个项目存在时间比自己开发android的时间还长是一种什么体验,更悲剧的是竟然经历了这个项目重构、组件化。重构的过程犹如过山车,此起彼伏。

“妈蛋,这谁写的代码一个block几百行还没个注释”“妈蛋,这谁写的代码一个block几百行还没个注释” “省略号,一个线性布局,三个texview,文本竟然是它’.,笑出了猪叫声”“省略号,一个线性布局,三个texview,文本竟然是它’.‘,笑出了猪叫声”

组件化完成后,本以为可以登高望远、种豆南山下,过着朝九晚六的悠闲小日子。突然一声:“卧槽,这项目真牛马,一个工程36modulerunapk十分钟”“卧槽,这项目真牛马,一个工程36个module,run apk十分钟”,不和谐的打断了程序员的白日梦......实在编不下去了,直接进入正题。

先让我们思考几个问题

1 经历组件化后,项目moudle剧增,app+libaray一个36个,根据gradle生命周期可知initialization阶段seting.gradle include的每个module会生产一个project将参与后续的编译,所以减少参与编译project很重要。如果把组件都变成aar,以上问题是不是可以得到解决

2 组件化完后,组件之间存在一定的上下级依赖关系,如下图

image.png 想想看这个多个module一个一个、自上而下上传修改,在上传在修改,耗时耗力,这与我们初心不符,有没有办法实现一键上传所有module

3 组件以aar可以有效提高编译、运行效率。但是实际版本迭代开发中,特别是业务组件是需要经常修改代码,实现组件aar与源码切换是必备能力

4 一个工程36个module并列,估计屏幕都装不下,看着就让人头皮发麻,如何让项目工程犹如“Hellow word”一样简洁

解决方案

1 组件源码依赖转为组件aar依赖

上传aar相信大家都知道,搭建nexus仓库,每个module配置uploadArchives脚本代码 image.png 在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的强依赖问题

image.png

一键上传命令: gradlew modulname1:uploadArchieve modulname2:uploadArchieve ... modulnameN:uploadArchieve

3 组件aar、组件源码互切

具体思路参考:blog.csdn.net/a774057695/…

三个列表:1)依赖关系 2)依赖方式 3)依赖规则

image.png

两个任务:1)app-task 2)module-task

image.png

一个方法

image.png

实际使用中我们发现,每次aar/project切换时需要修改depRules-value后,setting.gradle文件也需要同步修改,这不是我们想要的理想状态。

这里我们对规则列表数据做了简单的修改。dupRules定义在setting.grale文件且使用全局对应gradle.ext定义

image.png

4 “伪”多项目结构

参考多项目的思路:setting.gradle配置module相对路径

image.png 优化前的目录结构

image.png

优化后的目录结构

image.png

参考:

blog.csdn.net/a774057695/… blog.csdn.net/hfy8971613/…