android系统启动过程

1.0整体流程

1.1. 内核启动:内核完成系统启动,初始化系统服务和驱动。
1.2. Init进程启动init 是用户空间的第一个进程(PID=1),解析 init.rc 脚本,管理服务生命周期。

  • 挂载早期文件:如 /dev/proc
  • 启动 ueventd 守护进程:创建设备节点并设置权限。
  • 启动 logd 日志服务

1.3. 核心服务启动:由 init.rc 触发。

  • servicemanager:Binder 的核心组件,管理跨进程通信。
  • healthd:电池状态监控。
  • lmkd:内存不足时终止低优先级进程。

1.4. Zygote进程孵化init.rc 中定义的 zygote-start 触发器启动 Zygote 进程。

  • 预加载类和资源:如主题、布局,提升应用启动速度。
  • 主 Zygote(app_process)和 WebView Zygote(专用于渲染 WebView)。

1.5. System Server 进程启动:由 Zygote fork 并执行 com.android.server.SystemServer

  • 启动核心系统服务
    • 引导服务:ActivityManagerService(AMS):管理应用生命周期。
    • PowerManagerService:电源管理。
    • PackageManagerService(PMS):应用安装与权限控制。
    • 核心服务:WindowManagerService(WMS):窗口管理。
    • DisplayManagerService:显示设备管理。
  • 其他服务:NotificationManagerService:通知系统。InputMethodManagerService:输入法管理。

1.6. 系统就绪与应用启动:SystemServer 完成服务启动后发送 BOOT_COMPLETED 广播。

  • Launcher:桌面应用,由 AMS 启动。
  • 系统应用:电话、短信等,通过 Intent.ACTION_BOOT_COMPLETED 启动。
  • 后台服务:账户同步、推送服务等。

1.7. 守护进程与独立服务:独立进程。

  • surfaceflinger:图形合成服务,由 init 直接启动。
  • mediaserver:多媒体服务(音频、视频编解码)。
  • 网络相关
    • netd:网络配置。
    • rild:射频通信(电话模块)。

2.0 init的执行流程

