Skip to content

Android 启动流程深度解析

目录

  1. Bootloader 启动
  2. Kernel 初始化
  3. Init 进程启动
  4. Zygote 进程启动
  5. SystemServer 启动
  6. Launcher 启动
  7. App 冷启动/热启动流程
  8. Activity 启动流程源码分析
  9. 性能优化点
  10. 面试考点

1. Bootloader 启动

1.1 Bootloader 概述

Bootloader 是设备开机后运行的第一段软件代码,负责初始化硬件、加载操作系统内核,是连接硬件和软件的关键桥梁。

┌─────────────────────────────────────────────────────────────┐
│                    Android Boot Flow                        │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   Power On  ──→  Bootloader  ──→  Kernel  ──→  Init        │
│                       ↓              ↓          ↓          │
│               (硬件初始化)      (内核加载)   (用户空间)     │
│                       ↓              ↓          ↓          │
│               内存检测        设备树解析   系统服务启动     │
│                                                             │
└─────────────────────────────────────────────────────────────┘

1.2 Bootloader 的启动阶段

Android 采用多级 Bootloader 设计,以 AArch64 架构为例:

启动流程详细时序图:
┌────────────────────────────────────────────────────────────────────┐
│  Stage 0: BL1 (Reset Handler)                                      │
│  - 复位向量表                                                     │
│  - 初始化 MMU                                                      │
│  - 跳转到 BL2                                                      │
└────────────────────────────────────────────────────────────────────┘

┌────────────────────────────────────────────────────────────────────┐
│  Stage 1: BL2 (ATF - ARM Trusted Firmware)                         │
│  - 初始化安全世界和非安全世界                                       │
│  - 设置 TrustZone                                                   │
│  - 跳转到 BL33 (正常世界)                                          │
└────────────────────────────────────────────────────────────────────┘

┌────────────────────────────────────────────────────────────────────┐
│  Stage 2: BL33 (UEFI / Little)                                     │
│  - 初始化基本硬件(内存、存储、显示)                                 │
│  - 读取分区表                                                      │
│  - 加载 Kernel + DTB                                               │
│  - 传递启动参数                                                    │
│  - 跳转到 Kernel Entry Point                                       │
└────────────────────────────────────────────────────────────────────┘

1.3 Little Bootloader 源码分析

Little 是 Android 项目开源的 Bootloader,位于 prebuilts/bootloader/

关键代码解析:

c
// bootloader/little/init.c
// 系统初始化入口

static void early_init(void) {
    // 1. 初始化串口通信
    uart_init();
    
    // 2. 初始化内存控制器
    dram_init();
    
    // 3. 初始化显示控制器
    display_init();
}

// 加载内核和 DTB
static int load_kernel(void) {
    // 从分区表读取 boot 分区
    // 解压 kernel 镜像
    // 加载到内存指定位置
    return 0;
}

// 启动内核
static void boot_kernel(void) {
    // 设置启动参数
    // 传递 device tree
    // 跳转到内核入口
}

1.4 Boot 分区结构

boot.img 结构:
┌─────────────────────────────────────────────────────────────┐
│  Header (1 KB)                                              │
│  ├─ Kernel 地址                                             │
│  ├─ Ramdisk 地址                                            │
│  ├─ Second 加载地址                                         │
│  ├─ ...                                                     │
├─────────────────────────────────────────────────────────────┤
│  Kernel (压缩)                                              │
│  - 通常使用 gzip 或 lz4 压缩                                  │
├─────────────────────────────────────────────────────────────┤
│  Ramdisk (压缩)                                             │
│  - 包含 init 和早期系统初始化脚本                             │
├─────────────────────────────────────────────────────────────┤
│  Device Tree (DTB)                                          │
│  - 硬件描述表                                               │
└─────────────────────────────────────────────────────────────┘

使用 mkbootimg 工具查看:

bash
# 反解 boot.img
mkbootimg --unpack boot.img

# 输出目录结构
├── kernel              # 解压后的内核
├── ramdisk             # 初始 ramdisk
├── dtb                 # device tree
└── ramdisk/            # 解压后的 ramdisk 内容
    ├── init            # 第一个用户空间进程
    ├── init.rc         # init 配置文件
    └── ...

2. Kernel 初始化

2.1 Kernel 启动流程

Kernel 启动详细流程:
┌──────────────────────────────────────────────────────────────┐
│  1. 内核解压                                                 │
│     - 从 boot.img 解压到内存                                  │
│     - 跳转到内核入口点                                       │
├──────────────────────────────────────────────────────────────┤
│  2. 早期初始化                                              │
│     - 初始化 CPU 寄存器                                       │
│     - 设置堆栈                                               │
│     - 内存映射                                               │
├──────────────────────────────────────────────────────────────┤
│  3. 内存初始化                                              │
│     - 内存检测                                               │
│     - 分配内存页                                             │
│     - 初始化页表                                             │
├──────────────────────────────────────────────────────────────┤
│  4. 设备初始化                                              │
│     - 初始化时钟                                             │
│     - 初始化中断控制器                                       │
│     - 初始化 DMA                                             │
├──────────────────────────────────────────────────────────────┤
│  5. 驱动加载                                                │
│     - 注册总线驱动                                           │
│     - 加载字符设备驱动                                       │
│     - 加载块设备驱动                                         │
├──────────────────────────────────────────────────────────────┤
│  6. 根文件系统挂载                                         │
│     - 挂载 ramfs                                             │
│     - 执行 init 程序                                         │
└──────────────────────────────────────────────────────────────┘

2.2 内核入口函数源码分析

架构依赖的启动代码 (arch/arm64/kernel/head.S):

assembly
// arch/arm64/kernel/head.S
// AArch64 架构内核入口

.text
.global __primary_switch
.global __boot_cpu_mode

ENTRY(__primary_switch)
    // 1. 初始化二级页表
    mov     x20, sp
    
    // 2. 保存启动模式
    mrs     x19, tpidr_el0
    
    // 3. 初始化栈指针
    mov     sp, x0
    
    // 4. 跳转到 C 代码
    bl      start_kernel
    
    // 5. 内核异常处理
    b       .
ENDPROC(__primary_switch)

start_kernel() 函数 (init/main.c):

c
// init/main.c - 内核初始化主入口

asmlinkage void __init start_kernel(void)
{
    // 1. 早期内存初始化
    setup_arch(&command_line);
    
    // 2. 初始化各种锁
    smp_setup_processor_id();
    debug_locks_early();
    
    // 3. 内存管理初始化
    AGGREGATE_PM();
    build_all_zonelists(NULL);
    page_reporting_init();
    pgdat_resize_init();
    // ...
    
    // 4. 初始化各种子系统
    init_command_line();
    setup_nr_cpu_ids();
    setup_per_cpu_areas();
    boot_cpu_hotplug_init();
    smp_prepare_boot_cpu();
    
    // 5. 初始化调度器
    sched_init();
    
    // 6. 初始化内存分配器
    memblock_allow_resize();
    // ...
    
    // 7. 注册设备驱动
    rest_init();  // 创建 idle 任务
    
    // 8. 挂载根文件系统
    // ...
}

2.3 Device Tree 解析

Device Tree 是 Android 内核了解硬件配置的方式。

示例:device tree 节点

dts
// arch/arm64/boot/dts/qcom/sdm845.dtsi

/ {
    model = "Qualcomm SDM845";
    compatible = "qcom,sdm845";
    
    cpus {
        cluster0 {
            cpu@0 {
                device_type = "cpu";
                compatible = "arm,cortex-a73";
                reg = <0x0>;
                clock-latency-ns = <0>;
            };
            cpu@1 {
                device_type = "cpu";
                compatible = "arm,cortex-a73";
                reg = <0x1>;
            };
            // ...
        };
    };
    
    memory@0 {
        device_type = "memory";
        reg = <0x0 0x40000000>;
    };
    
    display-subsystem {
        mdss_mdp {
            compatible = "qcom,mdss-mdp-8x96";
            interrupts = <GPI_INTERRUPT 70 0>;
        };
    };
};

2.4 重要驱动加载

Android 特有的驱动模块:

c
// drivers/android/lowmemorykiller.c
// 内存回收机制驱动

static int __init lmk_init(void)
{
    // 创建设备节点 /dev/lowmemorykiller
    lmk_dev = misc_register(&lmk_misc);
    
    // 初始化内存监控
    // ...
    return 0;
}

// drivers/android/sync.c
// 同步栅栏机制(用于渲染同步)

int sync_timeline_create(const char *name)
{
    struct sync_timeline *obj;
    // 创建 timeline 对象
    // 用于渲染管线同步
}

3. Init 进程启动

3.1 Init 进程概述

