Android启动流程源码分析
一、前言
Android系统的启动是一个复杂的过程,涉及从底层Linux内核到上层应用的多个阶段。本文将深入分析Android系统的启动流程,帮助读者理解系统是如何从按下电源键到显示桌面的。
二、启动流程概述
2.1 启动阶段
Boot ROM和Bootloader
- 加载引导程序
- 初始化硬件设备
- 建立内存空间映射
Linux内核启动
- 启动内核进程
- 挂载根文件系统
- 启动用户空间进程
Init进程启动
- 解析init.rc配置
- 启动关键服务
- 创建系统目录
Zygote进程启动
- 创建Java虚拟机
- 预加载系统类和资源
- 启动SystemServer
2.2 关键流程图
// 系统启动流程示意
PowerOn -> BootROM -> Bootloader -> Kernel -> Init -> Zygote -> SystemServer -> Launcher
三、源码分析
3.1 Init进程启动
// system/core/init/init.cpp
int main(int argc, char** argv) {
// 设置进程名称
if (!strcmp(basename(argv[0]), "init")) {
FirstStageMain(argc, argv);
} else {
// 处理其他init进程变体
return SecondStageMain(argc, argv);
}
}
int FirstStageMain(int argc, char** argv) {
// 挂载必要的文件系统
mount("tmpfs", "/dev", "tmpfs", MS_NOSUID, "mode=0755");
mkdir("/dev/pts", 0755);
mkdir("/dev/socket", 0755);
mount("devpts", "/dev/pts", "devpts", 0, NULL);
// 启动属性服务
property_init();
// 解析init.rc文件
Parser& parser = Parser::GetInstance();
parser.ParseConfig("/init.rc");
// 进入主循环
while (true) {
// 处理子进程退出
if (handle_signal() < 0) {
break;
}
// 执行命令队列
execute_one_command();
// 重启已死进程
restart_processes();
}
return 0;
}
3.2 Zygote进程启动
// frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
public static void main(String argv[]) {
ZygoteServer zygoteServer = null;
try {
// 创建Server端Socket
zygoteServer = new ZygoteServer(isPrimaryZygote);
// 预加载类和资源
preload(bootTimingsTraceLog);
// 启动SystemServer进程
if (startSystemServer) {
Runnable r = forkSystemServer(abiList, zygoteSocketName,
zygoteServer);
if (r != null) {
r.run();
return;
}
}
// 进入循环等待创建应用进程
caller = zygoteServer.runSelectLoop(abiList);
} catch (Throwable ex) {
Log.e(TAG, "System zygote died with exception", ex);
throw ex;
}
}
private static void preload(BootTimingsTraceLog bootTimingsTraceLog) {
// 预加载Java类
preloadClasses();
// 预加载资源
preloadResources();
// 预加载OpenGL
preloadOpenGL();
// 预加载共享库
preloadSharedLibraries();
// 预加载文本资源
preloadTextResources();
}
3.3 SystemServer进程启动
// frameworks/base/services/java/com/android/server/SystemServer.java
private void run() {
try {
// 准备系统上下文
createSystemContext();
// 创建系统服务管理器
mSystemServiceManager = new SystemServiceManager(mSystemContext);
LocalServices.addService(SystemServiceManager.class,
mSystemServiceManager);
// 启动引导服务
startBootstrapServices();
// 启动核心服务
startCoreServices();
// 启动其他服务
startOtherServices();
// 系统就绪
SystemServiceManager.startBootPhase(
SystemService.PHASE_BOOT_COMPLETED);
} catch (Throwable ex) {
throw ex;
}
}
private void startBootstrapServices() {
// 启动Installer服务
Installer installer = mSystemServiceManager.startService(Installer.class);
// 启动Activity管理服务
mActivityManagerService = mSystemServiceManager.startService(
ActivityManagerService.Lifecycle.class).getService();
mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
// 启动电源管理服务
mPowerManagerService = mSystemServiceManager.startService(
PowerManagerService.class);
// 启动包管理服务
mPackageManagerService = PackageManagerService.main(mSystemContext,
installer, mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF,
mOnlyCore);
}
四、实战应用
4.1 系统启动优化
class BootCompletedReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
if (intent.action == Intent.ACTION_BOOT_COMPLETED) {
// 延迟初始化非核心功能
val workManager = WorkManager.getInstance(context)
val initWork = OneTimeWorkRequestBuilder<InitializationWorker>()
.setInitialDelay(5, TimeUnit.SECONDS)
.build()
workManager.enqueue(initWork)
}
}
}
class InitializationWorker(
context: Context,
params: WorkerParameters
) : Worker(context, params) {
override fun doWork(): Result {
// 执行初始化任务
initializeComponents()
return Result.success()
}
private fun initializeComponents() {
// 初始化组件
// 预加载数据
// 建立网络连接等
}
}
4.2 启动时间监控
class BootTimeMonitor {
private val timePoints = mutableMapOf<String, Long>()
fun recordTimePoint(point: String) {
timePoints[point] = SystemClock.elapsedRealtime()
}
fun calculateDuration(startPoint: String, endPoint: String): Long {
val startTime = timePoints[startPoint] ?: return -1
val endTime = timePoints[endPoint] ?: return -1
return endTime - startTime
}
fun dumpTimings() {
timePoints.forEach { (point, time) ->
Log.d(TAG, "$point: $time ms")
}
}
}
// 使用示例
class MyApplication : Application() {
private val bootMonitor = BootTimeMonitor()
override fun onCreate() {
super.onCreate()
bootMonitor.recordTimePoint("ApplicationStart")
// 初始化操作
initializeComponents()
bootMonitor.recordTimePoint("ApplicationReady")
val duration = bootMonitor.calculateDuration(
"ApplicationStart", "ApplicationReady")
Log.d(TAG, "Application initialization took $duration ms")
}
}
五、性能优化
启动速度优化
- 延迟初始化非核心组件
- 采用懒加载策略
- 优化ContentProvider的创建
系统资源优化
- 合理配置进程优先级
- 控制后台服务数量
- 优化系统服务调用
六、面试题解析
Android系统启动流程的主要阶段是什么?
- Boot ROM和Bootloader:硬件初始化和引导
- Linux内核:启动内核和基础进程
- Init进程:解析配置和启动关键服务
- Zygote进程:创建虚拟机和应用进程
- SystemServer:启动系统服务
- Launcher:显示桌面
Zygote进程的作用是什么?
- 创建和初始化Java虚拟机
- 预加载系统类和资源
- 作为应用进程的父进程
- 提供进程创建服务
SystemServer启动了哪些重要服务?
- ActivityManagerService:组件管理
- WindowManagerService:窗口管理
- PackageManagerService:应用管理
- PowerManagerService:电源管理
七、开源项目实战
-
- Android应用性能优化框架
- 提供启动优化方案
- 支持多种优化策略
-
- Android启动任务管理框架
- 支持同步异步任务
- 优化应用启动速度
八、总结
通过本文的学习,我们深入理解了:
- Android系统的完整启动流程
- 各个阶段的源码实现
- 启动优化的关键技术
- 性能监控的实现方法
系统启动流程的知识对于以下方面都很重要:
- 理解Android系统架构
- 解决启动相关问题
- 优化应用启动速度
- 开发系统级应用
下一篇,我们将分析Android系统服务(AMS、WMS、PMS)的实现原理。