android - Zygote 预加载 vs boot.art 加载

标签 android android-source android-runtime

启动镜像加载(boot.oat、boot.art)

当 Android 启动时,它会加载一些 boot images,其中包含一些常用的类。特别是 boot.oat 包含类的代码,以及 boot.art 一些预初始化的堆。 这加快了应用程序的启动速度,并由于分页机制节省了一些内存。 (更多详情 here )

合子预加载

在 ZygoteInit.java 中,有一个 preload功能。 它预加载类、资源、共享库等。 preloadClasses 特别加载在以下位置找到的类: /system/etc/preloaded-classes。这基本上会导致这些类的静态初始化程序运行。

它们有何不同?

两者有什么区别? boot.art 的唯一目的不是避免由 zygotespreload` 完成的显式初始化吗?

zygote 的 preload 难道不应该只为 imageless 启动而运行吗?

最佳答案

两者有什么区别? boot.art 的唯一目的不是避免由 zygote 的 preload` 完成的显式初始化吗?

boot.art 是一个燕麦文件。它包含 BOOTCLASSLOADER 中的所有类。 Oat 是一种特殊的 elf 格式。它是 ART VM 中的必要文​​件。它将在首次启动时生成或由制造商集成在手机中。

/system/etc/preloaded-classes 是一个包含将在 zygote 中初始化的类列表的文件。

zygote 的预加载不应该只为无图像启动运行吗?

boot.art 不是图像。

boot.art 是一个特殊的 oat 文件。它在BOOTCLASSLOADER中包含所有的jar包(framework.jar等)的类定义,在每个应用程序的内存中。 Android 将这些 jar 文件转换为 oat 文件以支持 ART VM。加载boot.art会将boot.art中的所有类定义加载到zygote进程的内存中。类在加载到内存后由 ClassLoader 初始化,它们通常在首次使用时初始化。

boot.art中的一些类几乎在每个应用程序中都会用到,所以我们可以在zygote中初始化它们,避免在每个应用程序中都初始化它们。 Preload会调用Class.forName方法来初始化/system/etc/preloaded-classes中的类。 Class.forName 初始化目标类中的静态 block 并进行其他初始化操作。预加载的结果实际上是内存更改,并且更改保留在 fork 进程中。因此预加载将节省类初始化时间。

关于android - Zygote 预加载 vs boot.art 加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38761334/

相关文章:

Android:与服务器通信的最佳方式

java - 自动完成 TextView + Json 服务器动态获取标签

android - 来自 https ://android. googlesource.com 的项目

c# - 关闭基于奖励的视频广告时 Unity 游戏崩溃

java - Android FinalizerDaemon 挂了

android - 找不到默认 Activity ?

android - 您可以使用字符串资源定义 Android intent-filter 吗?

android - 下载 Android 源代码时出错

android - 从android源代码构建

android - 如何从 Android Resources 类中获取样式?