Android Zygote 从何而来?揭开 Android 系统启动的面纱,flutter 真机调试
android 与 linux 启动的不同点有哪些?
Binder:它是 android 特有的进程间通信机制和远程方法调用系统。
ashmem(Android Shared Memory):它是一个新的共享内存分配器,类似于 POSIX SHM,但具有不同的行为,并支持更简单的基于文件的 API。
pmem(Process memory allocator):它用于管理用户空间和内核驱动程序之间共享的大量(1-16+MB)物理上连续的内存区域。
logger:这是对 logcat 命令的内核支持。
wakelocks:用于电源管理文件。它使机器在每个事件的基础上保持唤醒,直到唤醒锁被释放。
oom handling:当可用内存过低时它会杀死进程。
alarm manager:从用户态通知内核唤醒。
RAM_CONSOLE:允许将内核 printk 消息保存到 RAM 中的缓冲区,以便在内核死机后可以在下一次内核调用中查看它们。
用于 ADB 的 USB 小工具驱动程序
yaffs2 闪存文件系统(作者也不知道这是啥)
4. Init 进程
Init 是系统的第一个进程,它是所有进程的父进程。它有两个主要任务,
挂载目录,例如/sys , /dev or /proc。
运行 init.rc 脚本
init 进程可以在这里找到aosp/system/core/init
init.rc 脚本可以在这里找到aosp/system/core/rootdir/
init.rc 中语言的规则是特定的,可以在这里查询,community.nxp.com/t5/i-MX-Pro…
在这个过程中,你可以看到 android 启动画面。
5. Zygote 和 Dalvik(终于到了这一步)
在 java 中,每个程序运行在一个单独的内存隔离的虚拟机实例中,每个虚拟机实例都要消耗一部分内存,我们知道 android 通常是手持设备,内存有限,如果采用同样的策略,虚拟机实例就会消耗掉大量内存。
为了克服内存问题,android 中才出现了 zygote。zygote 实现了跨 Dalvik 虚拟机的代码共享,实现了更低的内存占用和启动时间。zygote 是在系统引导时启动的虚拟机进程。zygote 预加载并初始化核心库类。
zygote 加载过程如下,
加载 zygote 初始化类,aosp/frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
registerZygoteSocket(),为 zygote 命令通道注册一个套接字服务。
preloadClasses(), 初始化 zygote 进程,加载并初始化常用类。
preloadResources(),加载可以在进程间共享的资源。
在此过程,你可以看到启动动画。
6. System Service(系统服务)
完成上面的工作后,zygote 会 fork 一个新的进程去启动系统服务。
核心服务如下:
Starting power manager
Creating the Activity Manager
Starting telephony registry
Starting package manager
Set activity manager service as system process
Starting context manager
Starting system contact providers
Starting battery service
Starting alarm manager
Starting sensor service
Starting window manager
Starting Bluetooth service
Starting mount se
rvice
其它服务如下:
Starting status bar service
Starting hardware service
Starting NetStat service
Starting connectivity service
Starting Notification Manager
Starting DeviceStorageMonitor service
Starting Location Manager
Starting Search Service
Starting Clipboard Service
Starting checkin service
Starting Wallpaper service
评论