仅在设备启动时运行一次脚本的方法

7次阅读
没有评论

问题描述

需要在设备启动时运行一个脚本,并且只运行一次。尝试过多种方法,包括 init.qcom.post_boot.sh, init.sec.boot.sh, debuggerd, 以及 mkshrc,但发现这些方法要么无法确保只运行一次,要么在某些情况下会频繁运行。

解决方案

方案1:利用 debuggerd 并结合 setprop 设置非持久性标志

由于 debuggerd 可以在未授权的情况下运行脚本,并且可以通过 setprop 设置一个非持久性标志来防止重复执行,这是当前环境下较为可行的方法。

步骤

  1. 编写脚本:创建一个脚本文件,例如 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
  2. 配置 debuggerd:编辑 /system/etc/debuggerd.conf 文件,在其中添加一行来启动脚本。
    ini
    start my_script /system/bin/sh /path/to/my_script.sh
  3. 确保权限:确保 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 的初始化系统,但如果有机会,可以考虑以下方法:

步骤

  1. 编写脚本:创建一个脚本文件,例如 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
  2. 修改 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
  3. 确保权限:确保脚本文件具有正确的 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 目录下创建一个临时文件作为标志,确保脚本只运行一次。

步骤

  1. 编写脚本:创建一个脚本文件,例如 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
  2. 确保权限:确保脚本文件具有正确的 SELinux 上下文。
    • 调整文件权限:chmod +x /path/to/my_script.sh
    • 设置适当的 SELinux 上下文:chcon u:object_r:script_exec_t:s0 /path/to/my_script.sh

以上方案可以根据实际情况选择适合的方法来实现设备启动时仅运行一次脚本的需求。

正文完