Android 在启动时使用 init.rc 运行脚本不起作用

Rin*_*001 6 linux android init linux-kernel

我正在尝试运行一个在设备完成启动时执行的脚本。此特定设备不支持从 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
Run Code Online (Sandbox Code Playgroud)

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

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

echo hi >> /data/local/tmp/test.txt
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Rin*_*001 5

通过运行命令,dmesg | grep -C5 initAsic我发现返回了此错误代码

service initAsic does not have a SELinux domain defined
Run Code Online (Sandbox Code Playgroud)

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

service initAsic2 /data/local/tmp/runn.sh
seclabel u:r:init:s0
user root
group root
oneshot
disabled
Run Code Online (Sandbox Code Playgroud)

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

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

BOARD_KERNEL_CMDLINE += androidboot.selinux=permissive
Run Code Online (Sandbox Code Playgroud)

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

这篇文章是我找到添加 seclabel 属性的建议的地方。它还提供了有关我遇到的 SELinux 问题的更多有用信息:init warning: Service myservice need a SELinux domain Defined。请修复