当前位置: 首页 > news >正文

Android系统启动过程分析

   Android的启动过程可以分为两个阶段,第一阶段是Linux的启动,第二阶段才是Android的启动,下面我们分别来了解一下具体的过程。

第一步:启动linux


1.Bootloader


2.Kernel

第二步 android系统启动:入口为init.rc(system\core\rootdir)

 


1./system/bin/service manager: Binder 守护进程;


2.Runtime;


3.Zygote :app-process/app-main;


4.Start VM;


5.Start server


6.Start android service:Register to service Manager


7.Start Launcher

第三步:应用程序启动:运行package Manager

l  Init进程

 


Android系统在启动时首先会启动Linux系统,引导加载Linux Kernel并启动init进程。Init进程是一个由内核启动的用户级进程,是Android系统的第一个进程。该进程的相关代码在platform\system\core\init\init.c。在main函数中,有如下代码:

open_devnull_stdio(); log_init(); INFO("reading config file\n"); init_parse_config_file("/init.rc"); /* pull the kernel commandline and ramdisk properties file in */ import_kernel_cmdline(0); get_hardware_name(hardware, &revision); snprintf(tmp, sizeof(tmp), "/init.%s.rc", hardware); init_parse_config_file(tmp);

    这里会加载解析init.rc和init.hardware.rc两个初始化脚本。*.rc文件定义了在init进程中需要启动哪些进程服务和执行哪些动作。其详细说明参见platform\system\core\init\reademe.txt。init.rc见如下定义:

service servicemanager /system/bin/servicemanager user system critical onrestart restart zygote onrestart restart media service vold /system/bin/vold socket vold stream 0660 root mount ioprio be 2 service netd /system/bin/netd socket netd stream 0660 root system socket dnsproxyd stream 0660 root inet service debuggerd /system/bin/debuggerd service ril-daemon /system/bin/rild socket rild stream 660 root radio socket rild-debug stream 660 radio system user root group radio cache inet misc audio sdcard_rw service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server socket zygote stream 666 onrestart write /sys/android_power/request_state wake onrestart write /sys/power/state on onrestart restart media onrestart restart netd service drm /system/bin/drmserver user drm group system root inet


具体解析过程见platform\system\core\init\Init_parser.c。解析所得服务添加到service_list中,动作添加到action_list中。


接下来在main函数中执行动作和启动进程服务:



      execute_one_command();
        restart_processes()


通常init过程需要创建一些系统文件夹并启动USB守护进程、Android Debug Bridge守护进程、Debug守护进程、ServiceManager进程、Zygote进程等。


l  ServiceManager进程


ServiceManager进程是所有服务的管理器。由init.rc对ServiceManager的描述service servicemanager /system/bin/servicemanager可知servicemanager进程从platform\frameworks\base\cmd\servicemanager\Service_manager.cpp启动。在main函数中有如下代码:


int main(int argc, char **argv)
{
    struct binder_state *bs;
    void *svcmgr = BINDER_SERVICE_MANAGER;


    bs = binder_open(128*1024);


    if (binder_become_context_manager(bs)) {
        LOGE("cannot become context manager (%s)\n", strerror(errno));
        return -1;
    }


    svcmgr_handle = svcmgr;
    binder_loop(bs, svcmgr_handler);
    return 0;
}


首先调用binder_open()打开Binder设备(/dev/binder),调用binder_become_context_manager()把当前进程设置为ServiceManager。ServiceManager本身就是一个服务。


int binder_become_context_manager(struct binder_state *bs)
{
    return ioctl(bs->fd, BINDER_SET_CONTEXT_MGR, 0);
}


    最后binder_loop()进入循环状态,并设置svcmgr_handler回调函数等待添加、查询、获取服务等请求。


l  Zygote进程


         Zygote进程用于产生其他进程。由init.rc对zygote的描述service zygot /system/bin/app_process可知zygote进程从platfrom\frameworks\base\cmds\app_process\App_main.cpp启动。在main函数中有如下代码:


       if (0 == strcmp("--zygote", arg)) {
            bool startSystemServer = (i < argc) ? 
                    strcmp(argv[i], "--start-system-server") == 0 : false;
            setArgv0(argv0, "zygote");
          &nbs

http://www.jsqmd.com/news/919346/

相关文章:

  • 测试2-请忽略
  • 告别脚本地狱:用SeaTunnel 2.3.1 + Flink 1.16 搞定MySQL到ClickHouse的实时数据同步
  • 如何快速提升游戏效率:D3KeyHelper暗黑3终极自动化工具完整指南
  • ZLT X21 CPE的IP Passthrough模式实测:让你的NAS/软路由直接拿到公网IP,实现完美端口转发
  • ARM DS-5调试中共享库符号加载冲突解决方案
  • 未来可期
  • 告别蜂鸣器!用DY-SV17F语音模块给你的Arduino项目加上真人语音提示(附完整代码)
  • 告别“正在编译”:Nessus v10.9.4插件更新效率优化与资源监控实战
  • 3个常见问题,1个简单解决方案:OFD转PDF终极指南
  • 深入高通QMI的‘黑匣子’:用QXDM和日志分析一次失败的通信
  • 从 EXISTS 到 JOIN:PostgreSQL 子链接上拉优化的那些“坑”与避坑指南
  • 免费音频标注工具终极指南:3分钟快速上手的专业解决方案
  • 金融科技四大核心技术解析:区块链、AI、物联网与AR/VR如何重塑银行业
  • 如何用DouyinLiveWebFetcher零代码获取抖音直播实时数据:2025最新完整指南
  • 数据分析报告生成工具推荐:2026年AI报告自动化能力与企业适配性深度解析 - 科技焦点
  • 避开这5个Scratch编程思维误区,你的蓝桥杯省赛成绩还能再提50分 | 以2023中级组真题为例
  • 从游戏引擎到无人机:聊聊四元数解欧拉角为啥比直接算更靠谱
  • 备战蓝桥杯Java组别?先搞定这5类高频考点:进制转换、大数处理、组合数学、几何计算与动态规划
  • 企业指标管理系统排名:2026年指标治理能力与业务自助分析深度横评 - 科技焦点
  • 从HTTP报文到数据库查询:拆解TinyWebServer中用户登录注册的完整链路(C++/MySQL)
  • D2DX:让你的暗黑破坏神2在现代PC上焕然一新的终极指南
  • 打造四个九的在线CRM:从0到1构建99.99%可用性的核心架构
  • Simple Video Download Helper:终极免费视频下载解决方案深度探索
  • 5分钟免费解锁LOL国服所有皮肤:R3nzSkin换肤工具完整指南
  • 终极指南:3分钟为Windows换上macOS风格鼠标指针
  • 扎克伯格 Biohub 蛋白质生物学“世界模型“:AI 颠覆药物发现的全景解析
  • 戴尔G15笔记本散热控制终极指南:用开源工具彻底告别AWCC
  • AMD Ryzen SDT调试工具:专业硬件性能优化的终极指南
  • 告别重复劳动:用FlexTools插件5分钟创建SketchUp自定义参数化门窗族库
  • 一文搞懂:Kubernetes核心概念与实战——从Pod到Deployment、Service,云原生基础设施的第一课