2.1、init 进程入口

  1. 启动位置

    • 内核完成初始化后,通过 kernel_init 启动 /init 程序(位于 system/core/init
    • PID=1,用户态第一个进程
  2. 入口函数

    • main() 函数位于 system/core/init/init.cpp

2.2、执行流程分解

内核启动init进程
初始化内核日志系统
挂载早期文件系统
解析init.rc配置文件
执行early-init阶段
初始化设备管理器
初始化属性服务
加载SELinux策略
执行init阶段
启动关键守护进程
执行late-init阶段
进入无限循环处理事件

2.3、关键阶段详解

2.3.1. 早期初始化 (Early-init)
  • 主要动作
    # init.rc 片段
    on early-init
      start ueventd          # 创建设备节点
      mkdir /dev/memcg/memory 0700 root system
      mount tmpfs tmpfs /mnt  mode=0755,uid=0,gid=1000
    
  • 核心任务
    • 挂载 /dev, /proc, /sys 等临时文件系统
    • 启动 ueventd 守护进程(设备节点管理)

2.3.2. 主初始化阶段 (Init)
  • 触发条件
    on init && property:ro.bootmode=normal
    
  • 关键操作
    • 属性服务初始化
      property_init();       // 初始化属性存储区
      property_load_boot_defaults(); // 加载/default.prop
      
    • SELinux 策略加载
      selinux_initialize();  // 加载/sepolicy
      
    • 启动核心服务
      service console /system/bin/sh
          class core
          user shell
          group shell log
      

2.3.3. 后期初始化 (Late-init)
  • 触发条件
    on late-init
    
  • 核心任务
    • 触发 zygote-start 触发器:
      trigger zygote-start   # 启动Zygote进程
      
    • 启动 surfaceflinger 显示服务
    • 发送 boot_progress 启动进度广播

2.4、关键技术实现

2.4.1. 配置文件解析
  • 文件结构
    /system/core/rootdir/init.rc          # 主配置文件
    /system/etc/init/                      # 新增服务配置文件(Android 7.0特性)
    
  • 语法规则
    • Action:由 on <trigger> 定义(如 on boot
    • Service:由 service <name> <path> 定义
    • Commandstart, stop, class_start

2.4.2. 属性服务(Property Service)
  • 实现机制
    // 代码路径:system/core/init/property_service.cpp
    void property_init() {
      init_property_area();  // 共享内存区域(/dev/__properties__)
    }
    
  • 重要属性
    • ro.*:只读属性(从/default.prop加载)
    • persist.*:持久化存储(在/data/property保存)
    • sys.*:系统运行时状态

2.4.3. 信号处理与进程管理
  • 服务重启策略
    service zygote /system/bin/app_process
      class main
      socket zygote stream 660 root system
      onrestart restart surfaceflinger
      onrestart restart netd
    
  • 关键信号
    • SIGCHLD:子进程终止时触发服务重启检查
    • SIGTERM:系统关机时终止所有服务

2.5、Android 7.0 新增特性

  1. 更严格的SELinux策略

    • 所有系统服务默认运行在 enforcing 模式
    • 新增 neverallow 规则限制权限扩散
  2. 并行启动优化

    • 通过 class_start <classname> 并行启动同类服务
    • 缩短开机时间(system_serverZygote 并行初始化)
  3. 服务监控增强

    • 引入 seccomp 过滤器限制系统调用
    • 增加 cgroup 内存控制(防止OOM)

2.6、调试方法

  1. 查看启动日志
    adb logcat -b events | grep "boot_progress"
    
  2. 检查服务状态
    adb shell getprop | grep init.svc
    
  3. 追踪属性变更
    adb shell watchprops
    

**2.7、源码位置

  • 主入口文件
    system/core/init/init.cpp   # 核心逻辑(不同版本路径可能略有差异)
    

2.8、核心功能实现

2.8.1. 初始化阶段 (main() 函数)
int main(int argc, char** argv) {
    // 1. 初始化内核日志(/dev/kmsg)
    InitKernelLogging(argv);

    // 2. 创建基础目录(/dev, /proc, /sys 等)
    CreateEssentialDirectories();

    // 3. 解析 init.rc 配置文件
    LoadBootScripts();

    // 4. 启动服务管理和属性系统
    StartPropertyService();
    ProcessKernelCmdline();

    // 5. 进入事件循环
    while (true) {
        epoll_wait(...);  // 监听事件(设备插拔、信号、属性变更等)
        ExecuteCommands();// 执行触发动作
    }
}

2.8.2. 解析 init.rc 文件

关键代码流程

  1. 入口函数

    void LoadBootScripts() {
        Parser parser = CreateParser();  // 创建解析器对象
        parser.ParseConfig("/init.rc");  // 解析主配置文件
        parser.ParseConfigDir("/system/etc/init"); // 加载模块化配置
    }
    
  2. 语法解析器 (Parser 类)

    • init.rc 中的 serviceonimport 等指令转换为内存中的数据结构:
      • Action:表示一组命令(如 on early-init
      • Service:表示后台服务(如 zygote
    • 使用 SectionParser 处理不同段落的解析逻辑。
  3. 示例:解析 service

    // system/core/init/service.cpp
    bool ServiceParser::ParseSection(const std::vector<std::string>& args, std::string* err) {
        // 创建 Service 对象
        auto service = std::make_unique<Service>(args[1], args[2]);
        services_.emplace_back(std::move(service));
    }
    

2.8.3. 服务管理 (Service 类)

关键逻辑

  • 启动服务:通过 fork() 创建子进程并执行二进制文件。

    void Service::Start() {
        pid_ = fork();
        if (pid_ == 0) {
            execve(path_, args_, environ); // 执行服务程序
        }
    }
    
  • 服务重启策略

    • restart_period:定时重启
    • onrestart:定义服务退出时触发的其他动作

2.8.4. 属性系统 (PropertyService)

实现细节

  1. 共享内存机制
    • 属性通过 system_properties 共享内存区域存储,供所有进程读取。
  2. 属性变更监听
    void PropertyService::Start() {
        // 创建 Socket 监听属性变更请求(setprop 命令)
        socket_ = socket_local_server(PROP_SERVICE_NAME, SOCK_STREAM, 0666);
    }
    

2.8.5. 触发器与动作执行
  • 触发器类型
    • boot:系统启动时触发
    • property:ro.debuggable=1:属性条件触发
  • 动作队列
    ActionManager::ExecuteOneCommand() {
        auto command = action->NextCommand(); // 从 Action 中取出命令
        ExecuteCommand(command);              // 执行命令(如 start servicename)
    }
    

2.9、关键数据结构

  1. Action
    • 存储一组命令(如 mkdir /dev)和触发条件。
  2. Service
    • 管理服务的启动参数、重启策略、SELinux 上下文等。
  3. Parser
    • 实现 init.rc 语法的词法分析和语义分析。

2.10、调试与扩展

2.10.1. 查看 init 日志
adb logcat | grep -i "init"  # 过滤 init 进程的日志
2.10.2. 修改服务行为
  • Service::Start() 中添加日志输出:
    LOG(INFO) << "Starting service: " << name_;
    
2.10.3. 动态调试
adb shell stop   # 停止大部分服务
adb shell start  # 重新触发初始化流程

2.11、Android 版本差异

  • Android 8.0+:引入 apexdhwservicemanager 等新服务,需在 init.rc 中添加对应配置。
  • Android 10+:强化 first_stage_initsecond_stage_init 的分阶段启动逻辑。

通过分析 init.cpp 的实现,可以深入理解 Android 启动流程的控制逻辑,并为定制系统行为(如添加新服务、修改启动顺序)提供技术基础。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值