zoukankan      html  css  js  c++  java
  • MSM8953中Android系统添加启动脚本.rc文件

    1、前言

    在Android系统中使用启动脚本.rc文件,可以在系统的初始化过程中进行一些简单的初始化操作,这些初始化启动脚本.rc文件直接被安装到目标板的根文件系统中,例如,init.rc启动脚本被init可执行程序进行解析,本文将简单介绍如何在MSM8953平台的Android系统中添加我们自己的启动脚本.rc文件。

    2、Android添加启动脚本

    关于.rc启动脚本的语法在本篇文章中将不会介绍,只介绍如何对Android源码进行修改,并在我们的目标板中添加启动脚本.rc文件的基本流程,我们需要添加的启动脚本为:

    init.test.rc

    需要添加到目标板系统的目录为:

    /vendor/etc/init/hw/

    接下来,将对在Android系统中添加启动脚本的流程进行分析:

    进入到需要修改的目录下,如下命令:

    $ cd msm8953_9.0/device/qcom/msm8953_64

    修改该目录下的AndroidBoard.mk文件,可以使用vim编辑器或者其它软件:

    $ vim AndroidBoard.mk

    修改如下所示:

    该代码表示要对init.test.rc文件进行编译,其中LOCAL_MODULE表示模块的名称,直接为文件的名称,LOCAL_SRC_FILES表示源文件的路径,在上面表示为当前目录,因此,我们需要在当前的目录下面,新创建我们需要添加的init.test.rc文件,LOCAL_MODULE_PATH表示目标文件打包在目标板系统的哪个路径,在上面表示,打包的路径为/vendor/etc/init/hw/,修改完成后,保存即可。

    接下来修改该目录下的msm8953_64.mk文件,命令如下:

    $ vim msm8953_64.mk

    修改文件如下:

    在上面的代码中,我们定于了一个变量TEST_INIT,然后变量的内容为我们需要添加的模块的名称,PRODUCT_PACKAGES为全局变量,表示编译时候需要打包的内容,在这里,我们需要把我们定于的模块,也就是要添加的启动脚本添加进去,否则的话,将不会进行编译,修改完成后,保存即可。

    接下来修改该目录下的init.target.rc文件,命令如下:

    $ vim init.target.rc

    修改文件如下:

    在这里,表示需要把我们新添加的init.test.rc文件导入,注意文件的路径,这里是目标板系统中的文件的路径,否则的话,脚本文件将不能启动。

    接下来,当前的目录下,新创建我们需要添加的启动脚本init.test.rc文件,如下命令:

    $ touch init.test.rc
    $ vim init.test.rc

    在init.test.rc文件中添加下面的内容:

    在上面的代码中,定于了一个触发动作,触发的条件为:

    sys.boot_completed=1

    也就是当系统的属性sys.boot_completed为1的时候(系统启动完成),该动作将会被触发,其下面的语句也将会被逐句执行,语句的含义解析如下:

    write /sys/class/gpio/export 0

    表示在sysfs中导出gpio0引脚。

    write /sys/class/gpio/gpio0/direction out

    表示将gpio0引脚的方向设置为输出方向,该方向能控制gpio引脚的高低电平。

    write /sys/class/gpio/gpio0/value 1

    表示将gpio0引脚的电平设置为高电平。

    chmod 764 /sys/class/gpio/gpio0/value

    该句则表示将value的访问属性修改为拥有者可读可写可执行,组可读可写,其他人只能读。

    启动脚本init.test.rc文件修改完成,接下来重新编译Android系统,检查输出文件中是否已经生成了我们添加的启动脚本:

    $ cd msm8953_9.0/out/target/product/msm8953_64/vendor/etc/init/hw
    $ ls -al

    输出如下,说明新添加的启动文件init.test.rc已经成功被打包进系统了:

    接下来,将编译后的镜像文件重新烧写到目标板中,然后对目标板重启,检查kernel的启动log看是否已经启动了我们新添加的启动脚本:

    $ su root
    # dmesg | grep "init.test.rc"

    输出如下,表示启动脚本init.test.rc已经被成功加载了,并且定义的动作已经被成功触发:

    也可以检查对应的目录下,是否具有我们的启动脚本init.test.rc:

    # cd /vendor/etc/init/hw
    # ls -al

    输出如下,说明新添加的init.test.rc文件已经存在当前启动的Android系统中了:

    最后,检查动作触发后,执行的内容是否正确,也就是检查gpio0这个引脚是否被导出sysfs中,方向是否为输出,当前的电平值是否为高电平:

    # cd /sys/class/gpio
    # ls -l

    输出如下,表示gpio0已经成功被导出:

    接下来,检查gpio0的方向以及当前的电平值:

    # cd gpio0
    # cat direction
    # cat value
    # ls -l value

    输出如下,说明定义在动作下的语句都被成功执行了:

    至此,我们就已经实现了在Android系统中添加自己定于的启动脚本init.test.rc文件了。

    3、脚本中启动一个简单的服务

    对于Android系统中的.rc文件,我们除了可以定义一些动作(Action)以外,还能进行一些服务(Service)定义。

    在上面,我们已经成功实现了在Android系统中添加我们自己定义的启动脚本init.test.rc文件,接下来,我们将在此基础上,继续修改文件,在启动脚本中添加一个简单的服务,当我们的启动脚本文件init.test.rc被解析的时候,把我们自己定义的服务进行启动。

    进入到需要修改的Android源码目录下,如下:

    $ cd msm8953_64/device/qcom/msm8953_64

    修改该目录下的AndroidBoard.mk文件,将我们自己定义的.sh脚本进行编译,修改如下:

    该代码表示要对init.test.boot.sh,也就是模块进行编译,源文件为当前路径的init.test.boot.sh文件,LOCAL_MODULE_PATH表示为模块生成在目标板的路径,定义为TARGET_OUT_VENDOR_EXECUTABLES变量的值,也就是下面的路径:

    /vendor/bin/

    接下来,修改当前目录的msm8953_64.mk文件,将我们定于的.sh文件进行打包编译:

    $ vim msm8953_64.mk

    修改如下:

    接下来,修改前面添加的init.test.rc文件,定义我们需要添加的服务:

    $ vim init.test.rc

    修改如下:

    该服务比较简单,分析一下吧,service关键字表示我们需要定义一个服务,服务的名称为test_boot-sh,当属性sys.boot_completed被设置为1后,启动我们自己定义的服务,服务启动后执行的.sh文件为:

    /vendor/bin/init.test.boot.sh

    class core表示当core服务起来后,该test_boot-sh服务也将被启动,oneshot表示该服务只执行一次。

    接下来,在当前目录下,新创建init.test.boot.sh文件,并添加我们简单的测试代码:

    $ touch init.test.boot.sh
    $ vim init.test.boot.sh

    .sh文件编辑如下:

    从上图看到,新创建的.sh文件要做的事情很简单,只是输出一个字符串提示,用来说明我们自己添加的服务已经成功启动了。

    此外,想要成功运行init.test.boot.sh,还需要解决该文件运行的SELinux的策略问题,否则的话,服务将启动不成功,修改如下:

    $ cd msm8953_9.0/device/qcom/sepolicy/vendor/msm8953
    $ vim file_contexts

    文件修改如下:

    代码添加修改完成后,重新编译镜像文件,并检查init.test.boot.sh文件是否已经被编译了:

    $ cd msm8953_9.0/out/target/product/msm8953_64/vendor/bin
    $ ls -l

    输出如下所示,表示.sh文件已经被成功编译打包了:

    接下来,还需要检查.sh文件的SELinux策略是否已经被添加,对于vendor下的sepolicy,如下查看:

    $ cd msm8953_9.0/out/target/product/msm8953_64/vendor/etc/selinux
    $ vim vendor_file_contexts

    如下所示,说明sepolicy已经被成功添加了:

    接下来将镜像文件重新打包并烧写到目标板中重启系统,检查一下我们添加的服务是否已经正常启动:

    先来检查一下,目标板对应的系统中是否存在init.test.boot.sh文件:

    # cd /vendor/bin
    # ls -al *.sh

    输出如下,表示文件存在:

    接下来,检查kernel的启动log,看我们的服务是否已经成功加载:

    # dmesg | grep Service

    输出如下,说明我们自己添加的Service已经成功启动了:

    4、小结

    本文主要简单介绍了如何在MSM8953平台的Android系统中添加自己定于的启动脚本.rc文件,并尝试添加自己定义的服务。

  • 相关阅读:
    PS 灰度处理图片 然后翻转黑白颜色
    其它 门 修改密码
    uview组件部分样式丢失.u-flex样式丢失
    微信公号号-模板通知问题
    background-image详细属性
    VS code更换编辑器自定义背景图片
    console.log显示数据与展开运算符显示数据不一致
    项目展示
    ASP.Net Core解读依赖注入
    注意力增强卷积 代码解读
  • 原文地址:https://www.cnblogs.com/Cqlismy/p/12149767.html
Copyright © 2011-2022 走看看