Android正常开机流程java
Android正常开机首先从arm9侧开始,进而转到arm11侧。具体的开机流程以下。android
由BootLoader开启安全
由内核启动,会按照init.rc中配置的内容进行初始化工做。app
Init最后会启动zygote,进入zygoteinit.java的main方法。socket
在zygote的main方法中主要进行的操做包括创建socket链接registerZygoteSocket()、类的预加载preloadClasses()、资源的预加载preloadResources()等操做。ide
程序会先找到名为preloaded-calsses的文件,该文件位于framework.jar里,里面的配置文件中每一行都记载了一个要加载的类,程序会经过流的方式逐行读取文件,并经过Class.forName()的方式对每个类进行加载,并计数,最后会打印出统计log。函数
在preloadResources()中加载资源,包括drawable和color的,最后也会打出统计log。动画
在加载完资源以后,程序会调用startSystemServer()为调用systemserver类作一些准备。而后会经过system_init.cpp走到systemserver.java中继续执行。spa
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,第三方程序在接收此广播后开始启动。