当Android启动时,它会加载一些包含一些常用类的boot images
。特别是boot.oat
包含类的代码,boot.art
包含一些预初始化的堆。
这加速了应用程序的启动,并且由于分页机制而节省了一些内存。 (更多细节here)
在ZygoteInit.java中,有一个preload函数。
它预加载类,资源,共享库等。
preloadClasses
特别加载了以下类中的类:
/system/etc/preloaded-classes
。这基本上导致这些类的静态初始化程序运行。
两者有什么区别?
boot.art
的唯一目的不是避免zygote s
preload`所做的显式初始化吗?
zygote的preload
不应只为imageless
启动运行吗?
答案 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类正在加载。