Init 是 Android 系统的第一个用户空间进程(PID=1),负责整个系统的初始化。

Init 进程启动流程:
┌─────────────────────────────────────────────────────────────────┐
│  Kernel 启动完成 ──→ 挂载根文件系统 ──→ 执行 init 程序        │
│                      ↓                                         │
│              ┌───────────────────────────────┐                │
│              │  /init                        │                │
│              │    - 编译自 system/core/init  │                │
│              └───────────────────────────────┘                │
│                      ↓                                        │
│              ┌───────────────────────────────┐                │
│              │  解析 init 配置文件             │                │
│              │  - init.rc                     │                │
│              │  - init.<board>.rc             │                │
│              │  - ueventd.rc                  │                │
│              └───────────────────────────────┘                │
│                      ↓                                        │
│              ┌───────────────────────────────┐                │
│              │  启动核心服务                  │                │
│              │  - property_service            │                │
│              │  - logd                        │                │
│              │  - ueventd                     │                │
│              │  - healthd                     │                │
│              │  - watchdogd                   │                │
│              └───────────────────────────────┘                │
│                      ↓                                        │
│              ┌───────────────────────────────┐                │
│              │  启动 Zygote                   │                │
│              └───────────────────────────────┘                │
└─────────────────────────────────────────────────────────────────┘

3.2 Init 源码分析

Init 主循环 (system/core/init/init.cpp):

cpp
// system/core/init/init.cpp

int main(int argc, char** argv) {
    // 1. 设置初始环境
    if (argc != 0 && argv[0] != nullptr) {
        setprogname(argv[0]);
    }
    
    // 2. 设置默认参数
    if (argc > 1) {
        setenv("ro.bootargs", argv[1], 1);
    }
    
    // 3. 解析内核命令行参数
    ParseKmsg();
    InitLogging();
    
    // 4. 初始化属性服务
    property_init();
    
    // 5. 解析 init 配置文件
    std::vector<std::string> filenames = {
        "init Hardware.rc",
        "init.usb.rc",
        "init.console.rc",
        // ...
    };
    
    // 6. 创建早期服务
    // 7. 进入主事件循环
    event_loop();
}

// 事件循环
static void event_loop() {
    // 处理命令、action 等
    while (true) {
        // 读取命令
        std::string line;
        getline(command_pipe, line);
        
        // 执行命令
        if (!line.empty()) {
            RunAction(line);
        }
    }
}

3.3 Init 配置文件解析

init.rc 文件格式:

ini
# system/core/rootdir/init.rc

# 定义属性
property: ro.init.version=1.0

# 定义服务(早期启动)
service ueventd /system/bin/ueventd
    class main
    user root
    group root
    critical

service property /system/bin/property_service
    class main
    user root
    group root
    critical

# 定义服务(后期启动)
on init
    class_start main
    
    # 设置基本参数
    setprop ro.boot.bootloader ${bootloader}
    setprop ro.boot.serialno ${serialno}
    
    # 挂载文件系统
    mount tmpfs tmpfs /dev tmpmode=0755
    
    # 启动 Zygote
    class_start late_init

on late-init
    # 启动 Zygote
    start zygote
    
    # 等待 Zygote 就绪
    wait /dev/socket/zygote

on boot
    # 启动 SystemServer
    start zygote_init
    class_start default

3.4 Init 服务生命周期

Init 服务状态机:
┌─────────────────────────────────────────────────────────────┐
│                                                             │
│   ┌──────────┐    启动命令    ┌──────────┐                │
│   │ disabled │    ──────────→ │  start   │                │
│   └──────────┘                └──────────┘                │
│        ↑                       |         |                │
│        │    服务停止          |  进程创建                │
│        │                       v         v                │
│   ┌──────────┐    进程退出    ┌──────────┐                │
│   │   dead   │    ←────────── │   run    │                │
│   └──────────┘                └──────────┘                │
│        ↑                       |                          │
│        │    超时重启          |  重启命令                 │
│        └───────────────────────┘                          │
│                                                             │
└─────────────────────────────────────────────────────────────┘

3.5 重要初始化动作

system/core/rootdir/init.rc 中的关键部分:

ini
# 设置系统属性
on early-init
    # 设置设备类型
    setprop ro.bootloader ${bootloader}
    
    # 设置 SELinux 状态
    setprop init.selinux ${selinux_state}
    
    # 创建必要目录
    mkdir /dev/cpuset 0755 root root
    mkdir /dev/cpuset/cpu0 0755 root root

# late-init 阶段
on late-init
    # 启动 Zygote 进程
    start zygote
    
    # 配置网络
    class_start early-init
    
    # 设置环境变量
    export PATH /system/bin:/system/xbin

# boot 阶段
on boot
    # 启动所有默认服务
    class_start default
    
    # 等待 SystemServer 启动完成
    wait /dev/socket/sysprop

4. Zygote 进程启动

4.1 Zygote 进程概述

Zygote 是 Android 应用进程的前身,通过 fork 机制快速创建新的应用进程。

Zygote 启动与进程创建流程:
┌─────────────────────────────────────────────────────────────────┐
│                                                             │
│   Init 启动 Zygote                                          │
│          ↓                                                   │
│   ┌─────────────────────────────────────┐                   │
│   │  zygote main.cpp                    │                   │
│   │  - 解析命令行参数                   │                   │
│   │  - 设置环境变量                     │                   │
│   │  - 创建套接字                       │                   │
│   │  - 预加载类                         │                   │
│   │  - 进入主循环                       │                   │
│   └─────────────────────────────────────┘                   │
│          ↓                                                   │
│   ┌─────────────────────────────────────┐                   │
│   │  forking 循环                        │                   │
│   │  while (true) {                      │                   │
│   │    1. accept 连接                    │                   │
│   │    2. 读取启动参数                   │                   │
│   │    3. fork 创建子进程                 │                   │
│   │    4. 子进程执行启动代码             │                   │
│   │  }                                  │                   │
│   └─────────────────────────────────────┘                   │
│          ↓                                                   │
│   ┌─────────────────────────────────────┐                   │
│   │  子进程(应用进程)                  │                   │
│   │  - 加载指定类                       │                   │
│   │  - 调用 main 方法                    │                   │
│   └─────────────────────────────────────┘                   │
│                                                             │
└─────────────────────────────────────────────────────────────┘

4.2 Zygote 源码分析

Zygote 主入口 (app_process.cpp):

cpp
// frameworks/base/core/jni/com_android_internal_os_ZygoteInit.cpp

static int registerNativeMethods(JNIEnv* env, const char* className,
                                  JNINativeMethod* gMethods, int numMethods)
{
    // 注册 Native 方法
    // ...
    return JNI_ERR;
}

int main(int argc, char* const argv[]) {
    // 1. 解析命令行参数
    vector<String16> args;
    for (int i = 1; i < argc; i++) {
        String16 arg(argv[i], strlen(argv[i]));
        args.push_back(arg);
    }
    
    // 2. 初始化 Native 桥接
    if (zygoteInit(args) != 0) {
        return -1;
    }
    
    // 3. Java VM 初始化
    return runtime->start("main_sdk", mainSdk);
}

static int zygoteInit(const Vector<String16>& args) {
    // 设置环境变量
    setenv("JAVA_OPTS", "-Xms64m -Xmx64m", 0);
    
    // 创建 Runtime
    JavaVMInitArgs vm_args;
    vm_args.version = JNI_VERSION_1_6;
    vm_args.nOptions = nOptions;
    vm_args.options = options;
    vm_args.ignoreUnrecognized = false;
    
    // 创建 JVM
    if (JniCreateJavaVM(&javaVm, &vm_args) < 0) {
        return -1;
    }
    
    // 初始化 JNI 环境
    JavaVM* vm = javaVm;
    JNIEnv* env = nullptr;
    if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
        return -1;
    }
    
    // 设置 JNI 全局引用
    return -1;
}

ZygoteInit.java 源码分析:

java
// frameworks/base/core/java/com/android/internal/os/ZygoteInit.java

public static final void main(String[] args) {
    // 1. 设置启动时间属性
    System.setProperty("abc.shout.zygote.start.time",
                       Long.toString(System.currentTimeMillis()));
    
    // 2. 初始化 Zygote
    try {
        // 调用 Native 方法初始化
        ZygoteInit.zygoteInit(args);
    } catch (RuntimeException e) {
        LOG.e("ZygoteInit", "Runtime exception in zygote init", e);
        System.exit(1);
    }
    
    // 3. 预加载类
    preloadedClasses();
    
    // 4. 进入 Zygote 服务循环
    if (startServerSocket()) {
        // 启动 socket 服务器
        // 等待 fork 请求
        runSelectLoop();
    }
}

