Android 起动

Android 启动

1,Android OS启动

Android在Linux字体启动步骤如下:
(1) init 进程启动:内核启动之后启动的第一个用户级进程,该进程将根据init.rc和inir.xxx.rc建立几个基本服务(ServiceManager、Zygote)
(2) Native 服务启动:Servicemanager 和zygote 进程就奠定了Android 的基础。Zygote 这个进程起来才会建立起真正的Android 运行空间,初始化建立的Service 都是Navtive service
     建立Java Runtime
     建立虚拟机
     进入Zygote服务框架(Zygote 建立好了,利用Socket 通讯,接收ActivityManangerService 的请求,Fork 应用程
(3) System Server,Android 服务启动:Zygote fork一个进程SystemServer,SystemServer建立Android要用到的服务并用init2建立一个线程
(4) Home 启动:Home 就是在ActivityManagerService.systemReady() 通知的过程中建立的

到这里Android OS就已经启动完成了。



2,Android应用启动

每一个android应用都运行在一个Dalvik虚拟机实例里,而每一个虚拟机实例都是一个独立的进程空间。虚拟机的线程机制,内存分配和管理、Mutex等等都是依赖底层操作系统而实现的。所有Android应用的线程都对应一个Linux线程,虚拟机因而可以更多的依赖操作系统的线程调度和管理机制。Android每一个进程都对应一个ActivityThread实例,每一个ActivityThread都包含有一个ApplicationThread实例,它是一个Binder对象,负责和其它进程进行通信

不同的应用在不同的进程空间里运行,加之对不同来源的应用都使用不同的Linux用户来运行,可以最大程度的保护应用的安全和独立运行。Zygote是一个虚拟机进程,同时也是一个虚拟机实例的孵化器,每当系统要求执行一个Android应用程序,Zygote就会FORK出一个子进程来执行该应用程序。