什么是编译
高级语言转化为机器或者虚拟机能识别的低级语言的过程
对于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 APK
中 Base APK
中只有Instant Run
框架 资源和Manifest
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工具
R8
取代ProGuard
和 d8
直接使用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
等工具的使用
网友评论