Android开机执行指定shell脚本

文章允许转载,请注明来源:https://blog.csdn.net/feiniao8651/article/details/81664496

首先说明一点,这篇文章是偏向Android ROM定制,不适用于应用开发方向,如果是普通的应用开发者可以不用看了。

Android启动流程

对Android启动流程有了解的人,可能知道Android系统最开始是由init进程启动起来的,init进程会启动zygote进程,有了zygote才启动起上层的系统服务来。而init进程启动其实就是包含了解析执行init.rc的过程。我们今天这个开机完成后执行指定shell脚本的功能,也是通过在init.rc里添加配置来实现。

init.rc

init.rc是使用AIL(Android Init Language)编写的脚本,init进程读取执行里面的配置,进行一系列的环境初始化,关于这个脚本的写作语法可以参考深入分析AIL语言及init.rc文件,这篇博客里写的已经很详细了。

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

这里需要注意的是service的名称不能超过16个字符,另外也有说法是不能包含”_”和”-“,但是我看到init.rc里其他service名称有含”_”的,这个可能是不同版本Android系统init解析的方法相同。稳妥起见是不要包含这两个字符。
之后只要在自己指定路径放上要执行的shell脚本即可。

出问题时debug的方法

init进程的日志不会在adb logcat里面显示,而是写入了dmesg,所以当自己的配置没有生效时,可以通过以下命令查看init进程的日志,看看是否有报错

adb shell dmesg

参考:
How to execute a shell script from init.rc after boot finished
init.rc: invalid service name
深入分析AIL语言及init.rc文件
Android 系统(56)—Android 系统开机日志

猜你喜欢

转载自blog.csdn.net/feiniao8651/article/details/81664496