当前位置:文档之家› android_启动过程分析

android_启动过程分析

android_启动过程分析
android_启动过程分析

顺序主题

1init内核进程启动

2init.rc文件解释

3启动services

4启动ServiceManager 5启动zygote

6

7

8启动SystemServer

9

10

11

12

启动TheadPool

启动各种XxxManagerServies 初始化ActivityManagerServ 初始化PkgManagerService 初始化SystemApp

安装SystemProvider

初始PhoneWindowManager

初始ActivityManagerServic 开启HomeActiviy

android系统启动过程了解

代码文件

system\core\init\init.c

system\core\rootdir\init.rc

system\core\init\builtins.c

frameworks\base\cmds\servicemanager\Service_manager.c

frameworks/base/cmds/app_process/app_main.cpp

frameworks\base\core\jni\AndroidRuntime.cpp

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

同上

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

同上

frameworks\base\services\java\com\android\server\SystemServer.java frameworks/base/services/jni/com_android_server_SystemServer.cpp

frameworks\base\cmds\system_server\library\system_init.cpp

frameworks\base\services\java\com\android\server\SystemServer.java frameworks\base\services\java\com\android\server\SystemServer.java run:ActivityManagerService.java,ActivityThread.java

run:PackgeManagerService.java

run:ActivityManagerService.java,ActivityThread.java

run:ActivityManagerService.java,PackageMangerService.java,Installer.j run:WindowManagerService.java,WindowManagerPolicy.java,Policy.java,Pho run:ActivityManagerService.java

run:ActivityManagerService.java,ActivityStack.java

zygoteInit.java,LocalServerSocket.java,LocalSocket.java

函数

main

class_start,service

do_class_start

main

start

main

startSystemServer zygoteInit

main

MethodAndArgsCaller.run main

init1

system_init

init2

ServerThread.run

main,

systemMain,attach,startRunn ing

main

setSystemProcess,installSystemApplicationInf o

installSystemProviders,gene rateApplicationProvidersLoc ked,ensurePackageDexOpt,per formDexOptLI

main,systemReady systemReady resumeTopActivityLocked,sta rtHomeActivityLocked main,runSelectLoopMode

说明

函数中执行了:文件夹建立,挂载,rc文件解析,属性设置,启动服务,执行动作,socket监听…….。消息循环中

.rc文件是Android使用的初始化脚本文件,其中一部分是 linux 命令,还有一些是 android 添加的,用于启动进程及服务

class_start, service ……

ServiceManager用来管理系统中所有的binder service,不管是本地的c++实现的还是java语言实现的都需要这个进程来统一管理,最主要的管理就是,注册添加服务,获取服务。所有的Service使用前都必须先在servicemanager中进行注册

Zygote这个进程是非常重要的一个进程,Zygote进程的建立是真正的Android运行空间,以上初始化建立的Service都是Navtive service.

开始虚拟机,注册本地接口,jni找ZygoteInit.java的main方法,然后调用

到了ZygoteInit.java中的静态main函数中,从C++ ——》JAVA。Zygote就建立好了,利用Socket通讯,接收请求,Fork应用程序进程,进入Zygote进程服务框架中。

在Zygote进程进入循环之前,调用了startSystemServer(),接着Zygote.forkSystemServer(),handleSystemServerProcess()

zyoteInit(),invokeStaticMain()获取SystemServer.java的main方法,并以异常形式抛出MethodAndArgsCaller

抛出异常,回到ZygoteInit.java的main ,循环不执行,然后caller.run()。如果startSystemServer抛出了异常,跳过执行ZygoteInit进程的循环,这是怎么回事呢?Zygote.forkSystemServer 根据参数fork 出一个子进程,若成功调用,则返回两次:

一次返回的是zygote进程的 pid>0;一次返回的是子进程 pid=0,否则出错pid=-1;等于0的抛出异常,大于0的继续执行

pid==0情况,run()中调用SystemServer.java的main

调用init1,

调用system_init

启动初始化SurfaceFlinger和传感器,如果是模拟器又初始化了多媒体服务。接着回调SystemServer.java的init2。最后如果是在自己的进程中,需要startThreadPool()。

新启ServerThread,run中初始化各种服务。

创建各种服务实例,如:电源、网络、Wifi、蓝牙、USB等,初始化完成以后ServiceManager.addService(name,service),然后通知各服务现在可以工作了(事后用 Context.getSystemService(String name)才获取到相应的服务)。看到有PackageManagerService,ActivityManagerService都在这里初始化。到这里系统ApplicationFramework层的XxxServiceManager准备就绪,可以开始跑上层应用了,我们的第一个上层应用HomeLauncher。mInstrumentation = new Instrumentation(); ContextImpl context = new ContextImpl();app.onCreate();mSystemReady=false

构造方法,创建运行所需的dir,加载Permissions, 扫描并收集所有apk

context.init(new LoadedApk(this, "android", context, info), null, this);初始化了app,pkgname叫"android",

安装SystemProvider,最终调用Installer.java的dexopt()

屏幕方向updateOrientationListenerLp();,键盘mKeyguardMediator.onSystemReady();,设置updateSettings();

注册启动广播,发送Intent.ACTION_PRE_BOOT_COMPLETED广播

pid>0的情况,Zygote.forkSystemServer返回值>0,进入循环,socket监听

相关主题
文本预览
相关文档 最新文档