Android 启动

来源:互联网 发布:神经官能症知乎 编辑:程序博客网 时间:2024/05/20 19:46

 

 

 

1.       bootloader

code \bootable\bootloader

开机log;

各种组合键进入不同模式(recovery模式,加载recovery.img和基本文件系统;fastboot模式,可以烧写,不加载);

以及加载boot.img(包含kernel,文件系统等);

 

2.       Kernel

         Code Kernel\*

         进程号为0;

 

3.       Init

Code \system\core\init\init.c system\core\rootdir\init.rc

第一个用户进程,进程号为1;父进程为kernel;

Init.c的main函数中,解析init.rc;

Init.rc中启动了一些底层linux servers(如adbd,提供adb支持;vold,提供SD挂载;servicemanager;zygote;),并执行了一些命令,rc文件有相应的格式,可以在其中设置开关机动作,如动画,铃音等;

 

4.       重要的后台程序zygote

Code         \frameworks\base\cmds\app_process\app_main.cpp

                    \frameworks\base\core\jni\AndroidRuntime.cpp

                    \frameworks\base\core\java\com\android\internal\os\ZygoteInit.java

                    \dalvik\vm\native\dalvik_system_Zygote.c

启动的第一个服务,对应的命令是/system/bin/app_process;

app_main.cpp中,main函数runtime.star中启动虚拟机,注册JNI函数,并找到zygoteinit的main,进入java环境;

ZygoteInit.java main中,申请端口号为50的监听套接字,用于接收ActivityManageService请求Fork应用程序;并与加载耗时的类和资源;启动systemserver

startSystemServer调用Zygote.forkSystemServer即jni中Dalvik_dalvik_system_Zygote_ forkSystemServer

startSystemServer中,if (pid == 0) 最终会调用invokeStaticMain,从而调用system server main函数;

 

5.       SystemServer

Code         frameworks\base\services\java\com\android\server\SystemServer.java

在system_init.cpp system_inith函数中启动AudioFlinger,media playback service,camera service,audio policy service

在init2中,启动必须的server添加到ServiceManage中 如,powermanage;并创建pakagemanageService和activityManageService

 

6.       Launcher

源码:ActivityManagerService.java为入口,packages/apps/launcher*实现

说明:系统启动成功后SystemServer使用xxx.systemReady()通知各个服务,系统已经就绪,桌面程序Home就是在ActivityManagerService.systemReady()通知的过程中建立的,最终调用 resumeTopActivityLocked-> startHomeActivityLocked

 

7.    解锁

1)        源码:
frameworks/policies/base/phone/com/android/internal/policy/impl/*lock*

2)        说明:系统启动成功后SystemServer调用wm.systemReady()通知WindowManagerService,进而调用PhoneWindowManager,最终通过LockPatternKeyguardView显示解锁界面,跟踪代码可以看到解锁界面并不是一个Activity,这是只是向特定层上绘图,其代码了存放在特殊的位置

8.    开机自启动的第三方应用程序

1)        源码:
frameworks/base/services/java/com/android/server/am/ActivityManagerService.java

2)        说明:系统启动成功后SystemServer调用ActivityManagerNative.getDefault().systemReady()通知ActivityManager启动成功,ActivityManager会通过置变量mBooting,通知它的另一线程,该线程会发送广播android.intent.action.BOOT_COMPLETED以告知已注册的第三方程序在开机时自动启动。

9.    总结
综上所述,系统层次关于启动最核心的部分是zygote(即app_process)和system server,zygote它负责最基本的虚拟机的建立,以支持各个应用程序的启动,而system server用于管理android后台服务,启动步骤及顺序。


转自:http://blog.csdn.net/persuit/article/details/7353066

原创粉丝点击