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. c# 生成二维码图片

    转载自:https://blog.csdn.net/hyunbar/article/details/78271778 1.在C#中直接引用ThoughtWorks.QRCode.dll 类 2.封装方 ...

  2. iOS 错误 undefined symbols for architecture i386

    undefined symbols for architecture i386 这个错误困扰了我几个小时. 网上很多问这个问题的,回答基本上都是说在 target 里面去的 armv64 什么什么的. ...

  3. JAVA基本数据类型所占字节数是多少?

    byte     1字节                short    2字节                int      4字节                long     8字节     ...

  4. java简单正则验证手机号

    import java.util.regex.Matcher; import java.util.regex.Pattern; /** * @Title:Tadesfza * @Description ...

  5. Windows系统设置临时环境变量

    path f:\newtest;%path% ---在Path内容中增加一个新的可执行文件搜索路径 从菜鸟到高手,CMD命令行修改临时环境变量:path

  6. jenkins详解(一)

    还是以以下几个问题来学习这个软件: 1.jenkins是什么? 2.为什么要用jenkins? 3.怎么用jenkins? 1.jenkins是什么? Jenkins是一个开源的.提供友好操作界面的持 ...

  7. Java方法区

    方法区 在一个jvm实例的内部,类型信息被存储在一个称为方法区的内存逻辑区中.类型信息是由类加载器在类加载时从类文件中提取出来的.类(静态)变量也存储在方法区中. jvm实现的设计者决定了类型信息的内 ...

  8. STM32-RS485通信软硬件实现

    OS:Windows 64 Development kit:MDK5.14 IDE:UV4 MCU:STM32F103C8T6/VET6 AD:Altium Designer 18.0.12 1.RS ...

  9. 此博客不再维护,请移步http://daiweilai.github.io/

    此博客不再维护,请移步新博客 http://daiweilai.github.io/ 新开的这个博客系统,托管在了Github.io上,喜闻乐见的Jekll加借鉴(抄袭)的精美主题构建而成,反正样子应 ...

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

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