Android 编译速度优化方案

Android 编译速度优化方案

一、背景描述

在项目体量越来越大的情况下,编译速度也随之增长,目前在以下配置的机器全部编译一次少则5分钟,多则10多分钟,严重影响开发效率

在这里插入图片描述

有时候一个小的改动也需要等待长达好几分钟的编译时间,基于这种情况下,查找能够提高编译效率的方案成为必须要做的待办事项。

经过几天的调研,发现了以下方案可以提高项目的编译效率:

  1. 目前开源编译方案RocketX,通过在编译流程替换module为aar方式,提高 全量编译的速度
  2. 在编译时,选择不编译部分moudle来节省编译时间

二、效果展示

  1. 目标项目一共50万+行java代码和资源文件,全量编译取中间值7分钟
  2. 通过以上方案,全量变量去平局值在3分钟,减少大约在4分钟的时间,提升构建效率50%

三、思路

一、在编译时,选择不编译部分moudle来节省编译时间

  1. 目前项目中使用了阿里的ARount来做组件化子模块之间间的通信方案,那么module与module之间就解耦开,不必各个模块之间相互引用,在编译的时候,如果不引入该模块是可以通过编译,并且正常运行起来,只是在设计到该模块的功能时,无法使用,所以在开发的时候,要确定目前不引入的模块跟正在开发的模块之间不存在调用问题,便可以正常的开发,调试,运行

  2. 这种方式会存在线上版本忘记修改为全模块编译的风险,因此目前的解决方案是在编译的gradle文件中去判断当前的Build 模式中是否包含Release,如果是则表明目前是在打正式包,那么直接抛出编译错误的提示,开发人员看到该提示时,就会知道忘记把快速编译开关关闭,通过这种方式来解决。

在这里插入图片描述

(项目所使用到的moudle)

在这里插入图片描述

(如果开启快速编译模式,部分moudle不会编译)

在这里插入图片描述

(编译正式包时,如果没有关闭快速编译模式,则会提示编译失败)

二、RocketX 编译方案

  1. 开源地址 https://github.com/trycatchx/RocketX
  2. 该编译方案目前gradlew版本只兼容以下几个,在接入时需要注意

在这里插入图片描述

一、接入方式
  1. 在app的主 buil.gradle 中添加
apply plugin: 'com.rocketx'
  1. 在根目录的build.gradle加入
buildscript {
    dependencies {
        classpath 'io.github.trycatchx:rocketx:1.1.0'
    }
}
  1. 依赖 AS 插件 android studio setting->plugins-> marketplace 搜索 RocketX 安装(搜索不到使用本地安装

  2. 使用点击小火箭至喷火icon (开启 状态),点击编译器 run 按钮 :
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bv55uFDm-1649596820073)(https://github.com/trycatchx/RocketX/blob/master/IMG/assembleDebug.jpeg?raw=true)]

二、可选配置
  1. openLog :打开 log
  2. excludeModule :哪一些模块不需要打成 aar(譬如有些模块使用了 tool:replace=“XX” ,打成 aar 后属性会消失,当然也可以移动到 app module 的 AndroidMenifest.xml)
  //app moodule下 配置插件编译项
  android {
  //..
    RocketX {
        openLog = true
        //指定哪些模块不打成 aar ,字符串为 module.path
        excludeModule = [":module_common"]
    }
   //..
   }
  1. excludeTransForms: 编译阶段可以禁用的 transform ,编译速度更快(可通过build 的 log 搜索关键字 transFormList 查看自己项目引用了哪些 transform,并手动配置在 gradle.properties 文件下)
    excludeTransForms = com.alibaba.arouter AAA bbb
三、注意项
  1. 第一次的加速,是最慢的因为需要全量编译后,打出 aar 上传到 LocalMaven
  2. 目前如果编译出错,请重新再 run 一次
  3. 编译后的module打成的aar文件放置在项目根路径下.gradle/文件夹下
  4. 如果能够在.gradle/文件夹下找到对应的moudle生成的aar文件,并且rocketX是开启的情况下,那么就说明RocketX方案是生效的

四、结语

随着Android项目架构的演进,将会出现越来越多的提高编译效率的方案,没有那种方式是最好的,只有根据目前项目遇到的问题来选择合适的方案才是最有的,也希望自己和Android开发人员能够提供更多,更好的编译方案,促进Android编译生态的发展。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值