Android 系统启动流程源码分析

2024-06-04 3543阅读

一、Init进程启动

是一个由内核启动的用户级进程。内核自行启动之后,就通过启动一个用户级程序init的方式,完成引导进程。

启动的代码init.c中的main函数执行过程:system\core\init.c中:

Android 系统启动流程源码分析 第1张

主要下面两个重要的过程:

1、rc文件解析

Android 系统启动流程源码分析 第2张

进入解析函数,把解析出来的东西放入相应的类型(List)

Android 系统启动流程源码分析 第3张

2、执行command和processes

进入***循环:执行execute_one_command和restart_processes

Android 系统启动流程源码分析 第4张

第二个原函数调用关系如下

Android 系统启动流程源码分析 第5张

准备启动service:service_start_if_needed

Android 系统启动流程源码分析 第6张

启动service的主要入口函数:service_start

Android 系统启动流程源码分析 第7张

创建进程函数:fork

Android 系统启动流程源码分析 第8张

执行新的service:execve

Android 系统启动流程源码分析 第9张

下面启动zygote为例子,在init.rc有这样一段描述

Android 系统启动流程源码分析 第10张

而svc->args[0]的值就是上面反选的代码。

函数execve(执行文件)说明: execve()用来执行参数filename字符串所代表的文件路径,第二个参数系利用数组指针来传递给执行文件,最后一个参数则为传递给执行文件的新环境变量数组。

返回值 如果执行成功则函数不会返回,执行失败则直接返回-1。

上面是sercice启动,下面在再举个action启动流程的例子

在这里触发,加入到action队列:

Android 系统启动流程源码分析 第11张

在init.c中main函数有这样一段代码:表示执行action队列

Android 系统启动流程源码分析 第12张

init.rc有这样一段描述

Android 系统启动流程源码分析 第13张

单执行到early-init的时候,就会启动这个函数.rc的start对应do_start,看下面代码片段:

Android 系统启动流程源码分析 第14张

进入do_start函数:

Android 系统启动流程源码分析 第15张

把参数early-init传入service_start函数,启动init进程,由于kernel启动的时候就已经启动了init进程,所以直接进入init进程的main函数了,看下面描述就会明白:

Android 系统启动流程源码分析 第16张

因为ueventd 和 Init 在同一个可执行文件下,因此在启动ueventd进程时,进程入口函数依然是main,进入main函数:

Android 系统启动流程源码分析 第17张

然后进入ueventd_main函数,完成!

二、启动serviceManager

在脚本文件Init.rc的描述,其中/system/bin/servicemanager adb shell 在小机端可以看到:

Android 系统启动流程源码分析 第18张

看看下面就知道对应源码的位置了:

Android 系统启动流程源码分析 第19张

打开Android.mk内容如下:

Android 系统启动流程源码分析 第20张

看到了: LOCAL_MODULE := servicemanager,而servicemanager就是上述.rc的servicemanager对应,所以源码就是service_manager.c;最后,使用include $(BUILD_EXECUTABLE)表示以一个可执行程序的方式进行编译。

源码的位置为:frameworks\base\cmds\servicemanager\service_manager.c

Android 系统启动流程源码分析 第21张

servicemanager用来管理系统中所有的binder service,不管是本地的c++实现的还是java语言实现的都需要这个进程来统一管理,最主要的管理就是,注册添加服务,获取服务。所有的Service使用前都必须先在servicemanager中进行注册。主要函数如下:

do_find_service( )

do_add_service( )

svcmgr_handler( )

三、Zygote进程启动

Zygote这个进程是非常重要的一个进程,Zygote进程的建立是真正的Android运行空间,初始化建立的Service都是Navtive service。

在脚本文件init.rc的描述

Android 系统启动流程源码分析 第22张源码的位置为:frameworks\base\cmds\app_process\app_main.cpp

参数为:–zygote --start-system-server

Android 系统启动流程源码分析 第23张

接着就到了AndroidRuntime类了,代码调用了:

Android 系统启动流程源码分析 第24张

调用代码位置:Frameworks\base\core\jni\AndroidRuntime.cpp

Android 系统启动流程源码分析 第25张

再往下就调用了静态main函数

Android 系统启动流程源码分析 第26张

进入的代码位置为:frameworks\base\core\java\com\android\internal\os\ZygoteInit.java

Android 系统启动流程源码分析 第27张

Zygote就建立好了,利用Socket通讯,接收请求,Fork应用程序进程,进入Zygote进程服务框架中。

上述中的main函数,是在另外一个.so中,名为:libandroid_runtime.so,是一个共享库。在app_process加载的时候,就把这个.so编译进来了,看下面代码:

Android 系统启动流程源码分析 第28张

再看libandroid_runtime.so是在哪里编译出来的:Frameworks\base\core\jni\Android.mk,代码片段如下:

Android 系统启动流程源码分析 第29张

通过上面的共享库和资源加载preload(),整个虚拟机的资源都是共享的,当有fork出其他的虚拟机时候,就可以节省资源了,提高了效率!

四、SystemServer启动

在Zygote进程进入循环之前,调用了startSystemServer( )

Android 系统启动流程源码分析 第30张

Android 系统启动流程源码分析 第31张

调用代码位置:frameworks\base\core\java\com\android\internal\os\RuntimeInit.java

Android 系统启动流程源码分析 第32张

Android 系统启动流程源码分析 第33张

Android 系统启动流程源码分析 第34张

从startSystemServer开始执行并没有去调用SystemServer的任何方法,只是通过反射获取了main方法,付给了MethodAndArgsCaller,并抛出了MethodAndArgsCaller异常。

此异常是在哪里处理的呢?回到startSystemServer( )函数的调用处:在ZygoteInit的main函数中:

Android 系统启动流程源码分析 第35张

如果startSystemServer抛出了异常,跳过执行ZygoteInit进程的循环,这是怎么回事呢?

在startSystemServer中异常是由handleSystemServerProcess抛出。

Android 系统启动流程源码分析 第36张

MethodAndArgsCaller run函数:调用前面所提到的

//SystemServer main方法

m = cl.getMethod(“main”, new Class[] { String[].class });

Android 系统启动流程源码分析 第37张

启动了进程SystemServer。

Android 系统启动流程源码分析 第38张

init1代码位置为:frameworks\base\services\jni\com_android_server_SystemServer.cpp

Android 系统启动流程源码分析 第39张

Android 系统启动流程源码分析 第40张

在systme_init()中有调用:init2

Android 系统启动流程源码分析 第41张

再回到init2

Android 系统启动流程源码分析 第42张

Android 系统启动流程源码分析 第43张

在类ServerThread启动了大量的服务,可以仔细看看有哪些服务;关键可以到到这些:

Android 系统启动流程源码分析 第44张

Android 系统启动流程源码分析 第45张

一切就绪,只差Home启动界面!

五、Home启动

在systemReady中调用了下面函数:

Android 系统启动流程源码分析 第46张

看下面代码重点:

//Launcher

Android 系统启动流程源码分析 第47张

然后就启动了Home界面,完成了整个Android启动流程。

六、附件

整个流程如下:

Android 系统启动流程源码分析 第48张

ps查看开机启动的进程:(看看pid和ppid的关系)

Android 系统启动流程源码分析 第49张

Android 系统启动流程源码分析 第50张Android 系统启动流程源码分析 第51张

觉得本文对您有用,麻烦点赞、关注、收藏,您的肯定是我创作的无限动力,谢谢!!!


    免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

    目录[+]