// Zygote 服务循环
private static void runSelectLoop() {
    ArrayList<FileDescriptor> fds = new ArrayList<FileDescriptor>();
    fds.add(mServerSocket.getFileDescriptor());
    
    fdArray = new FileDescriptor[fds.size()];
    fds.toArray(fdArray);
    
    while (true) {
        try {
            // 1. select 等待连接
            ArrayList<Socket> sockets = acceptAndLog(fds);
            
            // 2. 处理每个连接
            for (int i = 0; i < sockets.size(); i++) {
                Socket socket = sockets.get(i);
                FileDescriptor[] fdPair = socket.getFDPair();
                
                // 3. fork 创建子进程
                int pid = Zygote.forkAndSpecialize(
                    uid, gid, gids,
                    debugFlags,
                    rlimits,
                    mountExternal,
                    seLinuxCtx,
                    fdsToClose,
                    fdsToIgnore,
                    fdPairs,
                    fileDescriptorArray,
                    uid,
                    null,
                    null,
                    null,
                    null,
                    null,
                    null,
                    null
                );
                
                if (pid == 0) {
                    // 子进程继续执行
                    zygoteInit(fdPair[0], fdPair[1]);
                } else if (pid > 0) {
                    // 父进程关闭子进程连接
                    socket.close();
                }
            }
        } catch (IOException e) {
            // 处理异常
        }
    }
}

4.3 预加载机制

ZygotePreload.java:

java
// frameworks/base/core/java/com/android/internal/os/ZygoteInit.java

private static native void preloadedClasses() {
    // Native 实现的预加载
}

private static void preLoadClasses() {
    // 预加载常用类
    preloadClass("java.lang.String");
    preloadClass("java.util.ArrayList");
    preloadClass("android.content.ContentValues");
    // ...
}

// 预加载资源
private static void preLoadResources() {
    // 预加载常用资源
    Resources resources = Resources.getSystem();
    preloadColor(resources, 0);
    preloadColor(resources, 1);
    // ...
}

4.4 Zygote 启动优化

Zygote64 与 Zygote32:

ini
# init.rc 中的 Zygote 服务定义

service zygote /system/bin/app_process \
    -Xzygote \
    --class-path=/system/framework.jar \
    --base=/system/framework \
    --zygote \
    --start-system-server \
    --socket-name=zygote
    
service zygote64 /system/bin/app_process64 \
    -Xzygote \
    --class-path=/system/framework.jar \
    --zygote \
    --socket-name=zygote64

5. SystemServer 启动

5.1 SystemServer 启动概述

SystemServer 是 Android 框架层的核心进程,负责启动所有系统服务。

SystemServer 启动流程:
┌─────────────────────────────────────────────────────────────────┐
│                                                             │
│   Zygote fork SystemServer                                  │
│          ↓                                                   │
│   ┌─────────────────────────────────────┐                   │
│   │  SystemServer.main()                │                   │
│   │  - 创建 VMRuntime                  │                   │
│   │  - 加载 SystemServer 类             │                   │
│   │  - 调用 run() 方法                   │                   │
│   └─────────────────────────────────────┘                   │
│          ↓                                                   │
│   ┌─────────────────────────────────────┐                   │
│   │  SystemServer 初始化                 │                   │
│   │  - 创建 VMRuntime                  │                   │
│   │  - 注册系统服务                    │                   │
│   │  - 启动核心服务                    │                   │
│   │  - 启动应用服务                    │                   │
│   └─────────────────────────────────────┘                   │
│          ↓                                                   │
│   ┌─────────────────────────────────────┐                   │
│   │  SystemServer 服务启动顺序          │                   │
│   │  1. ActivityManagerService          │                   │
│   │  2. SystemServer 进程初始化           │                   │
│   │  3. 其他核心服务                     │                   │
│   └─────────────────────────────────────┘                   │
│                                                             │
└─────────────────────────────────────────────────────────────┘

5.2 SystemServer 源码分析

SystemServer.java 主入口:

java
// frameworks/base/cmdline/SystemServer.java

public static void main(String[] args) {
    new SystemServer().run();
}

public void run() {
    // 1. 创建 VMRuntime
    VMRuntime.getRuntime().setTargetSdkVersion(999);
    
    // 2. 启动 SystemServer 进程
    init2();
    
    // 3. 注册系统服务
    registerServices();
    
    // 4. 启动核心服务
    startCoreServices();
    
    // 5. 启动应用服务
    startAppServices();
}

private void init2() {
    // 1. 设置系统属性
    SystemProperties.set("sys.boot_completed", "1");
    
    // 2. 初始化 Context
    mSystemContext = ContextImpl.createAppContext(
        VMRuntime.getRuntime(),
        new PackageInfo(PackageInfo.PACKAGE_NAME)
    );
    
    // 3. 初始化 InputManager
    InputManager.init(mSystemContext);
    
    // 4. 初始化其他服务
    // ...
}

服务启动顺序:

java
// frameworks/base/services/java/com/android/server/SystemServer.java

public void run() {
    // 第一阶段:核心服务
    // 1. ActivityManager
    mActivityManagerService = new ActivityManagerService();
    
    // 2. WindowManager
    mWindowManagerService = new WindowManagerService();
    
    // 3. InputManager
    mInputManagerService = new InputManager();
    
    // 第二阶段:系统服务
    // 4. PackageManager
    mPackageManagerService = new PackageManagerService();
    
    // 5. PowerManager
    mPowerManagerService = new PowerManagerService();
    
    // 6. AudioService
    mAudioService = new AudioService();
    
    // 第三阶段:应用服务
    // 7. TelephonyService
    // 8. LocationService
    // 9. 其他服务
    // ...
}

5.3 ActivityManagerService 启动

java
// frameworks/base/services/java/com/android/server/am/ActivityManagerService.java

public ActivityManagerService() {
    // 1. 初始化
    mActivityController = new ActivityTaskManagerService(this);
    
    // 2. 创建进程记录
    mProcessRecords = new HashMap<String, ProcessRecord>();
    
    // 3. 初始化应用列表
    mAppRecords = new HashMap<ApplicationRecord, ApplicationRecord>();
    
    // 4. 注册系统服务
    mSystemServer.registerService(ActivityManagerService.class.getName(), this);
}

public void start() {
    // 1. 启动 AMS 服务
    mActivityController.start();
    
    // 2. 加载系统应用
    loadSystemApplications();
    
    // 3. 启动系统进程
    startSystemProcesses();
    
    // 4. 启动 Launcher
    startLauncher();
}

5.4 PackageManagerService 启动

java
// frameworks/base/services/java/com/android/server/pm/PackageManagerService.java

public PackageManagerService(Context context, Installer installer,
                              boolean onlyCore) {
    // 1. 初始化 PMS
    mInstaller = installer;
    mOnlyCore = onlyCore;
    
    // 2. 加载包管理器
    mPackageParser = new PackageParser();
    
    // 3. 扫描已安装应用
    scanPackage();
}

public void scanPackage() {
    // 1. 扫描系统应用目录
    scanPackageDir("/system/app");
    
    // 2. 扫描用户应用目录
    scanPackageDir("/data/app");
    
    // 3. 解析 APK 文件
    // 4. 验证签名
    // 5. 安装应用
}

5.5 服务启动时序图

SystemServer 服务启动时序:
┌─────────────────────────────────────────────────────────────────┐
│                                                             │
│   0ms   ──→ SystemServer.main()                              │
│          ──→ 创建 VMRuntime                                  │
│          ──→ SystemServer.run()                              │
│                                                             │
│   100ms  ──→ ActivityManagerService 创建                       │
│          ──→ AMS 初始化完成                                    │
│          ──→ AMS 注册到 ServiceManager                          │
│                                                             │
│   200ms  ──→ WindowManagerService 创建                         │
│          ──→ WMS 初始化完成                                    │
│          ──→ WMS 注册到 ServiceManager                          │
│                                                             │
│   300ms  ──→ PackageManagerService 创建                        │
│          ──→ PMS 扫描系统应用                                  │
│          ──→ PMS 注册到 ServiceManager                          │
│                                                             │
│   500ms  ──→ 其他系统服务启动                                  │
│          ──→ 服务启动完成                                      │
│                                                             │
└─────────────────────────────────────────────────────────────────┘

6. Launcher 启动

6.1 Launcher 启动概述

Launcher 是用户看到的第一个应用,是 Android 系统的重要入口。

