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 系统开机日志

  • 2
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在RK3568上开机启动shell脚本的方法如下所示: 1. 首先,在系统的init.rc文件中添加以下内容: ``` service myshell /system/bin/myshell.sh user root group root disabled on property:sys.boot_completed=1 start myshell ``` 这段代码会启动一个名为myshell的服务,并在系统启动完成后执行`/system/bin/myshell.sh`脚本。 2. 然后,创建一个名为myshell.te的文件,将其放置在`device/rockchip/common/sepolicy`目录下,并添加以下内容: ``` type myshell, domain; type myshell_exec, exec_type, file_type; init_daemon_domain(myshell) allow myshell init_tmpfs:file create_file_perms; allow myshell self:capability { dac_override net_admin net_raw setgid setuid }; allow myshell device:dir { open read }; allow myshell shell:lnk_file { read }; allow myshell rootfs:lnk_file { getattr }; allow myshell socket_device:sock_file { write }; allow myshell shell_exec:file { getattr read}; allow myshell fuse:dir { search write add_name getattr}; allow myshell fuse:file { create write open getattr}; allow myshell system_file:file { execute_no_trans}; ``` 这段代码是为了授权myshell脚本执行所需的功能和权限。 通过以上步骤,你可以在RK3568上实现开机启动shell脚本的需求。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Android系统10 RK3399 init进程启动(四十四) 实战Android开机自启动脚本](https://blog.csdn.net/ldswfun/article/details/128279000)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [RK3399 Android 添加开机启动shell脚本](https://blog.csdn.net/weixin_41720013/article/details/120034087)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值