Android正常开机流程
Android正常开机首先从arm9侧开始,进而转到arm11侧。具体的开机流程如下。
由BootLoader开启
由内核启动,会按照init.rc中配置的内容进行初始化工作。
Init最后会启动zygote,进入zygoteinit.java的main方法。
在zygote的main方法中主要进行的操作包括建立socket连接registerZygoteSocket()、类的预加载preloadClasses()、资源的预加载preloadResources()等操作。
程序会先找到名为preloaded-calsses的文件,该文件位于framework.jar里,里面的配置文件中每一行都记载了一个要加载的类,程序会通过流的方式逐行读取文件,并通过Class.forName()的方式对每一个类进行加载,并计数,最后会打印出统计log。
在preloadResources()中加载资源,包括drawable和color的,最后也会打出统计log。
在加载完资源之后,程序会调用startSystemServer()为调用systemserver类做一些准备。然后会通过system_init.cpp走到systemserver.java中继续执行。
zygote会调用systemserver类main方法,main中会调用该类的init1方法,init1方法中会在底层作一些启动服务的处理。(SurfaceFlinger, AudioFlinger, etc..).
然后init1方法再调用init2方法,通过init2方法来启动android的service。
在init2方法中会启动并执行一个serverthread的线程,然后程序进入serverthread的run方法。接下来进行在run方法中的操作。
1。判断上一次是否正常关机,如果不是(failed to shut down)则会马上执行关机操作,如果正常的话则开始启动服务。
2。启动Entropy Service
3。 启动Power Manager
4。启动Activity Manager
期间会寻找bootanimation.zip文件,执行开启动画的操作。这里的开机动画指的是android几个字闪烁的界面。
5。启动Telephony Registry
6。启动Package Manager
7。启动Account Manager
8。启动Content Manager
9。启动System Content Providers
10。启动Battery Service
11。启动Lights Service
12。启动Vibrator Service
13。 启动Alarm Manager
14。启动Init Watchdog
15。启动Window Manager
16. 启动Bluetooth Service(期间会进行判断,如果是在模拟器的情况下会跳过此步骤:Skip Bluetooth if we have an emulator kernel)
17.启动 Device Policy
18.启动Status Bar
19.启动Clipboard Service
20。启动Input Method Service
21。启动NetStat Service
22。启动NetworkManagement Service
23。启动Connectivity Service
24。启动Throttle Service
25。启动Accessibility Manager
26。启动Mount Service
27。启动Notification Manager
28。启动Device Storage Monitor
29。启动Location Manager
30。启动Search Service
31。启动DropBox Service
32。启动Wallpaper Service
33。启动Audio Service
34。启动Headset Observer
35。启动Dock Observer
36。启动UI Mode Manager Service
37。启动Backup Service
38。启动AppWidget Service
39。Recognition Service
40。启动DiskStats Service
41。确保ADB_ENABLED设置值同secure property的值相匹配(make sure the ADB_ENABLED setting value matches the secure property value)
42。register observer to listen for settings changes
43。判断是否是安全模式(safemode),并做相应的处理。
在各个服务都启动之后,开始执行app process,通过调用xxx.systemready()方法,通知各个服务已经就绪。
44。执行devicePolicy.systemReady()
45。执行notification.systemReady()
46。执行statusBar.systemReady()
47。执行Windowmanagerservice.systemReady()
在该方法中会调用到phonewindowmanager的systemReady(),然后调用doKeyGuard(),会开启锁屏计时器。也就是关联到刚开机时进入的锁屏界面。
48。执行Powermanagerservice.systemReady
49. 执行packagemanager.systemready
50.调用ActivityManagerservice.systemReady(new Runnable()),传入一个线程参数,
在ActivityManagerservice里面会调用startProcessLocked(),然后attachApplicationLocked()。
51。启动作为参数传入给ActivityManagerservice.systemReady的线程,调用其他系统app的systemready。(包括StatusBarManagerService、BatteryService、ConnectivityService、DockObserver、UsbObserver、ThrottleService、UiModeManagerService、AppWidgetService、WallpaperManagerService、InputMethodManagerService、RecognitionManagerService、 LocationManagerService)
52. 在ActivityManagerservice的systemready()中通过resumeTopActivityLocked()调用startHomeActivityLocked函数来启动launcher.
53。最后在activitymanager里发送ACTION_BOOT_COMPLETED的intent,第三方程序在接收此广播后开始启动。