问题描述
需要在设备启动时运行一个脚本,并且只运行一次。尝试过多种方法,包括 init.qcom.post_boot.sh
, init.sec.boot.sh
, debuggerd
, 以及 mkshrc
,但发现这些方法要么无法确保只运行一次,要么在某些情况下会频繁运行。
解决方案
方案1:利用 debuggerd
并结合 setprop
设置非持久性标志
由于 debuggerd
可以在未授权的情况下运行脚本,并且可以通过 setprop
设置一个非持久性标志来防止重复执行,这是当前环境下较为可行的方法。
步骤
- 编写脚本:创建一个脚本文件,例如
my_script.sh
,并确保它具有可执行权限。
bash
#!/system/xbin/sh
MY_SCRIPT_PATH="/path/to/my/script"
if [ ! -f "/data/local/tmp/flag" ]; then
/system/xbin/busybox sh "$MY_SCRIPT_PATH"
touch "/data/local/tmp/flag"
fi - 配置
debuggerd
:编辑/system/etc/debuggerd.conf
文件,在其中添加一行来启动脚本。
ini
start my_script /system/bin/sh /path/to/my_script.sh - 确保权限:确保
debuggerd
可以访问脚本文件和setprop
操作。- 调整文件权限:
chmod +x /path/to/my_script.sh
- 设置适当的 SELinux 上下文:
chcon u:object_r:script_exec_t:s0 /path/to/my_script.sh
- 调整文件权限:
方案2:利用 Android 的初始化系统
虽然用户目前受限于设备的锁定状态,无法直接修改 Android 的初始化系统,但如果有机会,可以考虑以下方法:
步骤
- 编写脚本:创建一个脚本文件,例如
my_script.sh
,并确保它具有可执行权限。
bash
#!/system/xbin/sh
MY_SCRIPT_PATH="/path/to/my/script"
if [ ! -f "/data/local/tmp/flag" ]; then
/system/xbin/busybox sh "$MY_SCRIPT_PATH"
touch "/data/local/tmp/flag"
fi - 修改
init.rc
:编辑/system/etc/init/init.<your_device>.rc
文件,添加一个服务来运行脚本。
ini
service my_script /system/bin/sh /path/to/my_script.sh
class core
oneshot
disabled - 确保权限:确保脚本文件具有正确的 SELinux 上下文。
- 调整文件权限:
chmod +x /path/to/my_script.sh
- 设置适当的 SELinux 上下文:
chcon u:object_r:script_exec_t:s0 /path/to/my_script.sh
- 调整文件权限:
方案3:利用 tmpfs
存储临时标志
在 tmpfs
目录下创建一个临时文件作为标志,确保脚本只运行一次。
步骤
- 编写脚本:创建一个脚本文件,例如
my_script.sh
,并确保它具有可执行权限。
bash
#!/system/xbin/sh
MY_SCRIPT_PATH="/path/to/my/script"
if [ ! -f "/dev/ashmem/flag" ]; then
/system/xbin/busybox sh "$MY_SCRIPT_PATH"
mknod /dev/ashmem/flag tmp
fi - 确保权限:确保脚本文件具有正确的 SELinux 上下文。
- 调整文件权限:
chmod +x /path/to/my_script.sh
- 设置适当的 SELinux 上下文:
chcon u:object_r:script_exec_t:s0 /path/to/my_script.sh
- 调整文件权限:
以上方案可以根据实际情况选择适合的方法来实现设备启动时仅运行一次脚本的需求。
正文完