Android 8.1厂商服务注册ServiceManager失败问题及注册方法咨询
兄弟,我之前踩过一模一样的坑!Android 8.1之后SELinux的权限管控直接上了个台阶,你贴的这个avc denied日志已经把问题说得明明白白——你的media.stream服务被默认归到了default_android_service上下文,但SELinux只认plat_service_contexts里预定义的服务类型,所以直接给你拦了。我当时是这么解决的,一步步来:
第一步:给服务指定专属SELinux上下文
找到系统源码里的system/sepolicy/public/plat_service_contexts文件(如果是厂商定制系统,可能在device/[你的厂商名]/[机型]/sepolicy目录下),添加一行映射规则:media.stream u:object_r:media_stream_service:s0这里的
media_stream_service是咱们给这个服务自定义的SELinux类型名,你可以根据服务功能调整,但要保证语义清晰,别和系统已有的类型重名。第二步:定义服务类型的SEPolicy规则
打开system/sepolicy/public/service.te(或者厂商自定义的sepolicy规则文件),添加该服务类型的声明:type media_stream_service, system_api_service, service_manager_type;其中
system_api_service和service_manager_type是必备属性,确保ServiceManager能识别并允许这个类型的服务注册。第三步:给服务进程添加注册权限
找到你的服务进程对应的SELinux域配置文件(比如你的进程域是np_mediastream,对应的文件就是np_mediastream.te),添加允许该进程向ServiceManager添加服务的规则:allow np_mediastream media_stream_service:service_manager add;这一步是让你的进程拥有操作这个专属服务类型的权限,对应日志里的
{ add }操作。第四步:编译并验证修改
完成上述修改后,需要重新编译SEPolicy或者整个系统。如果只想单独编译SEPolicy,可以用这条命令:make sepolicy之后把生成的
sepolicy文件替换到设备的/sys/fs/selinux/目录下(需要root权限),或者直接刷入完整的系统镜像。重启设备后再尝试注册服务,应该就能成功了。
额外提醒:有些厂商会在
device目录下的sepolicy文件里覆盖公共规则,所以一定要确认你修改的是生效的配置文件。另外,修改SELinux规则后最好做全面的权限测试,避免引发其他意想不到的权限问题。
内容的提问来源于stack exchange,提问作者Nancy.Zhang

