MSM8953中Android系统添加启动脚本.rc文件

时间:2024-02-22 17:11:04

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文件,并尝试添加自己定义的服务。