Android启动后,系统执行的第一个进程是一个名称为init 的可执行程序。提供了以下的功能:设备管理、解析启动脚本、执行基本的功能、启动各种服务。代码的路径:
system/core/init,编译的结果是一个可执行文件:init。这个init 的可执行文件是系统运行的第一个用户空间的程序,它以守护进程的方式运行。启动脚本则就是下面要讲的Init.rc。

===========================================================================================

在Android中使用启动脚本init.rc,可以在系统的初始化过程中进行一些简单的初始化操作。这个脚本被直接安装到目标系统的根文件系统中,被 init可执行程序解析。使用方法参考system/core/init/readme.txt,关键字参考system/core/init/keyword.h。
      init.rc是在init启动后被执行的启动脚本,其语法主要包含了以下内容:
Commands:命令
Actions: 动作
Triggers:触发条件
Services:服务
Options:选项
Propertise:属性
(1) Commands是一些基本的操作,例如:
    mkdir /sdcard 0000 system system
    mkdir /system
    mkdir /data 0771 system system
    mkdir /cache 0770 system cache
    mkdir /config 0500 root root
    mkdir /sqlite_stmt_journals 01777 root root
    mount tmpfs tmpfs /sqlite_stmt_journals size=4m

这些命令在init可执行程序中被解析,然后调用相关的函数来实现。
(2)Actions(动作)表示一系列的命令,通常在Triggers(触发条件)中调用,动作和触发条件的形式为:
   on <trigger>
      <command>
      <command>
      <command>
动作的使用示例如下:
    on init
    export PATH /sbin:/system/sbin:/system/bin:/system/xbin
    mkdir /system
init表示一个触发条件,这个触发事件发生后,进行设置环境变量和建立目录的操作称为一个“动作”。
(3)Services(服务)通常表示启动一个可执行程序,Options(选项)是服务的附加内容,用于配合服务使用。
service vold /system/bin/vold
    socket vold stream 0660 root mount
service bootsound /system/bin/playmp3
    user media
    group audio
    oneshot
vold和bootsound分别是两个服务的名称,/system/bin/vold和/system /bin/playmp3分别是他们所对应的可执行程序。socket、user、group、oneshot就是配合服务使用的选项。其中oneshot选项表示该服务只启动一次,而如果没有oneshot选项,这个可执行程序会一直存在--如果可执行程序被杀死,则会重新启动。
(4) Properties(属性)是系统中使用的一些值,可以进行设置和读取。
    setprop ro.FOREGROUND_APP_MEM 1536
    setprop ro.sf.hwrotation 90

on property:ro.kernel.qemu=1
    start adbd
setprop 用于设置属性,on property可以用于判断属性,这里的属性在整个Android系统运行中都是一致的。init脚本的关键字可以参考init进程的system/core/init/keyword.h文件。init.rc的使用方法,可以参考说明文件system/core/init/readme.txt。如果想要修改启动过程只需要修改init.c(system/core/init)或者init.rc里的内容即可.

以上说明了init.rc中各个组成部分,这些内容是有固定的执行顺序,这个顺序由early-init, init, early-boot, boot这四个关键字决定。一个典型的rc文件的写法如下:
on early-init
--------------

on init
--------------

on early-boot
--------------

on boot
--------------

rc文件中这4个部分是可以打乱顺序随便写的,但是解析完了以后的执行顺序确实固定的,执行顺序如下:early-init -> init -> early-boot -> boot
==================================================================================================================

既然android是运行在linux之上的,我们可否只启动linux而不启动android,这样的话在不需要图形界面的设备中可以大大降低硬件运行要求而提供内核服务。我们可以通过修改init.rc来实现。

android的系统应用中的一个重要的进程就是zygote,所有的java应用程序进程都是由zygote派生出来的zygote这个进程的作用就是“生儿子”zygote进程正是在linux kernel startup后通过这个文件启动的,具体看init.rc中这一段:service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server。一段一段的分析这个代码:启动服务名字zygote.   /system/bin/app_process:进程的bin文件具体路径,后面跟的就是启动参数-Xzygote /system/bin --zygote --start-system-server。

