下面是我想为sdm710产品调用AOSP中的init.target.rc的服务。
service dispBridge /system/bin/test.sh
seclabel u:r:init:s0
user root
group root
oneshot
disabled
write /dev/kmsg "dispBridgeServiceStartedTest onBootTest"
on boot
chown system system /sys/class/leds/red/blink
chown system system /sys/class/leds/green/blink
chown system system /sys/class/leds/blue/blink
write /dev/kmsg "onBootTest1"
start dispBridge
write /dev/kmsg "onBootTest2"
在上面的代码中,我期望该服务将在
on boot
内调用,并期望看到 dispBridgeServiceStartedTest onBootTest
在 adb shell 中打印出来。
但是,我只能看到
onBootTest1
和onBootTest2
打印出来,这意味着dispBridgeServiceStartedTest onBootTest
一定被跳过了/服务没有被调用。
我尝试在 BoardConfig.mk 上设置
androidboot.selinux=permissive
,
和 seclabel u:r:init:s0
,根据 Android 在启动时使用 init.rc 运行脚本不起作用。
我尝试使用
start dispBridge
在 adb shell 上手动启动服务,这是使用 adb shell dmesg -w | grep dispBridge
的输出
[ 271.108234] init: Received control message 'start' for 'dispBridge' from pid: 2606 (start dispBridge)
[ 271.109119] init: starting service 'dispBridge'...
[ 271.132498] init: Service 'dispBridge' (pid 2607) exited with status 127
[ 3069.662302] init: Received control message 'start' for 'dispBridge' from pid: 5640 (start dispBridge)
[ 3069.662771] init: starting service 'dispBridge'...
[ 3069.716114] init: Service 'dispBridge' (pid 5641) exited with status 127
当我使用
dmesg | grep -i "avc: denied"
[ 271.122590] type=1400 audit(1730388931.839:21): avc: denied { entrypoint } for pid=2607 comm="init" path="/system/bin/test.sh" dev="dm-0" ino=1215 scontext=u:r:shell:s0 tcontext=u:object_r:system_file:s0 tclass=file permissive=0
[ 3069.693749] type=1400 audit(1730388931.839:21): avc: denied { entrypoint } for pid=2607 comm="init" path="/system/bin/test.sh" dev="dm-0" ino=1215 scontext=u:r:shell:s0 tcontext=u:object_r:system_file:s0 tclass=file permissive=0
[ 3069.694039] type=1400 audit(1730391730.409:22): avc: denied { entrypoint } for pid=5641 comm="init" path="/system/bin/test.sh" dev="dm-0" ino=1215 scontext=u:r:shell:s0 tcontext=u:object_r:system_file:s0 tclass=file permissive=0
参考 init 警告:服务 myservice 需要定义一个 SELinux 域。请修复,我尝试运行此命令
ls -Z /system/bin/test.sh
这是输出
u:object_r:system_file:s0 /system/bin/test.sh
我也不确定是否需要.te文件来设置权限,但我也尝试了
androidboot.selinux=disabled
,但服务仍然没有运行。
我可以寻求帮助来为我指明正确的方向以启用此服务吗?我不太确定问题是什么,老实说,我不知道如何继续,因为我对此很陌生。预先感谢您!
我建议隔离变量并一步步引入复杂性。 SELinux 是 Android 中最复杂的领域之一,但幸运的是它是开源的,因此有很多示例可供参考。
阅读 AOSP 站点上“编写 SELinux 策略”页面上的“标记新服务和地址拒绝”部分:https://source.android.com/docs/security/features/selinux/device-policy#label_new_services_and_address_denials 本节将解释如何为您的应用程序创建一个新域,并确保它在 init 启动时进行转换(在这种情况下,您不需要在 init rc 文件中使用
seclabel
)。
从本机应用程序而不是 shell 脚本开始,因为 shell 脚本引入了另一个变量:shell 二进制文件。本机应用程序应该只执行诸如打印“Hello world”之类的操作并循环睡眠,然后您可以验证应用程序至少开始运行。一旦你开始工作,你就可以访问一些资源,这也需要添加 SELinux 规则。
这是我发现的由 init 启动的服务的 SELinux 规则的随机示例:https://cs.android.com/android/platform/superproject/main/+/main:system/sepolicy/vendor/hal_gnss_default .te
一般来说,纯AOSP中的init服务都不是shell脚本。像 Qualcomm 这样的供应商倾向于在 init 期间使用 shell 脚本,但它有点复杂,所以我建议不要这样做,除非您正在开发一个已经使用 init shell 脚本的项目,在这种情况下您可以遵循他们的示例。