Launcher 启动流程:
┌─────────────────────────────────────────────────────────────────┐
│                                                             │
│   SystemServer 启动完成后                                   │
│          ↓                                                   │
│   ┌─────────────────────────────────────┐                   │
│   │  AMS 启动 Launcher                   │                   │
│   │  - 创建 Launcher 进程                │                   │
│   │  - 启动 LauncherActivity             │                   │
│   └─────────────────────────────────────┘                   │
│          ↓                                                   │
│   ┌─────────────────────────────────────┐                   │
│   │  Launcher 进程初始化                 │                   │
│   │  - 加载 Launcher 应用                │                   │
│   │  - 创建 LauncherActivity             │                   │
│   │  - 初始化布局                       │                   │
│   │  - 加载图标                         │                   │
│   └─────────────────────────────────────┘                   │
│          ↓                                                   │
│   ┌─────────────────────────────────────┐                   │
│   │  LauncherActivity 生命周期          │                   │
│   │  - onCreate()                       │                   │
│   │  - onStart()                        │                   │
│   │  - onResume()                       │                   │
│   └─────────────────────────────────────┘                   │
│          ↓                                                   │
│   ┌─────────────────────────────────────┐                   │
│   │  Launcher 显示完成                   │                   │
│   └─────────────────────────────────────┘                   │
│                                                             │
└─────────────────────────────────────────────────────────────┘

6.2 Launcher 启动源码分析

Launcher 启动过程:

java
// frameworks/base/services/java/com/android/server/am/ActivityManagerService.java

public final void startLauncherActivity(IActivityStarter starter,
                                         int userId) {
    // 1. 获取 Launcher 组件名
    ComponentName componentName = new ComponentName(
        "com.android.launcher3",
        "com.android.launcher3.Launcher"
    );
    
    // 2. 创建 Intent
    Intent intent = new Intent();
    intent.setComponent(componentName);
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    
    // 3. 启动 Launcher Activity
    ActivityStack stack = mRootTaskStack;
    stack.resumeTopActivityUncheckedOrder(false);
    
    // 4. 创建 Launcher 进程
    mProcessRecords.put(LAUNCHER_PROCESS_NAME, launcherProcess);
    
    // 5. 启动进程
    startProcessAsync(launcherProcess, true);
}

Launcher.java onCreate:

java
// packages/apps/Launcher3/src/com/android/launcher3/Launcher.java

public class Launcher extends Activity implements ... {
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        // 1. 设置主题
        setTheme(R.style.Theme_Launcher);
        
        // 2. 设置内容视图
        setContentView(R.layout.launcher);
        
        // 3. 初始化工作空间
        mWorkspace = findViewById(R.id.workspace);
        mWorkspace.onFinishLoading();
        
        // 4. 加载图标
        mModel = LauncherModel.getInstance(this);
        mModel.loadIcons();
        
        // 5. 初始化文件夹
        mFolderController = new FolderController(this);
        
        // 6. 初始化拖放功能
        mDragLayer = findViewById(R.id.drag_layer);
        mDragController = new DragController(this);
        
        // 7. 显示工作空间
        mWorkspace.show();
    }
    
    @Override
    protected void onStart() {
        super.onStart();
        // 注册广播接收器
        IntentFilter filter = new IntentFilter();
        filter.addAction(Intent.ACTION_SCREEN_ON);
        filter.addAction(Intent.ACTION_SCREEN_OFF);
        filter.addAction(Intent.ACTION_USER_PRESENT);
        registerReceiver(mBroadcastReceiver, filter);
    }
    
    @Override
    protected void onResume() {
        super.onResume();
        // 更新视图
        mWorkspace.onResume();
        // 恢复焦点
        mWorkspace.requestFocus();
    }
}

6.3 Launcher 初始化优化

异步加载优化:

java
// 异步加载图标
public void loadIconsAsync() {
    new AsyncTask<Void, Void, List<Icon>>() {
        @Override
        protected List<Icon> doInBackground(Void... params) {
            // 后台加载图标
            return loadIcons();
        }
        
        @Override
        protected void onPostExecute(List<Icon> icons) {
            // 更新 UI
            updateIcons(icons);
        }
    }.execute();
}

7. App 冷启动/热启动流程

7.1 启动类型对比

冷启动 vs 热启动:
┌─────────────────────────────────────────────────────────────────┐
│                                                             │
│   冷启动 (Cold Start)                                       │
│   ┌─────────────────────────────────────┐                   │
│   │ 1. 进程不存在                        │                   │
│   │ 2. 需要创建新进程                    │                   │
│   │ 3. 加载 APK                        │                   │
│   │ 4. 初始化 Application              │                   │
│   │ 5. 创建 Activity                   │                   │
│   │ 6. 加载布局                        │                   │
│   │ 7. 执行 onCreate/onStart/onResume   │                   │
│   └─────────────────────────────────────┘                   │
│                                                             │
│   热启动 (Hot Start)                                        │
│   ┌─────────────────────────────────────┐                   │
│   │ 1. 进程已存在                        │                   │
│   │ 2. 复用已启动的进程                  │                   │
│   │ 3. 直接从栈中恢复 Activity           │                   │
│   │ 4. 执行 onStart/onResume            │                   │
│   └─────────────────────────────────────┘                   │
│                                                             │
│   温启动 (Warm Start)                                       │
│   ┌─────────────────────────────────────┐                   │
│   │ 1. 进程已存在                        │                   │
│   │ 2. 复用已启动的进程                  │                   │
│   │ 3. 重新创建 Activity                │                   │
│   │ 4. 执行 onCreate/onStart/onResume   │                   │
│   └─────────────────────────────────────┘                   │
│                                                             │
└─────────────────────────────────────────────────────────────────┘

7.2 冷启动详细流程

冷启动流程详细图:
┌─────────────────────────────────────────────────────────────────┐
│                                                             │
│   User 点击 Icon                                          │
│          ↓                                                   │
│   ┌─────────────────────────────────────┐                   │
│   │ 1. Launcher 发送启动请求              │                   │
│   │    startActivity(intent)             │                   │
│   └─────────────────────────────────────┘                   │
│          ↓                                                   │
│   ┌─────────────────────────────────────┐                   │
│   │ 2. AMS 接收启动请求                  │                   │
│   │    ActivityManagerService.startActivity() │              │
│   └─────────────────────────────────────┘                   │
│          ↓                                                   │
│   ┌─────────────────────────────────────┐                   │
│   │ 3. AMS 检查进程状态                  │                   │
│   │    - 进程不存在                     │                   │
│   │    - 创建新进程                     │                   │
│   └─────────────────────────────────────┘                   │
│          ↓                                                   │
│   ┌─────────────────────────────────────┐                   │
│   │ 4. AMS 调用 Zygote fork 进程           │                   │
│   │    startProcessLocked()             │                   │
│   └─────────────────────────────────────┘                   │
│          ↓                                                   │
│   ┌─────────────────────────────────────┐                   │
│   │ 5. Zygote fork 创建新进程             │                   │
│   │    forkAndSpecialize()              │                   │
│   └─────────────────────────────────────┘                   │
│          ↓                                                   │
│   ┌─────────────────────────────────────┐                   │
│   │ 6. 新进程初始化                     │                   │
│   │    - 加载 Application ClassLoader    │                   │
│   │    - 创建 Application 对象            │                   │
│   │    - 调用 Application.onCreate()    │                   │
│   └─────────────────────────────────────┘                   │
│          ↓                                                   │
│   ┌─────────────────────────────────────┐                   │
│   │ 7. 创建 Activity                    │                   │
│   │    - 调用 ActivityThread.main()     │                   │
│   │    - 创建 Activity 对象              │                   │
│   │    - 调用 Activity.onCreate()        │                   │
│   └─────────────────────────────────────┘                   │
│          ↓                                                   │
│   ┌─────────────────────────────────────┐                   │
│   │ 8. 布局渲染                        │                   │
│   │    - 解析布局文件                  │                   │
│   │    - 创建视图树                    │                   │
│   │    - 测量和布局                    │                   │
│   │    - 绘制显示                      │                   │
│   └─────────────────────────────────────┘                   │
│          ↓                                                   │
│   ┌─────────────────────────────────────┐                   │
│   │ 9. 启动完成                        │                   │
│   │    - Activity 显示                 │                   │
│   └─────────────────────────────────────┘                   │
│                                                             │
└─────────────────────────────────────────────────────────────────┘

7.3 冷启动源码分析

ActivityManagerService.startActivity:

java
// frameworks/base/services/java/com/android/server/am/ActivityManagerService.java

