注意:我是 SELinux 政策的初学者,并遵循Android 的 vndservicemanager
我有一个在 BootComplete 接收器上启动的 java 服务(MyService)。现在我在 MyService.java 的 onCreate 中将 myservice 添加到 ServiceManager。
ServiceManager.addService(mysystemservice, mybinder);
根据高音架构,我通过在应用程序的 Android.mk 中添加以下内容将我的应用程序移动到供应商映像分区。
LOCAL_VENDOR_MODULE := true
我对 OEM SELinux 策略进行了以下更改,之前它是为系统服务编写的,因为我将应用程序移至供应商,因此对供应商服务进行了更改,提供旧的和当前的 SE 策略。
创建上下文“my_service”
老的
在private/service_contexts
mysystemservice u:object_r:my_service:s0
现在
在vendor/common/vndservice_contexts
mysystemservice u:object_r:my_service:s0
定义的服务类型
老的
在public/service.te
type my_service, service_manager_type;
现在
在vendor/common/vndservice.te
type my_service, vndservice_manager_type;
现在给予添加权限
老的
在public/servicemanager.te
allow system_app my_service:service_manager add;
现在
在abc.te
type abc, domain;
type abc_exec, exec_type, vendor_file_type, file_type;
init_daemon_domain(abc)
vndbinder_use(abc)
binder_call(abc, system_app)
add_service(abc, my_service)
allow abc my_service:service_manager find;
allow abc my_service:service_manager add;
经过上述更改并提供完整构建后,我可以看到我的服务上下文是 out/product/target/vendor/etc/selinux/vndservice_contexts..inplace 的一部分 out/product/target/system。
但是一旦 Myservice.java 尝试在 ServiceManager 中添加“mysystemservice”
ServiceManager.addService(mysystemservice, mybinder);
我得到以下 **avc denied ** 错误
E/SELinux: avc: denied { add } for service=mysystemservice pid=7588 uid=1000 scontext=u:r:system_app:s0 tcontext=u:object_r:default_android_service:s0 tclass=service_manager permissive=0 2019-11-14 12 :44:39.613 592-592/? E/ServiceManager: add_service('mysystemservice',b0) uid=1000 - 权限被拒绝
正如我们在上面的日志中看到的,目标上下文采用默认“ tcontext=u:object_r:default_android_service:s0 ”代替“ my_service ”
注意:如果我保留系统映像的更改一切正常,唯一的问题是当我将 SE 策略更改移动到供应商时。
如果我错过了什么或任何其他方式是添加服务,请告诉我。