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

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

合子预加载

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

它们有何不同?

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

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 文件。它包含 framework.jar 中 jars(BOOTCLASSLOADER 等)的所有类定义,并且在每个应用程序的内存中。 Android 将这些 jar 文件转换为 oat 文件以支持 ART VM。加载 boot.art 会将 boot.art 中的所有类定义加载到 zygote 进程的内存中。这些类是 而不是 在加载到内存后由 ClassLoader 初始化,它们通常在第一次使用时初始化。
boot.art 中的一些类几乎用在每个应用程序中,因此我们可以在 zygote 中初始化它们,以避免在每个应用程序中初始化它们。 Preload 将调用 Class.forName 方法来初始化 /system/etc/preloaded-classes 中的类。 Class.forName 初始化目标类中的静态块并执行其他初始化操作。预加载的结果实际上是内存更改,并且更改保留在 fork 进程中。所以预加载将节省类初始化时间。

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

10-12 01:17
查看更多