Android启动流程源码分析

发布于:2025-03-20 ⋅ 阅读:(18) ⋅ 点赞:(0)

Android启动流程源码分析

一、前言

Android系统的启动是一个复杂的过程,涉及从底层Linux内核到上层应用的多个阶段。本文将深入分析Android系统的启动流程,帮助读者理解系统是如何从按下电源键到显示桌面的。

二、启动流程概述

2.1 启动阶段

  1. Boot ROM和Bootloader

    • 加载引导程序
    • 初始化硬件设备
    • 建立内存空间映射
  2. Linux内核启动

    • 启动内核进程
    • 挂载根文件系统
    • 启动用户空间进程
  3. Init进程启动

    • 解析init.rc配置
    • 启动关键服务
    • 创建系统目录
  4. 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")
    }
}

五、性能优化

  1. 启动速度优化

    • 延迟初始化非核心组件
    • 采用懒加载策略
    • 优化ContentProvider的创建
  2. 系统资源优化

    • 合理配置进程优先级
    • 控制后台服务数量
    • 优化系统服务调用

六、面试题解析

  1. Android系统启动流程的主要阶段是什么?

    • Boot ROM和Bootloader:硬件初始化和引导
    • Linux内核:启动内核和基础进程
    • Init进程:解析配置和启动关键服务
    • Zygote进程:创建虚拟机和应用进程
    • SystemServer:启动系统服务
    • Launcher:显示桌面
  2. Zygote进程的作用是什么?

    • 创建和初始化Java虚拟机
    • 预加载系统类和资源
    • 作为应用进程的父进程
    • 提供进程创建服务
  3. SystemServer启动了哪些重要服务?

    • ActivityManagerService:组件管理
    • WindowManagerService:窗口管理
    • PackageManagerService:应用管理
    • PowerManagerService:电源管理

七、开源项目实战

  1. booster

    • Android应用性能优化框架
    • 提供启动优化方案
    • 支持多种优化策略
  2. AndroidStartup

    • Android启动任务管理框架
    • 支持同步异步任务
    • 优化应用启动速度

八、总结

通过本文的学习,我们深入理解了:

  1. Android系统的完整启动流程
  2. 各个阶段的源码实现
  3. 启动优化的关键技术
  4. 性能监控的实现方法

系统启动流程的知识对于以下方面都很重要:

  1. 理解Android系统架构
  2. 解决启动相关问题
  3. 优化应用启动速度
  4. 开发系统级应用

下一篇,我们将分析Android系统服务(AMS、WMS、PMS)的实现原理。