Android启动流程
首先:当系统引导程序启动Linux内核时,内核会开始加载各种数据结构和驱动,有了驱动之后, 开始启动Android系统并加载用户级别的第一个进程init (system/core/init/init.c)。首先执行main方法, 方法中开始创建各种文件夹和挂载目录,初始化输入输出日志,加载并解析配置文件init.rc文件,并依据配置文件中的启动级别,启动相关的Service。
加载init.rc文件,主要启动了一个Zygote(孵化器)进程,此进程是Android 系统启动关键服务的一个母进程。同时开启各种守护进程,如Zygote,adb,media等。
//init.rc文件
// 加载app_process目录下的四个文件,主要是app_main.cpp文件
service zygote /system/bin/app_process-Xzygote /system/bin --zygote --start-system-server
socketzygote stream 666
onrestartwrite /sys/android_power/request_state wake
onrestartwrite /sys/power/state on
onrestartrestart media
onrestartrestart netd
解析配置文件后把app_main.cpp加载至内存,并定义Android运行时环境,使用运行时环境启动Zygote初始化类。main方法中调用AppRuntime.start方法,AppRuntime是继承AndroidRuntime,在start方法内:
1. 启动虚拟机startVm();
2. 注册JNI startReg(JNIEnv* env);
不注册JNI根本跑步起来,因为Android虚拟机是基于Java虚拟机, 和上层做交互的时候都是通过JNI.
3. 启动ZygoteInit.java;
runtime.start("com.android.internal.os.ZygoteInit",startSystemServer);
现在从C或C++代码中进入到代码中,ZygoteInit.java初始化类,对Zygote进程进行初始化。在main中:
1. preloadClasses():反射加载preloadclasses文件中的核心类,近2000个,耗时20s左右,可在这里进行优化,处理为分批加载
2. preloadResources():加载一些需要的资源文件。
3. startSystemServer():通过反射开启SystemServer.java
4. 孵化器分叉开启SystemServer类, 使用指定参数,启动系统其他关键服务
SystemServer.java,在main方法中调用一个native public static void init1();方法,这个init1()方法,通过com_android_server_SystemServer.cpp进行跳转,通过JNI调用System_init.cpp的system_init()方法
System_init.cpp 的system_int方法中启动所有native的服务,其中最重要的是SurfaceManager和MediaFramework, 在方法最后,会回调SystemServier.java的init2()方法,创建ServerThread并开启线程,线程内部初始化Framework层的所有服务,此时java世界启动完毕, 下面就是加载Launcher应用, 加载所有已安装的apk,启动手机
ServerThread, 是SystemServer的一个继承thread的内部类, 在run方法内开启了Framework层的所有service,当所有服务都开启完毕后,PackManagerService 开始工作了
PackageManagerService首先会扫描所有apk清单文件中的权限及四大组件信息, 存储在文件中, 并加载至内存。最后找到具有: <category android: name ="android.intent.category.HOME"/>这个过滤器信息的Launcher应用, 然后把它的的信息交给ActivityManagerService
ActivityManagerService,让它请求Android运行时的Zygote, 让他给孵化一个进程ActivityThread,获取到Launcher的所有信息, 开启标志位MAIN的Activity,
Launcher应用就正式启动完毕, 整个手机也就开启了, 等待着用户的操作
Launcher内设置了onItemClick, 当用户点击一个应用时, 获取被点击应用的所有信息,交个ActivityManagerService, 先分配一个任务栈startActivityMayWait(), 通过Process.start()方法,请求AndroidRuntime,调用Zygote孵化一个进程ActivityThread,分配给被点击的应用
ActivityThread,首先获取应用的所有信息, 然后加载MainActivity的对象,对象加载完毕后, 通知Launcher, 由Launcher的进程ActivityThread调用onPause方法,将Launcher隐藏起来.
然后就开始加载应用的第一个MainActivity,也就要先加载第一个View.
首先由ActivityThread调用attach方法 ,给自己分配一个容器, 这个方法内会调用PhoneWindow, 创建一个Window对象.
在调用onCreate方法(并非直接调用,比较复杂…), 获取PhoneWindow对象 , 调用其setContentView方法, 方法内会先判断父容器是否存在
不存在:就会创建一个installDecor();(Decor继承FrameLayout)
存在就removeAllViews,进行复用
把当前的viewadd到这个父容器中,关联个中view对象
然后就会调用onDraw的一系列的方法, 将view绘制出来