=================================================================================================

假设要内置的文件名称为iperf。(1)将iperf放到Codebase的任意一个目录下(该目录必须能够在搜索Android.mk时被搜索到),比如system/iperf/iperf。(2)在system/iperf目录下添加一个Android.mk文件,内容如下:
LOCAL_PATH:= $(call my-dir)
PRODUCT_COPY_FILES += $(LOCAL_PATH)/iperf:system/iperf/iperf
重新编译Codebase即可,该文件将被内置到手机的system/iperf目录下。注意这种方法禁止复制APK文件。

=================================================================================================

假设,我们通过adb调试命令调好了一个外设的硬件模块,下一步的动作,需要让系统开机自动跑这些命令并正常启动模块的工作。这个时候,就需要用到sh将这些命令组合起来,放到init.rc中就可以实现这个目的(不要放到init.project.rc中,会影响到WIFIBT)。

出于执行权限原因,ko文件可以放到vendor的/system/lib/modules下(不能放到vendor对应的/data目录,RELEASE版本/data无权限insmod),可执行文件包括shell则放到vendor的/system/bin下,这样确保任何时候都可以执行。

#!/system/bin/sh
PKG_DIR=/system/lib/modules
APP_DIR=/system/bin cd $PKG_DIR
CUR_PKG_DIR=`pwd`
echo "CUR_PKG_DIR = $CUR_PKG_DIR" insmod $PKG_DIR/accel_qlulpsh.ko
insmod $PKG_DIR/mag_qlulpsh.ko
insmod $PKG_DIR/gyro_qlulpsh.ko
insmod $PKG_DIR/pedometer_qlulpsh.ko
insmod $PKG_DIR/gestures_qlulpsh.ko
insmod $PKG_DIR/contexts_qlulpsh.ko cd $APP_DIR
CUR_APP_DIR=`pwd`
echo "CUR_APP_DIR = $CUR_APP_DIR" #Program the Sensor hub
echo "SensorHub Programming using loader APP"
sleep
./qlulpsh_loader_app -i ./ulpsh_s2_main.shexe -b -s -t -d
sleep
./qlulpsh_loader_app -c -a echo "Starting SensorHub..."
echo > /sys/devices/virtual/QL_Sensors/qlulpsh/intr_enable
echo > /sys/devices/virtual/QL_Sensors/qlulpsh/FFE_RunCnt
sleep echo "Starting sensorservice..."
sensorservice &
 

注意:(1)两个可执行文件前要加./,否则提示可执行文件not found,需指明当前目录下。(2)考虑硬件的实际执行情况,sh中有sleep语句,有些读操作要等待真实硬件初始化OK。(3)sensorservice &启动安卓系统sensor服务。

在init.rc中,补上如下语句,用service启动一个shell。

# SenHub scripts
service myshell /system/bin/sensorhub_init.sh
oneshot

---

