[Android]Android系统启动流程源码分析
Android系统启动流程源码分析
首先我们知道,Android是基于Linux的,当Linux内核加载完成时就会自动启动一个init的进程。
又因为我们每当我们启动一个App时,就会生成一个新的dalvik实例,并处于一个新的进程(当然一个App也可能是多进程的)。
当我们打开第一个App的时候,就会通过init进程fork出一个zygote进程。之后打开新的App的时候都会fork之前的zygote进程。
当fork一个zygote进程时,会进入com.android.internal.os.ZygoteInit的main方法进行初始化操作:
预加载资源
1
2
3
4
5
6
7
8
9
10// ...
preloadClasses();
preloadResources();
preloadOpenGL();
preloadSharedLibraries();
preloadTextResources();
// Ask the WebViewFactory to do any initialization that must run in the zygote process,
// for memory sharing purposes.
WebViewFactory.prepareWebViewInZygote();
// ...从第一个
zygote进程fork出SystemServer进程,这个进程提供各种ManagerService。
1 | startSystemServer(abiList, socketName); |
- Fork完
SystemServer进程之后,继续接下来在handleSystemServerProcess方法中传入参数到SystemServer: 1
RuntimeInit.zygoteInit(parsedArgs.targetSdkVersion, parsedArgs.remainingArgs, cl);
注意,这里传入的参数是forkSystemServer进程后剩下的参数(parsedArgs.remainingArgs),其实只剩下了com.android.server.SystemServer这个参数了。
接下来继续调用applicationInit ,传入参数:
1 | private static void applicationInit(int targetSdkVersion, String[] argv, ClassLoader classLoader) |
解析成Arguments后,得到了一个startClass对象,这个startClass其实就是刚刚的那个com.android.server.SystemServer。
接下来,继续调用 invokeStaticMain
1 | private static void invokeStaticMain(String className, String[] argv, ClassLoader classLoader) throws ZygoteInit.MethodAndArgsCaller { |
就是调用通过反射得到com.android.server.SystemServer(也就是上面的startClass)的main(argv[])方法,然后手动抛一个携带了这个main(argv[])方法的MethodAndArgsCaller异常,但是这个异常是在ZygoteInit.main()方法中被catch,然后去调用它的run()方法,当然这个run()方法中会再去通过反射调用携带的main()方法(这个绕法真是有点坑爹--。):
1 | public static class MethodAndArgsCaller extends Exception implements Runnable { |
绕了这么一大圈,终于通过MethodAndArgsCaller调用SystemServer的main()方法了,代码很简单,直接new了之后run:
1 | new SystemServer().run(); |
接着,我们看SystemServer的run方法:
1 | // ... (省略初始化当前的language、locale、country、指纹、用户等信息的初始化准备工作) |
然后调用createSystemContext()方法创建初始化system context,这个待会再展开。
创建SystemServiceManager:1
2mSystemServiceManager = new SystemServiceManager(mSystemContext);
LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
使用SystemServiceManager去通过以下方法创建启动各个Service:
1. startBootstrapServices():
com.android.server.pm.Installer:提供安装、卸载App等服务com.android.server.am.ActivityServiceManager:提供Activity等组件的管理的服务,这个比较复杂暂且再挖个坑。com.android.server.power.PowerManagerService:电源管理的服务。com.android.server.lights.LightsService:LED管理和背光显示的服务。com.android.server.display.DisplayManagerService:提供显示的生命周期管理,根据物理显示设备当前的情况决定显示配置,在状态改变时发送通知给系统和应用等服务。com.android.server.pm.PackageManagerService:管理所有的.apk。com.android.server.pm.UserManagerService:提供用户相关服务。- 通过
startSensorService()本地方法启动Sensor服务。
2. startCoreServices();
com.android.server.BatteryService:电量服务,需要LightService。com.android.server.usage.UsageStatsService:提供收集统计应用程序数据使用状态的服务。com.android.server.webkit.WebViewUpdateService:私有的服务(@hide),用于WebView的更新。
3. startOtherServices();
com.android.server.accounts.AccountManagerService:提供所有账号、密码、认证管理等等的服务。com.android.server.content.ContentService:用户数据同步的服务。com.android.server.VibratorService:震动服务。IAlarmManager:提醒服务。android.os.storage.IMountService:存储管理服务。com.android.server.NetworkManagementService:系统网络连接管理服务。com.android.server.net.NetworkStatsService:收集统计详细的网络数据服务。com.android.server.net.NetworkPolicyManagerService:提供低网络策略规则管理服务。com.android.server.ConnectivityService:提供数据连接服务。com.android.server.NetworkScoreService:android.net.NetworkScoreManager的备份服务。com.android.server.NsdService:网络发现服务(Network Service Discovery Service)。com.android.server.wm.WindowManagerService:窗口管理服务。com.android.server.usb.UsbService:USB服务。com.android.server.SerialService:串口服务。com.android.server.NetworkTimeUpdateService:网络时间同步服务。com.android.server.CommonTimeManagementService:管理本地常见的时间配置的服务,当网络配置变化时会重新配置本地服务。com.android.server.input.InputManagerService:事件传递分发服务。com.android.server.TelephonyRegistry:提供电话注册管理的服务。com.android.server.ConsumerIrService:远程控制服务。com.android.server.audio.AudioService:音量、铃声、声道等管理服务。com.android.server.MmsServiceBroker:MmsService的代理,因为MmsService运行在电话进程中,可能随时crash,它会通过一个connection与MmsService建立一个桥梁,MmsService实现了公开的SMS/MMS的API。TelecomLoaderServiceCameraServiceAlarmManagerServiceBluetoothService- 还有其它很多很多Service,这方法竟然有近1000行……
在startOtherServices()方法的最后:
1 | mActivityManagerService.systemReady(new Runnable() { |
调用这个方法用来告诉ActivityManagerService,此时可以运行第三方的代码了(注意:这里的Home界面、Launcher等内置的App也算是第三方的App)。
1 | public void systemReady(final Runnable goingCallback) { |
启动Home界面的startHomeActivityLocked方法,调用mStackSupervisor启动HomeActivity:
1 | boolean startHomeActivityLocked(int userId, String reason) { |
到此为止,SystemServer start完毕,并且启动了Home界面。
然后我们再回过头去看看在我们前面创建系统级的Context(createSystemContext)的时候做了什么:1
2
3ActivityThread activityThread = ActivityThread.systemMain();
mSystemContext = activityThread.getSystemContext();
mSystemContext.setTheme(android.R.style.Theme_DeviceDefault_Light_DarkActionBar);
首先调用了ActivityThread的静态方法systemMain():
1 | public static ActivityThread systemMain() { |
创建一个ActivityThread,然后调用它的attach()方法:
1 | thread.attach(true); |
参数system表示,是否是系统级的线程,现在我们是启动整个Android系统,显然当前传入的参数为true。所以进入else,首先,创建一个Instrumentation,Instrumentation是什么?暂时先挖个坑。接着通过System Context创建一个ContextImpl,然后使用它的LoadedApk::makeApplication方法来创建整个应用的Application对象,然后调用Application的onCreate方法。
然后看下LoadedApk::makeApplication方法的实现:
1 | public Application makeApplication(boolean forceDefaultAppClass, |
创建appContext,然后通过Instrumentation生成Application对象,并给appContext设置外部引用。
本文链接:https://blog.wangjiegulu.com/2015/12/02/Android-Android系统启动流程源码分析/
版权声明:本博客所有文章除特别声明外,均采用 CC BY 4.0 CN协议 许可协议。转载请注明出处。