【问题标题】:Android run script at boot using init.rc not workingAndroid 在启动时使用 init.rc 运行脚本不起作用
【发布时间】:2020-05-15 03:39:10
【问题描述】:

我正在尝试运行一个在设备完成启动时执行的脚本。这个特定设备不支持从 init.d 目录运行脚本,这就是我使用 init.rc 的原因。

init.rc 文件已被修改为包含以下代码

on property:sys.boot_completed=1
start initAsic

service initAsic /data/local/tmp/runn.sh
user root
group root
oneshot

然后,启动映像已重建并刷新到设备。可以通过查看位于/ 的 init.rc 文件来确认更改

目前我只使用一个简单的测试脚本(testScript.sh),它发出以下命令

echo hi >> /data/local/tmp/test.txt

testScript.sh 和 text.txt 文件具有777 权限集,并且都已使用adb push 推送到设备。 他们当前的位置是/data/local/tmp/

由于某种原因,我的脚本似乎没有运行,因为我看不到任何写入 test.txt 的文本。

我错过了什么吗? 会不会是 SELinux 的问题?

我的设备当前已将 SElinux 设置为许可。这是通过更改 BoardConfig.mk 文件并重建 boot.img 来完成的。

【问题讨论】:

    标签: android linux linux-kernel init


    【解决方案1】:

    通过运行命令dmesg | grep -C5 initAsic 我看到我收到了这个错误代码

    service initAsic does not have a SELinux domain defined
    

    我需要将seclabel u:r:init:s0 行添加到我的初始化服务的问题。完整的服务现在看起来像这样。

    service initAsic2 /data/local/tmp/runn.sh
    seclabel u:r:init:s0
    user root
    group root
    oneshot
    disabled
    

    disabled 关键字也已根据另一位 SO 成员的建议添加,但不确定是否有必要。

    另请注意,SElinux 必须设置为permissive 以允许此服务运行,或者必须设置策略以允许该服务运行。有几种技术可以做到这一点。对我有用的一项是将以下行添加到我的设备的 BoardConfig.Mk 文件中

    BOARD_KERNEL_CMDLINE += androidboot.selinux=permissive
    

    并对更新的启动映像进行重建/刷新。

    这篇文章是我发现添加 seclabel 属性的建议的地方。它还包含有关我遇到的 SELinux 问题的更多有用信息:init warning: Service myservice needs a SELinux domain defined. Please fix

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-31
      • 2014-11-10
      • 2016-09-07
      • 2019-10-26
      • 1970-01-01
      • 2021-09-07
      • 1970-01-01
      相关资源
      最近更新 更多