Android 笔记-编译篇

267 阅读1分钟

编译

当完成编码后,每次编译都要花上一段时间,我一般用这段时间去打杯水,文中提到微信 Android 版曾经 Debug 包编译需要 5 分钟,Release 版本编译需要 15 分钟.

编译到底做了什么,编译过程中涉及到词法分析,语法分析,语义检查,代码优化等过程,看到这里不禁让人想起在大学时期让人痛不欲生的<编译原理>,太烧脑了.

在 Android 中编译意味着 Java/kotlin 代码转换成 Dalvik 字节码,Dalvik 字节码是对 Java 字节码的优化,因为移动设备的性能限制,设计了这套字节码,精简了指令集,虽然增加了指令长度,但是减少了指令数量.

编译工具

Gradle 是 AS 默认的构建工具,Gradle 是一个开源项目,基本每个大厂都打造了自己的构建工具,比如 Facebook 的 Buck,阿里的 FreeLine 等等,微信使用了 Buck 来编译代码,后来因为需要和其他项目协同,又重新切回了 Gradle.

编译插桩

插桩就是在原有代码基础上,进行拦截 (Hook) 操作,常用的插桩实现方式有:

  1. APT (注解处理器,黄油刀就是用这个框架实现的)
  2. AspectJ (AOP 面向切面编程里历史悠久的框架,2001 年发展至今)
  3. ASM (修改字节码利器,性能要比 AspectJ 高,但是需要了解 Java 字节码知识,入手门槛也高)