我之前编写了一个独立的守护进程,用于访问自定义设备 (/dev/mydev0)。查看AOSP源代码后,我发现需要在以下文件中设置策略才能使其正常工作:
新建文件 device.te 包含:
type mydev_device, dev_type;
新建一个名为mydevsrvc.te的文件,其中包含以下内容:
# service flash_recovery in init.rc
type mydevsrvc_type, domain;
type mydevsrvc_type_exec, exec_type, file_type;
init_daemon_domain(mydevsrvc_type)
allow mydevsrvc_type mydev_device:chr_file rw_file_perms;
编辑file_contexts以添加:
/dev/mydev[0-9]* u:object_r:mydev_device:s0
编辑service_contexts以添加:
mydevsrvc u:object_r:mydevsrvc_type:s0
通过编辑init.flo.rc文件来启动守护进程,添加以下行:
service mydevsrvc /system/bin/mydevsrvc
class main
user system
group system
seclabel u:r:mydevsrvc_type:s0
oneshot
现在,我需要在Android应用程序中访问设备,所以我必须将守护进程更改为 Android 系统服务。
我可以使用 BOOT_COMPLETED 意图启动服务(线程),如上一个问题中所解释的那样。
我无法弄清如何设置 SELinux 策略,使此 Java 服务也能够访问 dev 文件。
[更新] 我继续使用特权守护程序来实现这一目的。我的 Java 服务通过套接字连接到守护程序。我没有更好的解决方案。