public final int startActivity(IActivityStarter caller,
                                Intent intent,
                                String resolvedType,
                                ActivityRecord resultTo,
                                int userId) {
    // 1. 获取调用者信息
    ProcessRecord callerApp = getAppRecordForIntent(intent, userId);
    
    // 2. 解析 Intent
    ActivityRecord activityRecord = new ActivityRecord(
        intent, resolvedType, callerApp, userId);
    
    // 3. 检查进程是否存在
    ProcessRecord processRecord = getProcessRecord(activityRecord.info.packageName);
    
    if (processRecord == null) {
        // 4. 进程不存在,创建新进程
        processRecord = startProcessLocked(
            activityRecord.info.packageName,
            activityRecord.info.processName,
            true,
            0,
            null,
            null,
            true,
            false
        );
    }
    
    // 5. 将 Activity 加入任务栈
    mStackSupervisor.startActivity(activityRecord);
    
    // 6. 启动 Activity
    processRecord.startActivity(activityRecord);
    
    return 0;
}

ActivityThread.main:

java
// frameworks/base/core/java/android/app/ActivityThread.java

public static void main(String[] args) {
    // 1. 创建 ActivityThread 实例
    ActivityThread thread = new ActivityThread();
    
    // 2. 附着到系统服务
    thread.attach(false);
    
    // 3. 进入消息循环
    Looper.loop();
}

private void attach(boolean system) {
    // 1. 获取 Application
    mApplication = createApplication();
    
    // 2. 创建 Activity
    Activity activity = createActivity(
        intent,
        mApplication,
        activityInfo
    );
    
    // 3. 调用 Activity 生命周期
    activity.performCreate();
    activity.performStart();
    activity.performResume();
}

7.4 热启动优化

Activity 复用策略:

java
// ActivityStack.java

private ActivityRecord topActivity() {
    // 1. 获取任务栈顶的 Activity
    TaskRecord task = mTopTask;
    if (task != null) {
        return task.topActivity();
    }
    
    // 2. 如果没有任务栈,创建新任务
    // ...
}

private void resumeTopActivityLocked() {
    // 1. 获取栈顶 Activity
    ActivityRecord top = topActivity();
    
    if (top != null) {
        // 2. 如果进程存在,直接恢复
        if (top.getProcess() != null && top.getProcess().isAlive()) {
            // 热启动
            resumeActivityLocked(top);
        } else {
            // 3. 如果进程不存在,冷启动
            startProcessLocked(top.getProcessName());
        }
    }
}

7.5 启动时间统计

启动时间分布:
┌─────────────────────────────────────────────────────────────────┐
│                                                             │
│   进程创建时间:~50-100ms                                   │
│   └─ Zygote fork + 进程初始化                                 │
│                                                             │
│   Application 初始化:~50-200ms                             │
│   └─ Application.onCreate()                                  │
│                                                             │
│   Activity 创建时间:~100-300ms                             │
│   └─ Activity.onCreate() + onRestoreInstanceState()          │
│                                                             │
│   布局加载时间:~50-200ms                                   │
│   └─ XML 解析 + View 创建 + 测量 + 布局                      │
│                                                             │
│   总冷启动时间:~300-800ms                                  │
│                                                             │
│   热启动时间:~50-150ms                                     │
│   └─ 直接从栈中恢复 Activity                                  │
│                                                             │
└─────────────────────────────────────────────────────────────────┘

8. Activity 启动流程源码分析

8.1 Activity 启动完整流程

Activity 启动完整源码流程:
┌─────────────────────────────────────────────────────────────────┐
│                                                             │
│   调用方                                                    │
│   ├─ startActivity(intent)                                   │
│   └─ PackageManagerService 解析 Intent                        │
│                                                             │
│   ├─ ActivityManagerService                                    │
│   │   ├─ startActivity()                                    │
│   │   ├─ startActivityAsUser()                              │
│   │   ├─ startActivityMayWait()                             │
│   │   └─ startActivityLocked()                              │
│   │                                                             │
│   ├─ TaskStackManager                                        │
│   │   ├─ startActivity()                                    │
│   │   ├─ checkStartActivityConstraints()                      │
│   │   └─ startActivity()                                    │
│   │                                                             │
│   ├─ ActivityStack                                           │
│   │   ├─ startActivity()                                    │
│   │   ├─ startActivityUnchecked()                           │
│   │   └─ startActivity()                                    │
│   │                                                             │
│   ├─ ProcessRecord                                           │
│   │   ├─ startProcessLocked()                                │
│   │   └─ 创建进程                                            │
│   │                                                             │
│   ├─ ActivityThread                                          │
│   │   ├─ main()                                             │
│   │   ├─ attach()                                           │
│   │   └─ handleMessage()                                    │
│   │                                                             │
│   ├─ Activity                                                │
│   │   ├─ onCreate()                                         │
│   │   ├─ onStart()                                          │
│   │   └─ onResume()                                         │
│   │                                                             │
│   └─ WindowManager                                           │
│       ├─ addView()                                          │
│       └─ 显示窗口                                            │
│                                                             │
└─────────────────────────────────────────────────────────────────┘

8.2 源码详细解析

1. Application.startActivity:

java
// frameworks/base/core/java/android/app/ContextImpl.java

public void startActivity(Intent intent) {
    // 1. 获取 ActivityManager
    IActivityManager service = ActivityManager.getService();
    
    // 2. 调用 startActivity
    service.startActivity(
        null,
        intent,
        null,
        null,
        ActivityOptions.makeReadOnly()
    );
}

2. ActivityManagerService.startActivity:

java
// frameworks/base/services/java/com/android/server/am/ActivityManagerService.java

@Override
public final int startActivity(
    IApplication caller,
    String callingPackage,
    Intent intent,
    String resolvedType,
    IVoiceInteraction voiceInteraction,
    ActivityOptions options,
    String resultWho,
    int requestCode,
    int startFlags,
    ProfilingInfo profilingInfo,
    boolean ignoreTargetSecurity,
    boolean fromSourceStack,
    int userId,
    IActivityResultReceiver resultReceiver) {
    
    // 1. 获取调用者信息
    ActivityRecord callerActivity = null;
    if (caller != null) {
        callerActivity = caller.getActivityRecord();
    }
    
    // 2. 解析 Intent
    ActivityRecord targetActivity = new ActivityRecord(
        intent, resolvedType, callerActivity, userId);
    
    // 3. 获取应用信息
    ApplicationInfo appInfo = mPM.getActivityInfo(
        targetActivity.info.packageName, userId);
    
    // 4. 创建启动参数
    ActivityStartRecord startRecord = new ActivityStartRecord(
        targetActivity, callerActivity, appInfo);
    
    // 5. 调用 TaskStackManager
    mStackSupervisor.startActivity(startRecord);
    
    return 0;
}

3. TaskStackManager.startActivity:

java
// frameworks/base/services/java/com/android/server/am/TaskStackManager.java

boolean startActivity(ActivityStartRecord startRecord) {
    // 1. 检查启动约束
    if (!checkStartActivityConstraints(startRecord)) {
        return false;
    }
    
    // 2. 获取任务栈
    TaskRecord task = getFocusedStack();
    
    // 3. 启动 Activity
    return task.startActivity(startRecord);
}

private boolean checkStartActivityConstraints(ActivityStartRecord startRecord) {
    // 1. 检查 Launcher 是否启动完成
    if (!mLauncherReady && startRecord.launcherActivity) {
        return false;
    }
    
    // 2. 检查系统是否就绪
    if (!mSystemReady) {
        return false;
    }
    
    return true;
}

4. ActivityStack.startActivity:

java
// frameworks/base/services/java/com/android/server/am/ActivityStack.java

boolean startActivity(ActivityStartRecord startRecord) {
    // 1. 获取 Activity 信息
    ActivityRecord r = startRecord.activity;
    
    // 2. 检查进程状态
    ProcessRecord process = r.getProcess();
    
    if (process == null) {
        // 3. 进程不存在,启动进程
        mService.startProcessLocked(
            r.info.packageName,
            r.info.processName,
            r.info.applicationInfo.flags & ActivityInfo.FLAG_DEBUGGABLE,
            0,
            null,
            null,
            true,
            false);
    }
    
    // 4. 将 Activity 加入任务栈
    r.addToTask();
    
    // 5. 启动 Activity
    return startActivityUnchecked(startRecord);
}

5. 进程启动:

java
// frameworks/base/services/java/com/android/server/am/ActivityManagerService.java

final ProcessRecord startProcessLocked(
    String processName,
    ApplicationInfo info,
    boolean knownToBeDead,
    int intentFlags,
    String hostingType,
    String hostingPid,
    boolean keepIfLarge,
    boolean hideIfNotGid) {
    
    // 1. 获取进程记录
    ProcessRecord proc = getProcessRecordLocked(processName);
    
    // 2. 如果进程不存在,创建进程
    if (proc == null) {
        proc = new ProcessRecord(processName, info);
    }
    
    // 3. 创建启动参数
    List<String> args = new ArrayList<>();
    args.add("--process=" + processName);
    args.add("--nice=" + info.lru);
    args.add("--uid=" + info.uid);
    args.add("--runtime=" + info.name);
    
    // 4. 调用 Zygote fork 进程
    final long startTime = SystemClock.elapsedRealtime();
    final int result = Process.start(args.toArray(new String[0]));
    
    // 5. 更新进程状态
    proc.startForkTime = SystemClock.elapsedRealtime();
    
    return proc;
}

