Zygote preloading vs boot.art loading

时间:2016-08-04 07:42:48

标签: android android-source android-runtime

加载启动映像(boot.oat,boot.art)

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

Zygote预加载

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

他们有何不同?

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

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

3 个答案:

答案 0 :(得分:1)

两者有什么区别? 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中初始化它们,以避免在每个应用程序中初始化它们。预加载将调用Class.forName方法来初始化/system/etc/preloaded-classes中的类。 Class.forName初始化目标类中的静态块并执行其他初始化操作。预加载的结果实际上是内存更改,并且更改仍保留在分叉进程中。因此预加载将节省类初始化时间。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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