安卓 编译过程分析

发布于 2024-10-04 07:57:34 字数 2390 浏览 6 评论 0

Instant Run

在 Android Plugin 2.3 之前,它使用的 Multidex 实现。在 Android Plugin 2.3 之后,它使用 Android 5.0 新增的 Split APK 机制。

Instant Run 有三种模式,如果是热交换和温交换,我们都无需重新安装新的 Split APK,它们的区别在于是否重启 Activity。对于冷交换,我们需要通过 adb install-multiple -r -t 重新安装改变的 Split APK,应用也需要重启。

缺点:

  • 多进程:The app was restarted since it uses multiple processes,如果应用存在多进程,热交换和温交换都不能生效。因为大部分应用都会存在多进程的情况,Instant Run 的速度也就大打折扣。
  • Split APK 安装。虽然 Split APK 的安装不会生成 Odex 文件,但是这里依然会有签名校验和文件拷贝(APK 安装的乒乓机制)。这个时间需要几秒到几十秒,是不能接受的。
  • javac(即 Gradle 问题)。在 Gradle 4.6 之前,如果项目中运用了 Annotation Processor,本次修改以及它依赖的模块都需要全量 javac,而这个过程是非常慢的。假设修改的类中包含一个“public static final”的变量,本次修改以及它依赖的模块都需要全量 javac。因为常量池是会直接把值编译到其他类中,Gradle 并不知道有哪些类可能使用了这个常量。

在 Android Studio 3.5 之后,对于 Android 8.0 以后的设备将会使用新的方案 Apply Changes

当然最近几个 Android Studio 版本,Google 也做了大量的其他优化,例如使用了 AAPT2 来编译 Android 资源。 AAPT2 实现了资源的增量编译 ,它将资源的编译拆分成 Compile 和 Link 两个步骤。前者资源文件以二进制形式编译 Flat 格式,后者合并所有的文件再打包。

ProGuard、D8、R8、Redex

ProGuard 主要有混淆、裁剪、优化这三大功能

D8

它的作用是将“.class”文件编译为 Dex 文件,取代之前的 dx 工具。d8 除了更快的编译速度之外,还有一个优化是减少生成的 Dex 大小。 根据 Google 的测试结果,大约会有 3%~5% 的优化。

R8

R8 在 Android Studio 3.1 中引入,它的志向更加高远,它的目标是取代 ProGuard 和 d8。我们可以直接使用 R8 把“.class”文件变成 Dex。 同时,R8 还支持 ProGuard 中混淆、裁剪、优化这三大功能 。目前 R8 依然处于实验阶段。

Redex

如果说 R8 是未来想取代的 ProGuard 的工具,那 Facebook 的内部使用的 Redex 已经做到了。但是文档不完全,有 FaceBook 内部逻辑,使用不方便

优点:

  • Interdex:类重排和文件重排、Dex 分包优化。
  • Oatmeal:直接生成的 Odex 文件。
  • StripDebugInfo:去除 Dex 中的 Debug 信息。

结论

还是 Flutter 编译速度最快,hot reload 最快。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

∞琼窗梦回ˉ

暂无简介

0 文章
0 评论
23 人气
更多

推荐作者

玍銹的英雄夢

文章 0 评论 0

我不会写诗

文章 0 评论 0

十六岁半

文章 0 评论 0

浸婚纱

文章 0 评论 0

qq_kJ6XkX

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文