android 的启动 分为三个阶段

对于Android整个启动过程来说,基本可以划分成三个阶段:Bootloader引导、Linux kernel启动、Android启动。

第一部分:Bootloader启动

常用 U_Boot启动,启动过程中AP需要关心CP的启动。涉及到涉及到CP的image和唤醒


启动过程中,包含一些上电引导。(手机的刷机,盒子的U盘升级 浙江贝尔鸟巢盒子)

BOX 检测U盘根目录 中的update.zip

最终 load boot.img

说明:加电后,CPU将先执行bootloader程序,此处有三种选择

a) 开机按Camera+Power启动到fastboot,即命令或SD卡烧写模式,不加载内核及文件系统,此处可以进行工厂模式的烧写

b) 开机按Home+Power启动到recovery模式,加载recovery.img,recovery.img包含内核,基本的文件系统,用于工程模式的烧写

c)开机按Power,正常启动系统,加载boot.img,boot.img包含内核,基本文件系统,用于正常启动手机(以下只分析正常启动的情况)


第二部分:Linux启动

一、zImage是怎样炼成的?

二、linux的c启动阶段


linux内核编译之后产生的最终文件zImage

经过解压缩和汇编启动两个阶段,将会进入init/Main.c中的start_kernel()函数去继续执行。启动init进程。


init进程是linux起来之后启动的第一个用户进程,android系统也就是在这个进

程的基础上启动的。进程号是1。

第三部分:Android启动

一、init进程

二、init启动的各种服务

三、android启动图示

3.1. init.rc文件解析 和 服务启动。

init进程,它是一个由内核启动的用户级进程。内核自行启动(已经被载入内存,开始运行,

并已初始化所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程序init的方式,完成引导进程。init始终是第一个进程。

  启动过程就是代码init.c中main函数执行过程:system\core\init\init.c在函数中执行了:文件夹建立,挂载,rc文件解析,属性设置,启动服务,执行动作,socket监听……

下面看两个重要的过程:rc


3.1.1 rc文件解析

  .rc文件是Android使用的初始化脚本文件 (System/Core/Init/readme.txt中有描述:
four broad classes of statements which areActions,Commands,Services, andOptions.)
  其中Command 就是系统支持的一系列命令,如:export,hostname,mkdir,mount,等等,其中一部分是 linux 命令,
还有一些是 android 添加的,如:class_start <serviceclass>: 启动服务,class_stop <serviceclass>:关闭服务,等等。
  其中Options是针对 Service 的选项的。
系统初始化要触发的动作和要启动的服务及其各自属性都在rc脚本文件中定义。 具体看一下启动脚本:\system\core\rootdir\init.rc
在解析rc脚本文件时,将相应的类型放入各自的List中:
  \system\core\init\Init_parser.c :init_parse_config_file( )存入到
  action_queue、 action_list、 service_list中,解析过程可以看一下parse_config函数,类似状态机形式挺有意思。
  这其中包含了服务:adbd、servicemanager、vold、ril-daemon、debuggerd、surfaceflinger、zygote、media……


2 服务启动

文件解析完成之后将service放入到service_list中。

文件解析完成之后将service放入到service_list中。

  \system\core\init\builtins.c

Service的启动是在do_class_start函数中完成:

intdo_class_start(intnargs,char**args){service_for_each_class(args[1],service_start_if_not_disabled);return0;}

遍历所有名称为classname,状态不为SVC_DISABLED的Service启动





init ----启动>ServiceManager(守护进程)

---启动> Zygote (app_main.app) ----> androidRuntime.cpp(启动Runtime) ----JNI call>zygoteInit.java ---main Jni call> SystemServer.java


SystemServer --- main

--- init1 ----call>com_android_server_systemserver.cpp 和 system_init.cpp --->call init2

--- init2 ---->Runtime call static ServiceThread


ServiceThread 包括wms pms ams 等等 系统的服务



其余addservice的过程类似,只是启动的不同服务罢了,后面还启动了很多

服务,如:Lights、Vibrator、Alarm、Sensor、Bluetooth、Input Method、NetStat、NetworkManagement、Connectivity、Mount、Notification、Audio等。在这些服务都启动完了之后。

… // run()函数的后半部分

// It is now time to start up the app processes...

使用xxx.systemReady()通知各个服务,系统已经就绪。


Home在

((ActivityManagerService)ActivityManagerNative.getDefault()).systemReady(.)

函数调用的过程中启动,其中systemReady()的参数是一段callback代码,

这个函数的实现部分在文件:ActivityManagerService.java中。

public void systemReady(final Runnable goingCallback) {

if (mSystemReady) {

if (goingCallback != null) goingCallback.run();

return; // 执行回调

}

resumeTopActivityLocked(null);

}

private final boolean resumeTopActivityLocked(HistoryRecord prev) {

if (next == null) {

// There are no more activities! Let's just start up the

// Launcher...

return startHomeActivityLocked();

}

}

private boolean startHomeActivityLocked() {

if (aInfo != null) {

if (app == null || app.instrumentationClass == null) {

intent.setFlags(intent.getFlags() |

Intent.FLAG_ACTIVITY_NEW_TASK);

startActivityLocked(null, intent, null, null, 0, aInfo,

null, null, 0, 0, 0, false, false); // 这里启动home

}

}

}








更多相关文章

  1. Android进程级别与如何防止服务进程被回收
  2. Android系统启动过程
  3. Android的selector,背景选择器
  4. android中的selector背景选择器
  5. android http协议添加Authorization认证方式
  6. Google Android应用开发04 Android应用程序结构
  7. Android中的文件权限操作
  8. Android(安卓)控件二 Button
  9. NPM 和webpack 的基础使用

随机推荐

  1. 白底黑字!Android浅色状态栏黑色字体模式
  2. Android(安卓)圆角圆形ImageView(超简单
  3. 转载 解决在PC上无法连接adb interface的
  4. uni-app打包程序 Hbuilder X 用自有证书
  5. Android(安卓)任务栈与启动模式
  6. android调用相应的应用市场进行评价功能
  7. Android中的绘制机制
  8. Android(安卓)SurfaceFlinger VSync流程
  9. Android中 token 的使用
  10. Java采用JNI调用VC++生成的dll(Java与C++