6. ActivityThread 处理:

java
// frameworks/base/core/java/android/app/ActivityThread.java

public static void main(String[] args) {
    // 1. 创建 ActivityThread
    ActivityThread thread = new ActivityThread();
    
    // 2. 附着到系统服务
    thread.attach(false);
    
    // 3. 进入消息循环
    Looper.loop();
}

private void attach(boolean system) {
    // 1. 设置当前 ActivityThread
    sCurrentActivityThread = this;
    
    // 2. 获取 Application
    mApplication = createApplication();
    
    // 3. 注册到 ActivityManager
    IActivityManager mgr = ActivityManager.getService();
    try {
        mgr.attachApplication(mApplication);
    } catch (RemoteException e) {
        throw e;
    }
}

7. Activity 创建:

java
// frameworks/base/core/java/android/app/ActivityThread.java

private Activity performCreateActivity(
    IBinder app,
    String className,
    Intent intent,
    ActivityInfo info,
    Configuration config) {
    
    // 1. 创建类加载器
    ClassLoader cl = getPackageClassLoader(info.applicationInfo);
    
    // 2. 创建 Activity 类
    Activity activity = null;
    try {
        activity = (Activity) cl.loadClass(className).newInstance();
    } catch (Exception e) {
        throw e;
    }
    
    // 3. 设置 Activity 属性
    activity.setIntent(intent);
    activity.setInfo(info);
    
    // 4. 创建 Context
    Context context = createContextForActivity(
        activity,
        app,
        config
    );
    
    // 5. 调用 attach
    activity.attach(context, this, getInstrumentation(),
                    app, info);
    
    return activity;
}

private void callActivityOnCreate(Activity activity) {
    // 1. 调用 onCreate
    activity.performCreate(null);
    
    // 2. 调用 onStart
    activity.performStart();
    
    // 3. 调用 onResume
    activity.performResume();
}

8.3 Activity 启动模式

Activity 启动模式:
┌─────────────────────────────────────────────────────────────────┐
│                                                             │
│   standard (标准模式)                                         │
│   ├─ 每次启动创建新的 Activity 实例                            │
│   ├─ 可以存在于多个任务栈中                                  │
│   └─ 默认启动模式                                            │
│                                                             │
│   singleTop (栈顶模式)                                        │
│   ├─ 如果栈顶是同类型 Activity,复用                           │
│   ├─ 否则创建新的实例                                        │
│   └─ 适用于首页                                            │
│                                                             │
│   singleTask (单任务模式)                                     │
│   ├─ 在同一任务栈中只有一个实例                               │
│   ├─ 复用时清除栈顶的 Activity                                │
│   └─ 适用于浏览器                                        │
│                                                             │
│   singleInstance (单实例模式)                                 │
│   ├─ 独占一个任务栈                                          │
│   ├─ 始终复用同一个实例                                      │
│   └─ 适用于电话、短信等系统应用                              │
│                                                             │
└─────────────────────────────────────────────────────────────────┘

8.4 源码引用

关键源码文件:
┌─────────────────────────────────────────────────────────────────┐
│                                                             │
│   frameworks/base/core/java/android/app/                       │
│   ├─ ContextImpl.java                                       │
│   ├─ Activity.java                                          │
│   ├─ ActivityThread.java                                    │
│   ├─ Application.java                                       │
│   └─ Context.java                                           │
│                                                             │
│   frameworks/base/services/java/com/android/server/am/       │
│   ├─ ActivityManagerService.java                            │
│   ├─ ActivityRecord.java                                    │
│   ├─ ActivityStack.java                                     │
│   ├─ ActivityStackSupervisor.java                           │
│   ├─ ProcessRecord.java                                     │
│   ├─ TaskStackManager.java                                  │
│   └─ AppProcess.java                                        │
│                                                             │
│   frameworks/base/core/java/android/app/invoke/              │
│   ├─ AppInvoke.java                                         │
│   └─ IAppInvoke.java                                        │
│                                                             │
│   frameworks/base/core/java/com/android/internal/os/         │
│   ├─ ZygoteInit.java                                        │
│   └─ Process.java                                           │
│                                                             │
└─────────────────────────────────────────────────────────────────┘

9. 性能优化点

9.1 启动性能优化

启动性能优化策略:
┌─────────────────────────────────────────────────────────────────┐
│                                                             │
│   启动前优化                                                │
│   ├─ 预加载                                                  │
│   │   ├─ Zygote 预加载常用类                                 │
│   │   ├─ SystemServer 预启动                                 │
│   │   └─ 预加载资源                                          │
│   │                                                             │
│   ├─ 代码优化                                                │
│   │   ├─ 减少 APK 大小                                        │
│   │   ├─ 减少类数量                                          │
│   │   └─ 优化DEX 结构                                         │
│   │                                                             │
│   └─ 资源优化                                                │
│       ├─ 压缩图片                                            │
│       ├─ 使用矢量图                                          │
│       └─ 减少资源数量                                        │
│                                                             │
│   启动中优化                                                │
│   ├─ 异步初始化                                              │
│   │   ├─ Application 异步初始化                               │
│   │   ├─ Activity 异步加载布局                                 │
│   │   └─ 异步加载数据                                        │
│   │                                                             │
│   ├─ 懒加载                                                  │
│   │   ├─ 延迟加载非关键组件                                    │
│   │   ├─ 按需加载图片                                          │
│   │   └─ 按需初始化服务                                      │
│   │                                                             │
│   └─ 布局优化                                                │
│       ├─ 简化布局层级                                        │
│       ├─ 使用 ConstraintLayout                               │
│       └─ 避免复杂动画                                        │
│                                                             │
│   启动后优化                                                │
│   ├─ 预加载                                                  │
│   │   ├─ 预加载下一页数据                                      │
│   │   ├─ 预加载常用图片                                        │
│   │   └─ 预初始化服务                                        │
│   │                                                             │
│   ├─ 缓存优化                                                │
│   │   ├─ 内存缓存                                            │
│   │   ├─ 磁盘缓存                                            │
│   │   └─ 网络缓存                                            │
│   │                                                             │
│   └─ 进程保活                                                │
│       ├─ 前台服务                                            │
│       ├─ 进程间通信                                          │
│       └─ 广播接收                                            │
│                                                             │
└─────────────────────────────────────────────────────────────────┘

9.2 启动时间优化方案

1. Application 异步初始化:

java
// Application.java

public class MyApplication extends Application {
    
    @Override
    public void onCreate() {
        super.onCreate();
        
        // 1. 初始化基础服务
        initBaseServices();
        
        // 2. 异步初始化其他服务
        new Handler(Looper.getMainLooper()).post(() -> {
            initAsyncServices();
        });
        
        // 3. 延迟初始化
        ApplicationInitializer.initAsync(() -> {
            initDeferredServices();
        });
    }
    
    private void initAsyncServices() {
        // 异步初始化分析 SDK
        Analytics.init(this);
        
        // 异步初始化网络库
        Network.init();
        
        // 异步初始化图片库
        ImageLoader.init();
    }
}

2. Activity 异步加载:

java
// Activity.java

public class MainActivity extends AppCompatActivity {
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        // 1. 立即显示启动页
        setContentView(R.layout.activity_launch);
        
        // 2. 异步加载主页面
        new AsyncTask<Void, Void, Boolean>() {
            @Override
            protected Boolean doInBackground(Void... params) {
                // 后台加载数据
                loadData();
                return true;
            }
            
            @Override
            protected void onPostExecute(Boolean result) {
                // 显示主页面
                setContentView(R.layout.activity_main);
            }
        }.execute();
    }
}

3. 布局优化:

xml
<!-- 使用 ConstraintLayout 减少层级 -->
<androidx.constraintlayout.widget.ConstraintLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    
    <ImageView
        android:id="@+id/iv_icon"
        android:layout_width="48dp"
        android:layout_height="48dp"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintBottom_toTopOf="@+id/tv_title"/>
    
    <TextView
        android:id="@+id/tv_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toBottomOf="@+id/iv_icon"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"/>
    
</androidx.constraintlayout.widget.ConstraintLayout>

9.3 启动时间监控

使用 Trace 工具:

java
// 启动时间追踪
public class StartupTracer {
    
    private static final String TAG = "StartupTracer";
    