init进程 && 解析Android启动脚本init.rc && 修改它使不启动android && init.rc中启动一个sh文件的更多相关文章

  1. init进程解析rc文件的相关函数分析

    init进程的源码文件位于system/core/init,其中解析rc文件语法的代码放在五个函数中, init_parse_config_file (init_parser.c), read_fil ...

  2. uboot-tiny4412启动流程(下)----如何将自己的裸板测试程序加入uboot中启动测试

    今天在工作上搞了一天高通的芯片uboot程序,目的是希望将一个裸板的程序移植到uboot中,并且开机让它运行.这个芯片是NXP4330,目前是高通的一个芯片,基于ARM-contexA9架构,那么就跟 ...

  3. 第一个用户进程 - Android 的 Init 进程

    本文尝试对着 <深入理解 Android 5.0 系统>来对 android 9.0 的启动代码进行分析,但是分析过程中发现自己缺乏操作系统方面的知识,以致于只能做一些简单分析.最近也买了 ...

  4. 内核启动流程3--Busybox的init进程

    Busybox是用来制作文件系统的一个工具集,可以用来替换GNU fileutils shellutils等工具集,它为各种小型的或者嵌入式系统提供了比较完全的工具集. 它提供的核心程序中包括了用户空 ...

  5. 制作根文件系统之内核如何启动init进程

    start_kernel其实也是内核的一个进程,它占用了进程号0,start_kernel的内容简写如下: asmlinkage void __init start_kernel(void) //内核 ...

  6. Linux init进程学习 转

    http://oss.org.cn/kernel-book/ch13/13.6.1.htm init进程的建立 Linux将要建立的第一个进程是init进程,建立该进程是以调用kernel_threa ...

  7. 为Android添加开机启动脚本

    转:https://blog.csdn.net/u014316462/article/details/76438611 本文介绍了一种在Android 4.2.2源码中添加.修改文件或者代码,来达到使 ...

  8. 容器内init进程方案

    背景 进程标识符 (PID) 是Linux 内核为每个进程提供的唯一标识符.熟悉docker的同学都知道, 所有的进程 PID都属于某一个PID namespaces, 也就是说容器具有一组自己的 P ...

  9. linux文件系统启动流程、启动脚本

    linux文件系统启动流程.启动脚本 下面是一张Linux启动流程图: 在了解启动流程之前,我们应该先知道系统的几个重要脚本和配置文件,他们对应的路径为: 1. /sbin/init 2. /etc/ ...

随机推荐

  1. ASP.NET Identity 用户注册相关设定

    此部分可以在 Web项目中的App_Start目录下的 IdentityConfig.cs 文件进行设置. 1.配置密码的验证逻辑 manager.PasswordValidator = new Pa ...

  2. Android 绘制动态图

    最近准备技能大赛,需要将从传感器中读出的数据在移动客户端以图的形式绘制出来,因为平时很少绘图,于是各种查资料,算是勉强做出来了. 以下是大赛理论效果图(左)和实际效果图(右),真的是理想很丰满,现实很 ...

  3. 时间处理总结(一).net

    不断整理中... 获取当前时间DateTime.Now.ToString("d") ;//获取到的日期格式为eg :2013/11/14 时间格式只取年月日DateTime.Now ...

  4. io流之写文件

    用Java程序写文件有多种方式,对于不同类型的数据,有不同的写方法.写文件的关键技术点如下: 1.FileOutputStream打开文件输出流,通过write方法以字节为单位写文件,是写文件最通用的 ...

  5. IDC机房动力环境设备维护

    高低压配电                                              空调                                               ...

  6. windows phone 8 设置锁屏背景

    本来想研究一下 利用闪光灯实现手电筒的代码,发现不是简答设置FlashMode属性可以解决问题的,ms也没有提供api,无意瞄了一眼侧边栏的文章列表,发现了设置屏幕锁屏背景的实现,手一抖点进去了.还算 ...

  7. 《Thinking In Java第四版》拾遗

    <Thinking In Java第四版>拾遗 转自我的github(http://katsurakkkk.github.io/2016/05/Thinking-In-Java%E7%AC ...

  8. CentOs install oracle instant client

    rpm -ivh oracle-instantclient11.2-basic-11.2.0.3.0-1.x86_64.rpm rpm -ivh oracle-instantclient11.2-de ...

  9. 『奇葩问题集锦』Ruby 切换淘宝源报错WARNING: Error fetching data: SSL_connect returned=1 errno=0 state=SSLv3 read s erver certificate B: certificate verify failed

    ===>首先需要使用https<===https://ruby.taobao.org/ 第一步 下载http://pan.baidu.com/s/1kU0rxtH 复制到ruby安装的根目 ...

  10. [转]Vim 复制粘贴探秘

    Vim作为最好用的文本编辑器之一,使用vim来编文档,写代码实在是很惬意的事情.每当学会了vim的一个新功能,就会很大地提高工作效率.有人使用vim几十年,还没有完全掌握vim的功能,这也说明了vim ...