zoukankan      html  css  js  c++  java
  • imx6 Android6.0.1 init.rc解析

    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.1_2.1.0/device$ cd ../system/
    hejin@desk-ubuntu:/home/desk/aplex_m6.1.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.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.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[0]), "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) > 0 && strcmp(bootmode, "charger") == 0) {
            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 0;
    }

    注意到红色那几个,流程为: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 0664 /sys/module/lowmemorykiller/parameters/adj
        chown root system /sys/module/lowmemorykiller/parameters/minfree
        chmod 0664 /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

     

     

  • 相关阅读:
    Android基础
    Android基础
    Java小项目——多线程弹球
    Java小项目——抽奖系统
    Java小项目——五子棋
    Java小项目——画板
    Java基础——swing登录界面
    Java基础——类的继承
    实验室资料说明
    20180919 百信、百度面试
  • 原文地址:https://www.cnblogs.com/maogefff/p/7966799.html
Copyright © 2011-2022 走看看