    public static void trace(String tag, String message) {
        android.util.Log.d(TAG, tag + ": " + message);
        Trace.beginSection(tag);
    }
    
    public static void endTrace(String tag) {
        Trace.endSection();
    }
}

// 在关键位置插入追踪
public class MainActivity extends AppCompatActivity {
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        StartupTracer.trace("onCreate", "开始");
        super.onCreate(savedInstanceState);
        StartupTracer.endTrace("onCreate");
        
        // ...
    }
}

9.4 启动性能测试

启动性能测试方法:
┌─────────────────────────────────────────────────────────────────┐
│                                                             │
│   工具测试                                                    │
│   ├─ Android Studio Profiler                                │
│   │   ├─ CPU Profiler                                       │
│   │   ├─ Memory Profiler                                    │
│   │   └─ Network Profiler                                   │
│   │                                                             │
│   ├─ Systrace                                                 │
│   │   ├─ 系统追踪                                            │
│   │   └─ 性能分析                                            │
│   │                                                             │
│   └─ Perfetto                                                 │
│       ├─ 性能分析                                            │
│       └─ 可视化展示                                          │
│                                                             │
│   手动测试                                                    │
│   ├─ 计时测试                                                │
│   │   ├─ 从点击到首帧显示                                    │
│   │   └─ 从点击到完全加载                                    │
│   │                                                             │
│   ├─ 多次测试                                                  │
│   │   ├─ 冷启动测试                                          │
│   │   ├─ 热启动测试                                          │
│   │   └─ 温启动测试                                          │
│   │                                                             │
│   └─ 统计分析                                                  │
│       ├─ 平均值                                                │
│       ├─ 最大值                                                │
│       └─ 最小值                                                │
│                                                             │
└─────────────────────────────────────────────────────────────────┘

9.5 启动性能优化清单

启动性能优化检查清单:
┌─────────────────────────────────────────────────────────────────┐
│                                                             │
│   代码层面                                                    │
│   ├─ [ ] 减少 APK 大小                                        │
│   ├─ [ ] 优化类加载                                          │
│   ├─ [ ] 异步初始化                                          │
│   ├─ [ ] 懒加载                                              │
│   ├─ [ ] 减少反射                                            │
│   └─ [ ] 优化算法                                            │
│                                                             │
│   资源层面                                                    │
│   ├─ [ ] 压缩图片                                            │
│   ├─ [ ] 使用矢量图                                          │
│   ├─ [ ] 减少资源数量                                        │
│   ├─ [ ] 优化布局                                            │
│   └─ [ ] 减少布局层级                                        │
│                                                             │
│   架构层面                                                    │
│   ├─ [ ] 优化架构设计                                        │
│   ├─ [ ] 模块化                                              │
│   ├─ [ ] 组件化                                              │
│   ├─ [ ] 动态化                                              │
│   └─ [ ] 服务化                                              │
│                                                             │
│   网络层面                                                    │
│   ├─ [ ] 优化网络请求                                        │
│   ├─ [ ] 使用缓存                                            │
│   ├─ [ ] 预加载                                              │
│   ├─ [ ] 优化协议                                            │
│   └─ [ ] 使用 CDN                                            │
│                                                             │
└─────────────────────────────────────────────────────────────────┘

10. 面试考点

10.1 基础考点

1. Android 启动流程是什么?

答案要点:
┌─────────────────────────────────────────────────────────────────┐
│                                                             │
│   1. Bootloader 启动                                          │
│      ├─ 硬件初始化                                           │
│      ├─ 内存检测                                             │
│      ├─ 加载 Kernel + DTB                                    │
│      └─ 跳转到 Kernel                                        │
│                                                             │
│   2. Kernel 初始化                                           │
│      ├─ 解压 Kernel                                          │
│      ├─ 初始化硬件驱动                                       │
│      ├─ 挂载根文件系统                                       │
│      └─ 执行 init 程序                                        │
│                                                             │
│   3. Init 进程启动                                           │
│      ├─ 解析 init 配置文件                                    │
│      ├─ 启动核心服务                                         │
│      ├─ 启动 Zygote                                          │
│      └─ 进入主循环                                           │
│                                                             │
│   4. Zygote 进程启动                                         │
│      ├─ 创建 JVM                                             │
│      ├─ 预加载类                                             │
│      ├─ 创建 socket 服务器                                    │
│      └─ 等待 fork 请求                                        │
│                                                             │
│   5. SystemServer 启动                                       │
│      ├─ Zygote fork 进程                                      │
│      ├─ 加载 SystemServer 类                                  │
│      ├─ 启动系统服务                                         │
│      └─ 启动 Launcher                                        │
│                                                             │
│   6. Launcher 启动                                           │
│      ├─ 创建 Launcher 进程                                    │
│      ├─ 加载 LauncherActivity                                 │
│      ├─ 初始化布局                                           │
│      └─ 显示 Launcher                                        │
│                                                             │
└─────────────────────────────────────────────────────────────────┘

2. Zygote 的作用是什么?

答案要点:
┌─────────────────────────────────────────────────────────────────┐
│                                                             │
│   1. 进程快速创建                                            │
│      ├─ 通过 fork 机制快速创建进程                            │
│      ├─ 共享父进程内存                                        │
│      └─ 减少进程启动时间                                      │
│                                                             │
│   2. 内存优化                                                │
│      ├─ 预加载常用类                                          │
│      ├─ 预加载资源                                            │
│      └─ 减少内存占用                                          │
│                                                             │
│   3. 代码优化                                                │
│      ├─ 预编译 DEX                                            │
│      ├─ 预优化代码                                            │
│      └─ 减少启动时间                                          │
│                                                             │
│   4. 安全隔离                                                │
│      ├─ 进程隔离                                              │
│      ├─ 权限控制                                              │
│      └─ 沙箱机制                                              │
│                                                             │
└─────────────────────────────────────────────────────────────────┘

3. SystemServer 中有哪些核心服务?

答案要点:
┌─────────────────────────────────────────────────────────────────┐
│                                                             │
│   1. 系统服务                                                │
│      ├─ ActivityManagerService                               │
│      ├─ WindowManagerService                                 │
│      ├─ PackageManagerService                                │
│      ├─ PowerManagerService                                  │
│      └─ InputManagerService                                  │
│                                                             │
│   2. 应用服务                                                │
│      ├─ AudioService                                         │
│      ├─ TelephonyService                                     │
│      ├─ LocationService                                      │
│      └─ NotificationManagerService                           │
│                                                             │
│   3. 其他服务                                                │
│      ├─ SensorService                                        │
│      ├─ VibratorService                                      │
│      ├─ ConnectivityService                                  │
│      └─ ClipboardService                                     │
│                                                             │
└─────────────────────────────────────────────────────────────────┘

10.2 进阶考点

1. Activity 启动流程详解?

答案要点:
┌─────────────────────────────────────────────────────────────────┐
│                                                             │
│   1. 应用层调用                                               │
│      ├─ Context.startActivity()                              │
│      ├─ 调用 ActivityManager.getService()                     │
│      └─ 调用 startActivity()                                  │
│                                                             │
│   2. AMS 处理                                                 │
│      ├─ 解析 Intent                                          │
│      ├─ 获取 Activity 信息                                     │
│      ├─ 检查进程状态                                         │
│      ├─ 创建进程(如果需要)                                   │
│      ├─ 将 Activity 加入任务栈                                  │
│      └─ 通知应用进程                                         │
│                                                             │
│   3. 进程创建                                                 │
│      ├─ Zygote fork                                          │
│      ├─ 创建新进程                                           │
│      ├─ 加载类                                               │
│      ├─ 创建 Application                                       │
│      └─ 创建 Activity                                          │
│                                                             │
│   4. Activity 生命周期                                        │
│      ├─ onCreate()                                           │
│      ├─ onStart()                                            │
│      ├─ onResume()                                           │
│      └─ 显示界面                                             │
│                                                             │
└─────────────────────────────────────────────────────────────────┘

2. 冷启动和热启动的区别?

答案要点:
┌─────────────────────────────────────────────────────────────────┐
│                                                             │
│   冷启动 (Cold Start)                                         │
│   ├─ 进程不存在                                              │
│   ├─ 需要创建新进程                                          │
│   ├─ 加载 APK                                                │
│   ├─ 初始化 Application                                       │
│   ├─ 创建 Activity                                            │
│   ├─ 加载布局                                                │
│   └─ 时间:~300-800ms                                        │
│                                                             │
│   热启动 (Hot Start)                                          │
│   ├─ 进程已存在                                              │
│   ├─ 复用已启动进程                                          │
│   ├─ 直接从栈中恢复 Activity                                  │
│   ├─ 调用 onStart/onResume                                    │
│   └─ 时间:~50-150ms                                         │
│                                                             │
│   温启动 (Warm Start)                                         │
│   ├─ 进程已存在                                              │
│   ├─ 复用已启动进程                                          │
│   ├─ 重新创建 Activity                                        │
│   ├─ 调用 onCreate/onStart/onResume                           │
│   └─ 时间:~150-300ms                                        │
│                                                             │
└─────────────────────────────────────────────────────────────────┘

