Android FrameWork 启动步骤
发布时间:2021-12-18 18:37:56 所属栏目:PHP教程 来源:互联网
导读:嵌入式设备启动时bootloader加载linux内核,linux内核启动后运行第一个用户级进程init,从此进程进入Android世界,所以,android是一个框架而不是kernel。 在linux系统启动时,内核引导参数上一般都会设置init=/init,当android 最底层linux kernel 启动后会执
嵌入式设备启动时bootloader加载linux内核,linux内核启动后运行第一个用户级进程init,从此进程进入Android世界,所以,android是一个框架而不是kernel。 在linux系统启动时,内核引导参数上一般都会设置“init=/init”,当android 最底层linux kernel 启动后会执行一个用户级进程init,此进程为所有进程的父进程,进程号为1,这里为整个android框架的入口,init进程为android内所有进程的父进程。init 可执行程序一般位于/xbin/init 下,init程序源码在Android源码的system/core/init中,我们的分析就从main开始进入android framework。 /system/core/init/init.c#main init进程 为标准linux进程,它可以使用linux 内核提供的api,也可以使用标准库。 init 进程分两部分,boot 部分 及 daemon部分, int main(int argc, char **argv) { /* Boot part */ for(;;) { /* Daemon part */ } } 首先执行boot 部分,此部分创建文件系统基本目录,包括 /dev, /proc, /sys 等。 初始化kmsg log 模块,此模块用于获取linux kernle log 信息。 boot部分 最后解析init.rc配置文件,init_parse_config_file("/init.rc");/system/core/rootdir/init.rc init.rc 语法解释参考 /system/core/init/readme.txt 此文件定义了一系列 action及service。这里指定了系统启动时执行哪些动作,可以设置环境变量, 使用linux命令执行某个动作,启动服务,挂载文件系统等等。 action 是一个命令的序列,每个action定义了某一命令,action有触发机制,及在什么情况下执行此命令。当某一事件与此action的出发机制匹配,此action会被加到action执行队列中被执行。 parse_service 把解析后的 action 都放到 action_list链表,parse_action 把Service放在service_list。 boot部分最后遍历action_list执行相应命令,具体如下: (1)console_init_action :初始化console,显示A N D R O I D 字样在终端上。 (2)property_init_action (3)set_init_properties_action (4)property_service_init_action Daemon part : for(;;)不断执行一下动作: (1)启动service_list中指定的服务,所有android其他服务在此处通过service 方式启动,如虚拟机,servicemanager,mediaserver等, 每个服务对应init进程的一个子进程。 (2)不断调用poll 监控3个fd状态 property_set_fd signal_recv_fd keychord_fd property_set_fd 解释: 作为一个系统服务管理着系统的配置和状态,所有的这些系统配置和状态都是属性(property)。属性(property)是一对键/值(key/value)组合,键和值都是字符串类型。Androd中非常多的应用程序和库直接或者间接的依赖于属性系统,并由此决定其运行期的行为。例如:adbd进程通过属性来决定是否当前运行在模拟器中。再比如:java.io.File.pathSeparator方法返回存储在属性服务中的值,property_service_init_action 在boot阶段调用,初始化android 属性系统,系统固定的属性在目录 "/data/property" 下面。init 进程管理android属性系统所有数据,其他进程通过android提供的ashmem驱动只读属性系统。 signal_recv_fd : 子进程信号处理,waitpid等候子进程退出,清理资源,如果子进程是服务则重启子进程。 keychord_fd: 监控输入设备事件并启动相应服务。 至此,init进程启动完毕。 上面的daamon部分提到service_list保存了 init.rc中配置的启动项,android内给上层提供的一些主要服务都是在此处指定并启动。 如:servicemanager service servicemanager /system/bin/servicemanager user system critical onrestart restart zygote onrestart restart media --------------------#android运行时环境虚拟机启动 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 media /system/bin/mediaserver #多媒体service启动。 user media group system audio camera graphics inet net_bt net_bt_admin net_raw ioprio rt 4 ![]() (编辑:云计算网_泰州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |