1. 概述

1.1 概述

之前分析过android5的init.rc,不过还是不够仔细,现在来看看android6的,多的就不写了,只写关键点

忘记一些基本概念可以先看看之前的笔记:

Android5.1.1 初始化流程之init进程(未完成)

i.mx6 Android5.1.1 初始化流程之init.rc解析(未完成)

涉及到的文件为:

/system/core/init/init.cpp   (init进程)

/system/core/rootdir/init.rc  (Google原生init.rc)

1.2 查找所有init.rc

init.rc只会存在于/system(android原生rc)和/device(硬件厂商特定的rc:一般为特定硬件或开发板特定的的东西,而非原生android中通用的)当中

1). 搜索/system:

hejin@desk-ubuntu:/home/desk/aplex_m6..1_2.1.0/device$ cd ../system/
hejin@desk-ubuntu:/home/desk/aplex_m6..1_2.1.0/system$ find -name "init*.rc"
./core/rootdir/init.zygote64.rc
./core/rootdir/init.rc
./core/rootdir/init.zygote32.rc
./core/rootdir/init.usb.rc
./core/rootdir/init.usb.configfs.rc
./core/rootdir/init.zygote64_32.rc
./core/rootdir/init.trace.rc
./core/rootdir/init.zygote32_64.rc

2). 搜索/device:(然后根据目录的路径名查找出跟我们相关的)

hejin@desk-ubuntu:/home/desk/aplex_m6..1_2.1.0$ find device/ -name "init*.rc"
...
device/fsl/sabresd_6dq/init.i.MX6Q.rc
device/fsl/sabresd_6dq/init.rc
device/fsl/imx6/init.recovery.freescale.rc
device/fsl/imx6/etc/init.usb.rc

3). 在编译完成之后,所有用到的init.rc都会放在/home/desk/aplex_m6.1.1_2.1.0/out/target/product/sabresd_6dq/root/目录下面,也可以直接查看:

