启动镜像加载(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/