= Android启动流程  =
Android启动时序图 

== Linux启动  ==
=== 开机过电,复位器件  ===
=== 执行Bootloader程序  ===
arm中是uboot或者fastboot
如果在fastboot的运行过程中没有按下特别的按键,执行第一个应用程序(即Linux Kernel),从NAND Flash中读取 
=== 初始化Linux Kernel  ===
=== 读取init.rc文件  ===
位于设备根目录下 
== Android启动  ==
=== 启动初始化进程init  ===
==== init启动Linux守护进程  ====

==== init启动Zygeote进程  ====

受精卵,所有apk应用进程的父进程 
==== init初始化runtime进程  ====

=== runtime初始化并注册Service Manager  ===

runtime向zygote申请实例化一个Dalvik Vm并启动SystemServer SystemServer启动native serivce(Surface Flinger和Audio Flinger),并将这些native Service注册在ServiceManager中。 


SystemServer启动android管理服务,都会被注册ServiceManager中。 

=== Zygote孵化home和contact进程  ===
至此Android启动完成 

== Zygote启动分析  ==

Zygote的可执行文件在/system/bin/app_process中 
相关配置信息在/init.rc文件中 
=== 启动Socket服务端口  ===
Dalvik VM执行的第一个类ZygoteInit.java,Socket的启动也在此文件中 private static void registerZygoteSocket()静态函数中启动。 String env=System.getenv(ANDROID_SOCKET_ENV)获取系统为Zygote分配的Socket描述字。 用createFileDescriptor()创建一个文件描述符,再构造LocalServerSocket对象。 main()中调用runSelectLoopMode()进入非阻塞独模式 在while(true)中调用ZygoteConnection类的runOnce()处理接收的命令。 
=== 加载preload-classes  ===
作用:预装Framework的大部分类和资源 类列表在/system/framework/framework.jar文件中的preload-classer文本文件中。 ZygoteInit.java的main()函数中通过调用preloadClasses()读取preload—classes的列表来装载这些类 
=== 加载preload-resources  ===
preload-resources在/system/framework/base/res/res/values/arrays.xml文件中定义。 ZygoteInit.java的main()函数中通过调用preloadResources()读取arrays.xml的列表来装载这些资源。 preloadResources()调用preloadDrawable()来加载Drawable类资源,存于mResources类内部的Drawable列表内,调用preloadColor()加载Color类资源,存于mResources的Color列表内。 
=== 启动SystemServer  ===
从ZygoteInit.java的main()调用startSystemServer()开始。 
==== 启动各种系统服务线程  ====
从SystemServer的main()开始执行,先调用init1()进行一些Dalvid VM的相关初始化工作。init1()内部会调用java端的init2()。主要的系统服务在init2()中完成。 init2()创建一个ServerThread线程,从ServerThread的run()开始真正启动系统服务。 AmS启动后: 1.调用main() 2.调用AmS.setSystemProcess() 3.调用Ams.installProviders() 4.调用systemReady() 5.启动第一个activity,即home程序。 
在Ams的startHomeActivityLocked()中发出一个intent,它包含CATEGORY_HOME,任何能相应此intent的程序都能成为第一个activity,成为home程序。 


更多相关文章

  1. Unity3d 与 Android之间的互相调用
  2. Android中webview跟JAVASCRIPT中的交互
  3. android:launchMode="singleTask" 与 onNewIntent(Intent intent
  4. Android(安卓)图形系统剖析
  5. 详解 Android(安卓)的 Activity 组件
  6. android:launchMode="singleTask" 与 onNewIntent(Intent intent
  7. Android夜间模式官方api实现(AppCompatDelegate)
  8. Android(安卓)IPC 通讯机制源码分析
  9. Android中Toast如何在子线程中调用

随机推荐

  1. Android(安卓)ListView详解
  2. Android:SQLite数据库
  3. 解决“Cannot merge new index 67208 int
  4. 如何让多行的EditText光标从最前头开始?
  5. 用于 Android(安卓)开发的 Kotlin:是重量
  6. Android(安卓)RadioGroup中设置默认选中R
  7. Android:异步加载网络资源
  8. 【Android(安卓)基础】 android Xml 解析
  9. Android调用系统Camera录像时不能指定保
  10. 【整理】学习Android(安卓)Studio时遇到