3

引导映像加载(boot.oat、boot.art)

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

Zygote 预加载

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

它们有何不同?

两者有什么区别?boot.art避免szygote preload进行显式初始化的唯一目的不是吗?

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

4

3 回答 3

2

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

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

/system/etc/preloaded-classes是一个文件,其中包含将在zygote.

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

boot.art不是图像。

boot.art是一个特殊的燕麦文件。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初始化目标类中的静态块并执行其他初始化操作。预加载的结果实际上是内存更改,并且更改保留在分叉的进程中。所以预加载会节省类初始化时间。

于 2017-06-27T11:02:35.273 回答
0

Preloaded-classes 文件只是一个文本文件,它列出了 Zygote 需要加载的类名。Zygote 基于这个列表来加载所有的 Android Java 框架,它使用 Classs.forName() 来加载 Java 类。
boot.art是类的图像文件,所以实际的类在这里。ART 运行时只是负责通过内存映射技术将此文件加载到进程内存中。这里没有加载 Java 类。

于 2019-03-08T11:30:16.277 回答
0

这可能是因为 /system/etc/preloaded-classes 并不是 boot.art 的一部分。Android 提供了选择 boot.art 中内容的灵活性,以便图像大小可以保持较小,但这显然会导致在 zygote 初始化期间在运行时加载一些类。

于 2017-06-04T10:32:25.570 回答