学习快手Android技术总结

571 阅读2分钟

学习了快手的公开课,特此记录

如何提高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+字节码分析

如何监控OOM