init.rc文件中执行shell命令

例如:
有产品需求需要在工厂菜单里面添加M5芯片的升级,方便以后的调试。

1、在工厂apk里面,M5需要升级的时候,去setprop dev.skym5update.enable=1 去启动sky_M5_update service来执行sky_m5_update.sh

2、脚本执行完成后重置setprop dev.skym5update.enable=0来停止sky_M5_update service

3、sky_M5_update service在开机的时候不需要去执行,把参数disabled加上即可。

#for V620 M5 update
service sky_M5_update /system/bin/sky_m5_update.sh
class main
user root
group root
disabled

on property:dev.skym5update.enable=1
start sky_M5_update
on property:dev.skym5update.enable=0
stop sky_M5_update

init.rc的修改
init.rc不能直接通过adb命令修改,我是直接修改了系统源码的/system/core/rootdir/init.rc文件,重新编译成rom后烧写到设备上(网上也有解包boot.img后,修改init.rc并重新打包烧写到设备上的方法,不过我并没有尝试)。对AIL的语法有了解之后,应该就能看懂下面的配置了

#触发器,当系统属性dev.bootcomplete=1即启动完成时触发
on property:dev.bootcomplete=1
start bootcomplete

#以root身份执行脚本
service bootcomplete /system/bin/sh /system/bin/bootcomplete.sh
class main
user root
group root
disabled
oneshot

由于initrc中支持的命令有限(不能支持system/bin下所有命令),而且不适合写比较复杂的逻辑(如传参、函数块 ),通常把这些功能放在shell脚本里来执行,但是shell脚本又需要放在initrc中来调用执行。因为随着Android版本更新,selinux的限制越来越多,在initrc中执行shell脚本肯能会遇到很多问题,即使设置selinux 为Permissive 也可能会遇到selinux问题。下面提供两个参考示例供参考

service test_shell /system/etc/test.sh
user root

猜你喜欢

转载自blog.csdn.net/baiyifei2016/article/details/129704555
今日推荐