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的所有信息,开启标志位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绘制出来
- Android从系统启动-->Launcher加载-->用户应用开启
- Android系统启动流程 七--launcher
- Android Launcher应用的加载过程
- Android launcher加载流程
- Android launcher加载流程
- Android Launcher 应用开发
- 系统启动Android应用流程分析
- Android系统启动流程(四)Launcher启动过程与系统启动流程
- Android系统启动流程(四)Launcher启动过程与系统启动流程
- Android 自定义应用抽屉Launcher
- 如何从Launcher中隐藏应用图标?
- Android从Linux系统启动的步骤
- Android Launcher桌面图标的加载和存储
- Android Launcher桌面图标的加载和存储
- Android Launcher加载so库问题
- Android Launcher加载流程源码分析
- 从Android Launcher源码学习自定义标签
- Android应用程序从Launcher启动流程
- android wifi 问题定位
- android zygote 到launcher的启动关键点
- Socket编程与线程
- [经典面试题][网易]数组分割
- UVA1449 AC自动机
- Android从系统启动-->Launcher加载-->用户应用开启
- codeforces #247D Random Task (数位dp+二分搜索)
- poj 1703 Find them, Catch them 带权并查集OR种类并查集
- 解决python中用zipfile解压缩文件时中文文件名乱码的问题
- 数组中出现次数超过一半的数字
- 最快最简单的排序——桶排序
- 记录一下linuxmint 17安装搜狗输入法的过程
- 14年的总结与15年的展望
- HDU 1236.排名