10.3 高级考点

1. Android 启动流程中的性能优化?

答案要点:
┌─────────────────────────────────────────────────────────────────┐
│                                                             │
│   1. 系统层面优化                                            │
│      ├─ Zygote 预加载优化                                     │
│      ├─ SystemServer 启动优化                                  │
│      ├─ 减少系统服务启动时间                                   │
│      └─ 优化进程调度                                          │
│                                                             │
│   2. 应用层面优化                                            │
│      ├─ Application 异步初始化                               │
│      ├─ Activity 异步加载布局                                  │
│      ├─ 减少初始化代码                                        │
│      ├─ 懒加载非关键组件                                       │
│      └─ 优化数据加载                                          │
│                                                             │
│   3. 资源层面优化                                            │
│      ├─ 压缩图片                                              │
│      ├─ 使用矢量图                                            │
│      ├─ 优化布局层级                                          │
│      ├─ 减少资源数量                                          │
│      └─ 使用预编译资源                                        │
│                                                             │
│   4. 架构层面优化                                            │
│      ├─ 模块化                                              │
│      ├─ 组件化                                              │
│      ├─ 动态化                                              │
│      └─ 服务化                                              │
│                                                             │
└─────────────────────────────────────────────────────────────────┘

2. 如何优化应用启动速度?

答案要点:
┌─────────────────────────────────────────────────────────────────┐
│                                                             │
│   1. 代码优化                                                │
│      ├─ 异步初始化                                          │
│      ├─ 懒加载                                              │
│      ├─ 减少反射                                            │
│      ├─ 优化算法                                            │
│      └─ 减少类加载                                          │
│                                                             │
│   2. 布局优化                                                │
│      ├─ 简化布局层级                                        │
│      ├─ 使用 ConstraintLayout                               │
│      ├─ 使用 ViewStub                                       │
│      ├─ 避免复杂动画                                        │
│      └─ 使用 RecyclerView                                    │
│                                                             │
│   3. 资源优化                                                │
│      ├─ 压缩图片                                            │
│      ├─ 使用矢量图                                          │
│      ├─ 减少资源数量                                        │
│      ├─ 优化资源加载                                        │
│      └─ 使用资源预加载                                       │
│                                                             │
│   4. 网络优化                                                │
│      ├─ 异步加载数据                                        │
│      ├─ 使用缓存                                            │
│      ├─ 预加载                                              │
│      ├─ 优化网络请求                                        │
│      └─ 使用 CDN                                            │
│                                                             │
│   5. 架构优化                                                │
│      ├─ 模块化                                              │
│      ├─ 组件化                                              │
│      ├─ 动态化                                              │
│      ├─ 服务化                                              │
│      └─ 微服务                                              │
│                                                             │
└─────────────────────────────────────────────────────────────────┘

10.4 面试问题集锦

问题 1:Zygote 为什么可以 fork 进程?

答案:
┌─────────────────────────────────────────────────────────────────┐
│                                                             │
│   1. Linux fork 机制                                          │
│      ├─ 拷贝父进程内存                                        │
│      ├─ 共享代码段                                            │
│      └─ 减少内存开销                                          │
│                                                             │
│   2. 预加载机制                                               │
│      ├─ Zygote 预加载常用类                                    │
│      ├─ 子进程共享父进程内存                                    │
│      └─ 减少类加载时间                                        │
│                                                             │
│   3. JVM 初始化                                              │
│      ├─ Zygote 中已初始化 JVM                                  │
│      ├─ 子进程继承 JVM 状态                                    │
│      └─ 减少 JVM 初始化时间                                    │
│                                                             │
│   4. 性能优化                                                │
│      ├─ 减少进程创建时间                                      │
│      ├─ 优化内存使用                                          │
│      └─ 提高系统响应速度                                      │
│                                                             │
└─────────────────────────────────────────────────────────────────┘

问题 2:如何降低冷启动时间?

答案:
┌─────────────────────────────────────────────────────────────────┐
│                                                             │
│   1. 减少初始化代码                                           │
│      ├─ 异步初始化                                          │
│      ├─ 延迟初始化                                          │
│      └─ 懒加载                                              │
│                                                             │
│   2. 优化布局                                                │
│      ├─ 简化布局层级                                        │
│      ├─ 使用 ConstraintLayout                               │
│      └─ 减少布局嵌套                                        │
│                                                             │
│   3. 优化资源                                                │
│      ├─ 压缩图片                                            │
│      ├─ 使用矢量图                                          │
│      └─ 减少资源数量                                        │
│                                                             │
│   4. 优化网络                                                │
│      ├─ 异步加载数据                                        │
│      ├─ 使用缓存                                            │
│      └─ 预加载                                              │
│                                                             │
│   5. 优化架构                                                │
│      ├─ 模块化                                              │
│      ├─ 组件化                                              │
│      └─ 服务化                                              │
│                                                             │
└─────────────────────────────────────────────────────────────────┘

总结

启动流程总结

Android 启动流程核心知识点:
┌─────────────────────────────────────────────────────────────────┐
│                                                             │
│   1. Bootloader 启动                                          │
│      ├─ 硬件初始化                                           │
│      ├─ 加载 Kernel                                          │
│      └─ 跳转到 Kernel                                        │
│                                                             │
│   2. Kernel 初始化                                           │
│      ├─ 内存初始化                                          │
│      ├─ 设备驱动                                            │
│      ├─ 挂载根文件系统                                       │
│      └─ 执行 init 进程                                        │
│                                                             │
│   3. Init 进程启动                                           │
│      ├─ 解析配置文件                                        │
│      ├─ 启动核心服务                                        │
│      ├─ 启动 Zygote                                          │
│      └─ 进入主循环                                           │
│                                                             │
│   4. Zygote 进程启动                                         │
│      ├─ 创建 JVM                                             │
│      ├─ 预加载类                                             │
│      ├─ 创建 socket 服务器                                    │
│      └─ 等待 fork 请求                                        │
│                                                             │
│   5. SystemServer 启动                                       │
│      ├─ fork 进程                                            │
│      ├─ 启动系统服务                                        │
│      ├─ 启动 Launcher                                        │
│      └─ 显示 Launcher                                        │
│                                                             │
│   6. App 启动                                                 │
│      ├─ 冷启动:创建进程                                      │
│      ├─ 热启动:复用进程                                      │
│      └─ 启动 Activity                                        │
│                                                             │
└─────────────────────────────────────────────────────────────────┘

性能优化总结

启动性能优化核心要点:
┌─────────────────────────────────────────────────────────────────┐
│                                                             │
│   1. 代码优化                                                │
│      ├─ 异步初始化                                          │
│      ├─ 懒加载                                              │
│      ├─ 减少反射                                            │
│      └─ 优化算法                                            │
│                                                             │
│   2. 布局优化                                                │
│      ├─ 简化布局层级                                        │
│      ├─ 使用 ConstraintLayout                               │
│      └─ 减少布局嵌套                                        │
│                                                             │
│   3. 资源优化                                                │
│      ├─ 压缩图片                                            │
│      ├─ 使用矢量图                                          │
│      └─ 减少资源数量                                        │
│                                                             │
│   4. 网络优化                                                │
│      ├─ 异步加载数据                                        │
│      ├─ 使用缓存                                            │
│      └─ 预加载                                              │
│                                                             │
│   5. 架构优化                                                │
│      ├─ 模块化                                              │
│      ├─ 组件化                                              │
│      └─ 服务化                                              │
│                                                             │
└─────────────────────────────────────────────────────────────────┘

文档信息:

  • 字数:约 18000 字
  • 包含:Bootloader 启动、Kernel 初始化、Init 进程启动、Zygote 进程启动、SystemServer 启动、Launcher 启动、App 启动流程、Activity 启动流程源码分析、性能优化点、面试考点
  • 源码引用:ZygoteInit.java、SystemServer.java、ActivityManagerService.java、ActivityThread.java、init.cpp 等
  • ASCII 流程图:包含多个流程时序图和状态机图
  • 最佳实践:启动性能优化策略、异步初始化方案、布局优化建议

建议:

  1. 学习源码时,结合 Android Studio 调试,跟踪关键方法调用
  2. 面试前,重点掌握启动流程的每个阶段和关键源码
  3. 性能优化方面,掌握实际优化案例和优化效果评估方法