学习了快手的公开课,特此记录
如何提高Android编译速度
背景
代码行数过大,moudle数过多,在传统手段,比如
- Parallel
- Compiler daemon
- ABI 组件化
- Builed Cache
- incremental build
- Compile avoidance
都已经做到极致的情况下,如何再去提升
特殊手段
整个编译构建过程,分为两个阶段,先进行代码的编译,然后利用tramsfrom进行构建,从这两个方面入手,做极致编译
compile阶段
ABI
ABI(Application Binary interface)是一套程序在平台上的运行规则,目的是为了让编译器和链接器如何去编译和链接程序,如果知道了是“规则”,那么我们就可以定制这个规则,比如private函数在不用增量编译,定制规则如下
1 语法级别
public method change
public filed change
public class added
2 文件级别
Code Source file change
Resource Source file change
3 环境级别
Dependency change
Gradle properties change
当这些函数或者文件发生改变时,则增量编译
task.doFirst {
if(task.state.upToDate) {
return@doFirst
}
val changed = runBlocking {
diff change
}
if(!changed && !task.state.upToDate)
throw StopExecutionException()
}
动态aar依赖
Transform优化
Transform用于class文件转为dex文件之前,对class文件进行操作,比如progrard、apt、asm,每个Transform任务都是串行的,也就是每次都会执行jar转为class,然后又转为jar的过程,那在这个过程中可不可以减少这个重复操作呢?
比如开多个线程去并行执行,但过多线程会增加cpu的负担,可以通过kotlin的协程+NIO并行IO操作,因为协程会降低内核态和用户态切换带来的性能损失,I/O操作让出CPU,增强CPU计算性能利用率,降低线程锁机制带来的性能损耗
以上就是通过深入了解Android编译过程来提升Android的编译速度,那还有没有其他方法呢?
物理手段-加配置
将代码push到云主机(比如配置64G内存)上,然后利用WorkSpace挂载到编译集群上,将编译后的apk安装到手机上
如何定制业务方的arr-中台化实现
公司内的产品矩阵,B产品想实现A产品的生成工具功能,如何实现高度定制呢? 利用MapFiles+字节码分析