Android的从Linux启动主要分为四个过程:
1、 init进程的启动;
2、 native进程启动;
3、 system service,android服务启动;
4、 Home的启动
如图:
Init属于用户级进程,在内核启动(载入内存,初始化所有设备驱动和数据结构)结束后运行,接着根据init.rc和init.XXX.rc脚本文件建立servicemanager以及zygote等基本服务;创建完毕后,init进程并不会退出,而是转为property service功能;
Servicemanager与zygote奠定了android的基础。Zygote进程建立起来,才会建立android的运行空间,这里说下 zygote 的建立过程
Zygote在init.rc的描述:
Service zygote/system/bin/app_process-Xzygote/system/bin –zygote –start-server
所以Zygote从main(…)@frameworks/base/cmds/app_main.cpp开始(这里的解析init.rc脚本语言还是不太明白,暂时先把整体流程搞通,如何去解析和对应起来有空再学习)
建立Java runtime :runtime.start(…);
建立虚拟机
通过main(…)@com.android.interal.os.ZyoteInit,建立真正的zygote;
接着登记listen端口(都是以socket通信方式):resisterZygoteSocket()
接着startSystemServer(),进入zygote服务框架
建立好后的Zygote通过socket通信,接收ActivityManagerService的请求 fork应用程序。
在建立zygote中startSystemServer在Zygote上forck了一个com.android.server.SystemServer,于是SystemServer就建立了,在init2()中建立一个线程来new service来建立android需要的服务 和Add service把这些服务 到 service manager(service_list)中
在SystemService的启动完android所有服务后调用(XXX.systemReady())来通知所有服务系统准备就绪,Home就是在这个ActivityManager. systemReady()通知过程中建立的
这样 android系统就启动结束了。