目录
Android系统底层启动源码分析(开机启动)
- 总体启动过程
- Android上电启动后主要执行脚本和启动的服务
- Android启动细节
- Android启动整体流程图
一、总体启动过程
• 启动入口:init进程,是Linux系统中用户空间的第一个进程
• 加载配置(init.rc)
• 启动孵化器(zygote)
• system_init启动Native层
• ServiceThread启动Java
二、Android上电启动后主要执行脚本和启动的服务
Init是第一个被加载的用户进程,其会先执行init.rc脚本,源码位置:/system/core/init/init.c
进程入口:Main方法,启动init.rc系统启动的配置文件
init.rc配置文件信息:
- 文件位置:/system/core/rootdir
- 守护进程启动(Daemon Process):/system/bin/servicemanager
- Zygote——app_main.cpp
在脚本里面各种create、mount、启动service等,例如启动重要的Zygote孵化器:
之后进入App_main,cpp中启动孵化器:
进入Runtime.Start:
注:
Init1 和init2 两个主要函数 ,其中init1主要是kernel启动后的对libraries层的intiàsystem_init(), 如其中的一些suiface manager、libc等,然后调用init2
Init2主要是对 Framwork层的init
三、 Android启动细节:
Early init -> init –> early boot -> boot
由Init启动Zygote之后:
当解析完init.rc和设备配置信息后会获取到一系列Action, Init将动作的执行划分为四个阶段:
- early-init
- Init
- early-boot
- boot
Zygote简介:
- 本身为Native的应用程序
- 由init进程通过init.rc加载
启动过程:
- Main方法中AppRuntime.start(),工作由父类AndroidRuntime来完成
- 在AndroidRuntime中启动“com.android.internal.os.ZygoteInit”的main方法
- 进入java世界的入口
细节内容:
在AndroidRuntime中同时启动的有:
- startVM——开启虚拟机(查看堆内存设置)
- 注册JNI函数
- 各类参数的传递
Zygote孵化器的守护进程(Daemon Process)
同时会开启Adb的守护进程,在此之后才可以用adb与Android设备连接,这也是为什么有时候Android系统界面还没起来,却可以用adb的原因:
Init.rc中的启动级别,通过on early init …on boot等区分
创建Java虚拟机JVM:
启动虚拟机并且注册JNI Native函数(JNI所用),为了后面加载libraries中的C/C++代码
ServerThead的启动:
启动步骤:
- ZygoteInit在main方法中利用JNI开启com.android.server.SystemServer
-
启动system_init.cpp处理Native层的服务
- 然后调用SystemServer的init2()
-
启动ServiceThread,启动android服务
- Launcher启动
细节内容
- preloadClasses()—通过反射加载各个类
- Launcher的启动—通过过滤器中HOME配置加载
预加载class(Zygote中的main函数中执行,这个过程大约加载了2000多个类,消耗15s以上)
到init2中PackageManager会扫描所有apk的清单文件,将带有Home的启动(所有开机启动的apk都会在这一步启动)
四、Android启动整体流程图
博主热门文章推荐:
一篇读懂系列:
LoRa Mesh系列:
网络安全系列:
- ATECC508A芯片开发笔记(一):初识加密芯片
- SHA/HMAC/AES-CBC/CTR 算法执行效率及RAM消耗 测试结果
- 常见加密/签名/哈希算法性能比较 (多平台 AES/DES, DH, ECDSA, RSA等)
- AES加解密效率测试(纯软件AES128/256)–以嵌入式Cortex-M0与M3 平台为例
嵌入式开发系列:
- 嵌入式学习中较好的练手项目和课题整理(附代码资料、学习视频和嵌入式学习规划)
- IAR调试使用技巧汇总:数据断点、CallStack、设置堆栈、查看栈使用和栈深度、Memory、Set Next Statement等
- Linux内核编译配置(Menuconfig)、制作文件系统 详细步骤
- Android底层调用C代码(JNI实现)
- 树莓派到手第一步:上电启动、安装中文字体、虚拟键盘、开启SSH等
- Android/Linux设备有线&无线 双网共存(同时上内、外网)
AI / 机器学习系列:
- AI: 机器学习必须懂的几个术语:Lable、Feature、Model…
- AI:卷积神经网络CNN 解决过拟合的方法 (Overcome Overfitting)
- AI: 什么是机器学习的数据清洗(Data Cleaning)
- AI: 机器学习的模型是如何训练的?(在试错中学习)
- 数据可视化:TensorboardX安装及使用(安装测试+实例演示)