12
主题
init内核进程启动init.rc文件解释
3启动services
4启动ServiceManager
5启动zygote
6
7
89
启动SystemServer
10
1112
启动TheadPool
启动各种XxxManagerServies
初始化ActivityManagerServ
初始化PkgManagerService
初始化SystemApp
安装SystemProvider
初始PhoneWindowManager
初始ActivityManagerServic
开启HomeActiviy
android系统启动过程了解
代码文件
system\\core\\init\\init.csystem\\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
startSystemServerzygoteInit
main
MethodAndArgsCaller.runmaininit1
system_init
init2
ServerThread.run
main,
systemMain,attach,startRunning
main
setSystemProcess,
installSystemApplicationInfo
installSystemProviders,generateApplicationProvidersLocked,ensurePackageDexOpt,performDexOptLImain,systemReady
systemReady
resumeTopActivityLocked,startHomeActivityLockedmain,runSelectLoopMode
说明
函数中执行了:文件夹建立,挂载,rc文件解析,属性设置,启动服务,执行动作,socket监听…….。消息循环中
.rc文件是Android使用的初始化脚本文件,其中一部分是 linux 命令,还有一些是 android 添加的,用于启动进程及服务class_start, service ……
ServiceManager用来管理系统中所有的binder service,不管是本地的c++实现的还是java语言实现的都需要这个进程来统一管理,最主要的管理就是,注册添加服务,获取服务。所有的Service使用前都必须先在servicemanager中进行注册
Zygote这个进程是非常重要的一个进程,Zygote进程的建立是真正的Android运行空间,以上初始化建立的Service都是Navtiveservice.
开始虚拟机,注册本地接口,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\null, this);初始化了app,pkgname叫\"android\",
安装SystemProvider,最终调用Installer.java的dexopt()
屏幕方向updateOrientationListenerLp();,键盘
mKeyguardMediator.onSystemReady();,设置updateSettings();注册启动广播,发送Intent.ACTION_PRE_BOOT_COMPLETED广播
pid>0的情况,Zygote.forkSystemServer返回值>0,进入循环,socket监听
因篇幅问题不能全部显示,请点此查看更多更全内容