Android从系统启动-->Launcher加载-->用户应用开启

来源:互联网 发布:淘宝图片保护怎么弄 编辑:程序博客网 时间:2024/05/16 23:56

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的所有信息,开启标志位MAINActivity,

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绘制出来

          

 

 

 

 

     

 

 

 

0 0