Android启动流程学习笔记

Android启动流程:

当按下开机键时,会给手机主机主板通电,主板就会去启动一个BootLoader的程序
BootLoader会根据已经设置的路径去加载android系统
由于android系统是基于Linux系统,所以他启动的第一个进程和linux的第一个进程一致,即idle进程
idle进程负责一些初始化工作 进程管理 启动各种驱动 binder驱动 camera驱动等
idle进程pid=0 他会创建两个进程 一个是init进程 一个是kthread进程
init进程pid=1 属于用户空间进程 init进程会fork出zygote进程 并且创建ServiceManager进程 ServiceManager是一个大管家 一般我们通过ServiceManager.getService会获取到各种系统服务
kthread进程pid=2 属于内核进程 会负责内核相关工作
zygote进程会创建虚拟机 注册JNI zygote主要能力是fork其他进程 并且创建socket负责和AMS通信 当需要创建进程时AMS会通过这个socket通知zygote fock出一个进程

启动一个进程需要加载各种资源 其中有些资源是可以各个进程共享的 所以zygote负责预加载这些公共资源 避免每次启动一个进程重复加载这些公共资源
zygote还需要创建SystemServer进程 SystemServer负责创建各种MS 如AMS PMS WMS
到此准备工作做完 zygote开始循环等待AMS的消息 AMS需要启动新进程 zygote就帮他fork

App启动流程

当要启动的app不存在时 launcher或者其他app会通过AMS的代理和AMS通信
AMS通过socket与zygote通信 zygote会fork出一个子进程作为要启动的app进程
app进程启动后会调用ActivityThread的main()
在main()中会将当前线程作为主线程 创建一个主线程Looper
然后创建一个ActivityThread实例 调用他的attach方法 开启Looper循环
在attach方法里面 创建IApplicationThread binder接口 之后调用AMS的attachApplication 将IApplicationThread接口传进去 在AMS里面会去校验启动参数 校验通过后 将进程的信息(比如有进程名,appInfo,providers)通过传进去的IApplicationThreadd的bindApplicion方法传出来
然后通过handler发送BIND_APPLICATION消息 接着调用handleApplication() 进行各种初始化 创建Application实例
调用Application的onCreate

你可能感兴趣的:(android,学习,笔记)