Android启动过程
Android启动过程
从Zygote启动过程开始,省略掉了前面的解析.rc文件等步骤
Zygote 启动过程
解释一下:
- 解析init.zygote.rc中的参数,创建AppRuntime并调用AppRuntime.start()方法
- 调用AndroidRuntime的startVM()方法创建虚拟机,再调用startReg()注册JNI函数
- 通过JNI方式调用ZygoteInit.main(),第一次进入java世界
- registerZygoteSocket()建立socket通道,zygote作为通信的服务端,用于响应客户端请求
- preload()预加载通用类、drawable和color资源、openGL以及共享库以及WebView,用于提高app启动效率
- zygote完成大部分工作,接下来再通过startSystemServer(),fork得力助手system-server进行,也是上层framework的运行载体
- zygote功成身退,调用runSelectLoop(),随时待命,当接收到请求创建新进行请求时立即唤醒并执行相应工作。
SystemService 启动流程
上图前4个步骤运行在Zygote进行,从第五步开始是运行在新创建的system_server,这是fork机制实现的。
RuntimeInit.java 中 invokeStaticMain 方法通过创建并抛出异常 ZygoteInit.MethodAndArgsCaller,在 ZygoteInit.java 中的 main()方法会捕捉该异常,并调用 caller.run(),再通过反射便会调用到 SystemServer.main()方法,在该方法中创建SystemServer对象并执行run方法。
在该方法中执行了如下操作
设置系统时间
1
2
3
4if (System.currentTimeMillis() < EARLIEST_SUPPORTED_TIME) {
Slog.w(TAG, "System clock is before 1970; setting to 1970.");
SystemClock.setCurrentTimeMillis(EARLIEST_SUPPORTED_TIME);
}变更虚拟机库文件
1
SystemProperties.set("persist.sys.dalvik.vm.lib.2", VMRuntime.getRuntime().vmLibrary());
Mmmmmm… more memory!(清除vm内存增长限制)
1
VMRuntime.getRuntime().clearGrowthLimit();
Prepare the main looper thread (this thread)
1
2
3
4
5
6android.os.Process.setThreadPriority(
android.os.Process.THREAD_PRIORITY_FOREGROUND);
android.os.Process.setCanSelfBackground(false);
Looper.prepareMainLooper();
Looper.getMainLooper().setSlowLogThresholdMs(
SLOW_DISPATCH_THRESHOLD_MS, SLOW_DELIVERY_THRESHOLD_MS);Initialize native services
1
System.loadLibrary("android_servers");
检测上次关机过程是否失败,该方法可能不会返回
1
performPendingShutdown();
Initialize the system context
1
createSystemContext();//这里需要区分system_server进程和app进程:http://gityuan.com/2017/04/02/android-application/
Create the system service manager
1 |
|
- Start services startBootstrapServices();
该方法所创建的服务:DeviceIdentifiersPolicyService、ActivityManagerService、PowerManagerService、RecoverySystemService、LightsService、DisplayManagerService、PackageManagerService、 UserManagerService、 SensorService.
startCoreServices();
启动服务 BatteryService,UsageStatsService,WebViewUpdateService。
startOtherServices();
这里启动的服务挺多的,捡主要的写一下:VibratorService、NetworkManagementService、IpSecService、NetworkStatsService、WindowManagerService、InputManagerService、AlarmManagerService
SystemServer 启动各种服务中最后的一个环节便是 AMS.systemReady(),到此, System_server 主线程的启动工作总算完成, 进入 Looper.loop()状态,等待 其他线程通过 handler 发送消息到主线再处理。