对于Android底层的东西一直不太懂,特地查找资料进行了总结,分享给大家。
1、Android系统启动
Android系统启动从用户按下电源键开始。
-
用户按下电源键,引导芯片代码从预定义的地方开始执行,加载引导程序BootLoader到RAM,然后开始执行。
-
启动引导程序BootLoader,用来引导Android系统的启动工作。然后,Linux内核启动。
-
Linux内核启动后,设置缓存、被保护存储器、计划列表、加载驱动等操作。当内核完成系统设置后,会查找“init”文件,然后启动Root进程。
-
Linux内核创建用户级进程,init进程(上帝般存在)。
-
Init进程会创建Zygote孵化器进程。Zygote进程存在一个Socket服务端,以及一些Framework层共享的类和资源。
-
Zygote进程会先孵化出一个SystemServer进程。SystemServer进程用来加载一些系统服务,比如AMS、WMS、PMS等,保存有系统服务需要的类和资源,存在一个Socket客户端。
-
AMS服务用来管理Activity的创建,当需要启动Activity时,会通过SystemServer进程中的Socket客户端向Zygote进程发送消息,请求创建Activity。
init进程是Android系统中用户空间的第一个进程,作为第一个进程,它被赋予了很多极其重要的工作职责,比如创建zygote(孵化器)和属性服务等。init进程是由多个源文件共同组成的,这些文件位于源码目录system/core/init。
以上部分内容引用于刘望舒的博客:https://blog.csdn.net/itachi85/article/details/54783506
2、App启动过程
App启动从用户按下桌面图标开始。
-
App都是由桌面启动器启动的,桌面启动器自身也是一个App,它也存在一个进程,称为Launcher进程,也叫调用者进程。
-
用户按下桌面上的App图标后,Launcher进程会将请求启动主活动(MainActivity)的请求以Binder的方式发送给AMS服务。
-
AMS服务收到请求后,交付给ActivityStarter处理intent和flag信息,然后交给ActivityStackSuperVisior/ActivityStack处理Activity进程相关流程,同时通过Socket客户端向Zygote进程请求孵化新进程。
-
Zygote进程收到请求后,创建一个新进程,这个新进程就是APP所在进程。
-
在新进程里创建ActivityThread线程,包含main方法,是Android程序的入口,ActivityThread所在线程即是主线程(UI线程)。同时创建ApplicationThread和W线程,他们都继承自Binder类。ApplicationThread线程在主活动创建之前创建,负责监听AMS发送来的创建Activity的请求。Activity创建后,W线程监听WMS发来的消息(比如点击和触摸事件),将消息发送给DectorView,如果DecoterView没有处理,则传递给PhoneWindow,如果PhoneWindow也没有处理,则传递给Activity通过Handler来处理消息。
-
ActivityThread中会调用prepareMainLooper()方法,创建一个Looper对象,Looper对象会创建一个消息队列MessageQueue,调用Looper.loop()方法后UI线程会进入消息循环体,不断从消息队列中取出消息Message对象并处理消息。
-
ApplicationThread类监听到了创建Activity的请求,ActivityThread通过ClassLoader类加载器加载Activity并创建Activity实例,然后回调onCreate()方法。
3、其他解释
系统服务主要由WMS与AMS构成,其中WMS主要负责监听与处理与窗口相关的事件(如监听用户点击、手势),AMS主要负责管理Activity(如创建Activity)。
WMS主要由两个类组成:KeyQ类、InputDispatcherThread类。这两个分别创建一个线程,KeyQ类负责不断将用户消息存储到QueueEvent消息队列中,InputDispatcherThread负责不断从QueueEvent中取出消息进行处理或分发给相应应用。
ActivityStarter:Activity启动控制器
ActivityStack:管理任务栈里的Activity
参考文章:
网友评论