hejin@desk-ubuntu:/home/desk/aplex_m6..1_2.1.0$ ls out/target/product/sabresd_6dq/root/*.rc
out/target/product/sabresd_6dq/root/init.environ.rc
out/target/product/sabresd_6dq/root/init.freescale.i.MX6DL.rc
out/target/product/sabresd_6dq/root/init.freescale.i.MX6QP.rc
out/target/product/sabresd_6dq/root/init.freescale.i.MX6Q.rc
out/target/product/sabresd_6dq/root/init.freescale.rc
out/target/product/sabresd_6dq/root/init.freescale.usb.rc
out/target/product/sabresd_6dq/root/init.rc
out/target/product/sabresd_6dq/root/init.recovery.freescale.rc
out/target/product/sabresd_6dq/root/init.trace.rc
out/target/product/sabresd_6dq/root/init.usb.configfs.rc
out/target/product/sabresd_6dq/root/init.usb.rc
out/target/product/sabresd_6dq/root/init.zygote32.rc
out/target/product/sabresd_6dq/root/ueventd.freescale.rc
out/target/product/sabresd_6dq/root/ueventd.rc

2. 总体流程

/system/core/rootdir/init.rc这个目录为init.rc,这个就是android6.0.1真正Google原生的init.rc,然后这个原生init.rc会通过import导入一些其他的init.rc,其中就包括我们设备的

在这个目录里面又会导入几个init.rc

import /init.environ.rc
import /init.usb.rc
import /init.${ro.hardware}.rc //通过getprop可以查看到ro.hardware为:freescale;看名字就知道为芯片原厂定义的init.rc,我们需要修改,一般就在这里面
import /init.usb.configfs.rc
import /init.${ro.zygote}.rc
import /init.trace.rc

查看源码:/system/core/init/init.cpp

int main(int argc, char** argv) {
if (!strcmp(basename(argv[]), "ueventd")) {
return ueventd_main(argc, argv);
} ...
  
init_parse_config_file("/init.rc"); action_for_each_trigger("early-init", action_add_queue_tail); ...
action_for_each_trigger("init", action_add_queue_tail); queue_builtin_action(mix_hwrng_into_linux_rng_action, "mix_hwrng_into_linux_rng"); char bootmode[PROP_VALUE_MAX];
if (property_get("ro.bootmode", bootmode) > && strcmp(bootmode, "charger") == ) {
action_for_each_trigger("charger", action_add_queue_tail);
} else {
action_for_each_trigger("late-init", action_add_queue_tail);
} queue_builtin_action(queue_property_triggers_action, "queue_property_triggers"); while (true) {
...
}
return ;
}

注意到红色那几个,流程为:early-init --> init --> late-init

1). early-init: 

主要是启动了ueventd,这个进程会做设备节点。然后在init进程加载这个trigger之后,会去等一个/dev/.coldboot_done文件,这个文件当ueventd设备节点都做好了会去写这个文件。

2). init:

这里面主要是创建一些目录,chown chmod操作

3). late-init: (作用:挂在文件系统和系统系统核心服务)

我们看下面late-init中又分了多个trigger,并且每一个做什么都写好了。

on late-init
trigger early-fs //挂fstab.freescale里面的
trigger fs     //挂fstab.freescale里面的
trigger post-fs //创建一堆的目录和数据 # Load properties from /system/ + /factory after fs mount. Place
# this in another action so that the load will be scheduled after the prior
# issued fs triggers have completed.
trigger load_system_props_action //加载系统属性 # Now we can mount /data. File encryption requires keymaster to decrypt
# /data, which in turn can only be loaded when system properties are present
trigger post-fs-data //创建data下面的目录
trigger load_persist_props_action //加载永久属性 # Remove a file to wake up anything waiting for firmware.
trigger firmware_mounts_complete trigger early-boot
trigger boot //启动boot

boot中启动core服务,core服务有ueventd、logd、healthd、sh、adbd、servicemanager、vold、SurfaceFlinger、bootanimation。

on boot
...
chown root system /sys/module/lowmemorykiller/parameters/adj
chmod /sys/module/lowmemorykiller/parameters/adj
chown root system /sys/module/lowmemorykiller/parameters/minfree
chmod /sys/module/lowmemorykiller/parameters/minfree  
...
class_start core //启动所有class标记为core的服务

2. 服务类型

2.1 init.rc中服务的描述

接在上面的,在启动了core类型的所有服务,那么现在具体讲讲服务有哪几个类型,每个具体干了什么

基本的服务类型包括三种:core(最重要的)、main(次级重要的)、late_start(不那么重要的)

这三类服务分别通过class_start, class_reset, class_stop来对统一类的服务进行统一的操作。

相同类别的服务,基本上是同时启动,相互之间的延时很小。

2.2. core类服务

对/system/core/rootdir/init.rc中的class core进行全局搜索(未全部写入,很多不重要的,也有我看不懂重不重要的):

ueventd /sbin/ueventd
logd /system/bin/logd
healthd /sbin/healthd
console /system/bin/sh
adbd /sbin/adbd
servicemanager /system/bin/servicemanager
vold /system/bin/vold
surfaceflinger /system/bin/surfaceflinger
bootanim /system/bin/bootanimation

可以看到,core服务都是系统最基本的服务,只要core服务全部启动,手机此时是可以运行的,但是却看不到东西,原因是framework没有启动。此时启动的都是C,C++的进程

2.3. main类服务

对/system/core/rootdir/init.rc中的class main进行全局搜索(未全部写入,很多不重要的,也有我看不懂重不重要的):

netd /system/bin/netd
debuggerd /system/bin/debuggerd
debuggerd64 /system/bin/debuggerd64
ril-daemon /system/bin/rild
surfaceflinger /system/bin/surfaceflinger
media /system/bin/mediaserver
bootanim /system/bin/bootanimation
installd /system/bin/installd
sshd /system/bin/start-ssh
zygote /system/bin/app_process

可以看到main的服务相对多一些,看到zygote了吧,由此可见main服务大部分是建立在java层或者与java层息息相关的系统服务。

2.4. late_start类服务

字面意思是晚些启动。/device/中一些硬件厂商的.rc文件中会将一些服务设置为该类。

3. device目录下的启动

流程:

1. 首先通用mk:  device/fsl/imx6/imx6.mk

2. 执行具体架构和模式的mk:  device/fsl/imx6/sabresd_6dq.mk  (在这里面会将第3步中的需要执行的服务文件全部复制out/target中的系统中去,注意:有一些文件复制过程中会改变名字,例如init.rc就改为了init.freescale.rc

PRODUCT_COPY_FILES += \
device/fsl/sabresd_6dq/init.rc:root/init.freescale.rc \ //将init.rc复制到out/target/product/sabresd_6dq/root/init.fresscale.rc
device/fsl/sabresd_6dq/init.i.MX6Q.rc:root/init.freescale.i.MX6Q.rc \

3. 执行服务:  init.rc等等  (注意:这一步并不是在编译时候运行,而是在第2步拷贝给android系统,在android启动后执行的文件)

参考资料:

http://blog.csdn.net/u010753159/article/details/51981121

http://blog.csdn.net/longyc2010/article/details/39616979

 

imx6 Android6.0.1 init.rc解析的更多相关文章

  1. Android的init过程:init.rc解析流程

    这几天打算看下安卓的代码,看优秀的源代码也是一种学习过程,看源代码的过程就感觉到,安卓确实是深受linux内核的影响,不少数据结构的使用方法全然一致.花了一中午时间,研究了下init.rc解析过程,做 ...

  2. Android6.0执行时权限解析,RxPermissions的使用,自己封装一套权限框架

    Android6.0执行时权限解析,RxPermissions的使用.自己封装一套权限框架 在Android6.0中,新添加了一个执行时的权限,我相信非常多人都已经知道了.预计也知道怎么用了,这篇博客 ...

  3. Android init.rc解析【转】

    转自:http://www.linuxidc.com/Linux/2014-10/108438.htm 本文主要来自$Android_SOURCE/system/init/readme.txt的翻译. ...

  4. i.mx6 Android5.1.1 初始化流程之init.rc解析(未完成)

    接上一篇:i.mx6 Android5.1.1 初始化流程之init进程 参考资料:http://blog.csdn.net/mr_raptor/article/category/799879 这个博 ...

  5. [IMX6]Android6.0移植和分析

    0. 知识点 中断(设备树) [IMX6]设备树分析--dts 1. 编译 Android6.0内核移植(1):分析编译日志 Android6.0内核移植(2):kernel编译内核 单独烧录kern ...

  6. imx6. android6.0经常修改或者用到的目录(未完)

    系统应用apk存放的文件: out/target/product/sabresd_6dq/system/app 系统配置存放目录:(我自己的,也许不对) out/target/product/sabr ...

  7. Android系统init进程启动及init.rc全解析

    转:https://blog.csdn.net/zhonglunshun/article/details/78615980 服务启动机制system/core/init/init.c文件main函数中 ...

  8. Android 6.0启动过程具体解析

    在之前的一篇文章中.从概念上学习了Andoird系统的启动过程.Android系统启动过程学习 而在这篇文章中,我们将从代码角度细致学习Android系统的启动过程,同一时候,学习Android启动过 ...

  9. Android6.0 init 深入分析

    之前写过一篇关于android5.0 init的介绍,这篇博客是介绍android6.0init,之前有的代码介绍不详细.而且分析 解析init.rc那块代码也没有结合init.rc介绍. 一. ma ...

随机推荐

  1. Net系列框架-Dapper+AutoFac 基于接口

    Net系列框架-Dapper+AutoFac 基于接口 工作将近6年多了,工作中也陆陆续续学习和搭建了不少的框架,后续将按由浅入深的方式,整理出一些框架源码,所有框架源码本人都亲自调试通过,如果有问题 ...

  2. C#基础笔记(第二十天)

    1.复习属性:保护字段的构造函数:初始化对象初始化对象:给对象的每个属性去赋值什么时候会调用构造函数:当我们new的时候面向对象中需要注意的两个关键字this 1.代表当前类的对象 2.调用自己的构造 ...

  3. linux网络流量实时监控工具之iptraf 【个人比较喜欢用的流量监控软件】

    linux网络流量实时监控工具之iptraf IPTraf是一个网络监控工具,功能比nload更强大,可以监控所有的流量,IP流量,按协议分的流量,还可以设置过滤器等,如下图 对监控网络来说,这个更适 ...

  4. 深入了解java虚拟机(JVM) 第七章 内存分配策略

    理解了jvm内存分配策略不仅是程序性能调优的重要知识,还能够给养成自己一种良好的代码思路,一个程序的代码差异往往都是在这里体现出来的. 一.对象优先分配到Eden区域   一般来说,新创建的对象都会直 ...

  5. 关于Mybatis 反向生成后 查询结果全部为null 解决办法

    今天遇到了一个问题,就是mybatis通过反向生成工具 生成的pojo类(实体类) xml文件 以及Mapper之后查询时结果为null 我写的代码怎么看都没有错 就是没有结果 后来在排除错误的时候发 ...

  6. java下载文件注意点

    前台: 不建议使用ajax,可以使用window.location.href 后台: 三个参数--> response path filename--filename如果要防止乱码,可以用Str ...

  7. AngularJS入门讲解4:多视图,事件绑定,$resource服务讲解

    上一课,大家知道,手机详细模板我们没有写出来,使用的是一个占位模板. 这一课,我们先实现手机详细信息视图,这个视图会在用户点击手机列表中的一部手机时被显示出来. 为了实现手机详细信息视图,我们将会使用 ...

  8. 记一名软件实施自学转Java开发,附学习计划

    2015年毕业到现在已经3年了,而我转型开发已经有一年的时间了.写这篇文章除了记录,主要还是想分享一些经历给想要转型开发的同学们,不要走那些我走过的弯路. 2015年入职了第一家公司,当时是做的分销系 ...

  9. Android实用代码片段

    有时候,需要一些小的功能,找到以后,就把它贴到了博客下面,作为留言,查找起来很不方便,所以就整理一下,方便自己和他人. 一.  获取系统版本号: 1 PackageInfo info = this.g ...

  10. SVN服务器端环境搭建步骤

    5.1 安装服务器端程序 yum install -y subversion 5.2 创建并配置版本库 创建版本库目录 mkdir -p /var/svn/repository 在版本库目录下创建具体 ...