启动镜像加载(boot.oat、boot.art)
当 Android 启动时,它会加载一些 boot images
,其中包含一些常用的类。特别是 boot.oat
包含类的代码,以及 boot.art
一些预初始化的堆。
这加快了应用程序的启动速度,并由于分页机制节省了一些内存。 (更多详情 here )
合子预加载
在 ZygoteInit.java 中,有一个 preload功能。
它预加载类、资源、共享库等。
preloadClasses
特别加载在以下位置找到的类:
/system/etc/preloaded-classes
。这基本上会导致这些类的静态初始化程序运行。
它们有何不同?
两者有什么区别?
boot.art
的唯一目的不是避免由 zygotes
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 文件。它在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/