关于编译

什么是编译

高级语言转化为机器或者虚拟机能识别的低级语言的过程
对于Android 这个过程就是把Java或者Kotlin转变为Dalvik字节码的过程

基础知识

编译构建流程

包括三个部分:1⃣️代码 2⃣️资源 3⃣️Native Library


构建流程.png

编译速度

包含两个时间:
1⃣️ 编译时间 2⃣️ 安装时间


时间.png
  • 编译时间
    Java或者Kotlin编译成.class文件 通过dx编译成Dex文件
    增量编译希望编译更少的模块 Implementation 代替 Compile就是优化依赖关系
  • 安装时间
    先进过签名校验-->拷贝文件(比如APK文件 Library文件 Dex文件) -->编译Odex文件(Android5.0和6.0非常耗时) 对于增量编译 最好的优化是直接应用新的代码 无需重新安装新的APK

增量编译

Gradle的官方方案 Instant Run Android Plugin2.3之前 使用Multidex实现 2.3之后使用Android 5.0新增的Split APK机制
如图所示 应用本身的代码都在Split APKBase APK中只有Instant Run 框架 资源和Manifest

增量编译图解.png

Instant Run 中有三种模式:1⃣️热交换 2⃣️温交换 3⃣️冷交换
前两种不需要重启应用
大型项目还是存在性能问题:

  • 多进程 热交换 温交换都不能生效
  • Split APK安装 Split APK安装不会生成Odex文件 但是依然会有签名校验和文件拷贝 需要几秒到几十秒
  • javac问题 在 Gradle 4.6 之前 如果项目中运用了 Annotation Processor 本次修改以及它依赖的都要全量编译

修改public static final 修饰的变量 也需要全量编译 常量池会值编译到其他类中 Gradle 事先并不能知道哪些类使用这些常量

ProGuard

三个功能:1⃣️混淆 2⃣️ 裁剪 3⃣️优化(内联 修饰符 合并类 方法)

d8

.class 文件编译为Dex文件 取代之前的dx工具

编译流程.png

R8

取代ProGuardd8 直接使用R8.class编译生成Dex 更强大的代码优化工具

ReDex

Facebook 内部框架 已经完成R8的功能

持续交付

常用的持续集成工具:
Jenkins GitLab CI Travis CI

拓展

  • 自定义代码检查 例如美团拓展Findbugs插件实现Android 漏洞扫描工具 Code Arbiter
  • 第三方代码检查
    收费的 Coverity 以及 Facebook 开源的Infer
  • Code Review
    GitLab Phabricator 或者 Gerrit

Desugar、Dexlayout、JVM TI、App Bundle等工具的使用

你可能感兴趣的:(关于编译)