1. 前言
这篇文章是接着我的前一篇编写Android R中HIDL的使用接着写的,上一篇文章中写了一个HIDL的服务,整刷之后通过log发现服务并没有成功的启动,需要解决相关的selinux问题之后才能自启,这篇文章继续解决上次遗留的问题。
2. 给一个新的服务添加selinux权限
首先需要知道selinux的一些基础知识,比如selinux定义的宏:system/sepolicy/public/te_macros
,这里描述了一些我们修改selinux权限需要用到的命令,具体没有深究,也可以麻烦一点通过Android log提供的报错信息进行修改。
2.1 定位当前代码中selinux权限修改的位置
这一步看很多博客底下都有人评论知道要修改哪些文件可是这些文件在什么地方?这里介绍一下查找的方式:
通常selinux放在了Android根目录下的device中;
device的下一级目录就是各个不同的oem厂商目录,如谷歌、TI、联发科、展锐等,根据自己手头硬件定位;
下一级就是工程名称、项目名称等,要选中相应的项目目录进行配置;
也可以在这一级目录进行搜索:
find . -type f -name "file_contexts"
find . -type f -name "hwservice_contexts"
上面命令搜索出来的交集目录通常就是我们需要修改的目录。如我的平台下的:
device/sprd/mpool/module/security/msepolicy/vendor/
找到位置之后剩下的就是修改步骤了.
2.2 添加selinux权限
- 添加当前服务的权限描述文件
# 在该路径下创建新的文件`hal_demo_default.te`并加上如下内容
# 这里的权限可以通过log信息查看之后一点点的添加
type hal_demo_default, domain;
hal_server_domain(hal_demo_default, hal_secure_element);
type hal_demo_default_exec, exec_type, vendor_file_type, file_type;
init_daemon_domain(hal_demo_default);
allow hal_demo_default hwservicemanager_prop:file { read open getattr map };
allow hal_demo_default hwservicemanager:binder { call transfer };
allow hal_demo_default hal_demo_hwservice:hwservice_manager { find add };
allow hal_demo_default hidl_base_hwservice:hwservice_manager { add };
allow hal_demo_default block_device:dir { search write open read };
这一步添加完之后可能会遇到hal_demo_hwservice
报错找不到该类型,需要做如下修改:
- 添加hal_demo_hwservice类型
这一步需要添加到已经存在的hwservice.te
文件中,这个文件需要找一下具体是哪一个,我的在如下路径下:
device/sprd/mpool/sepolicy/vendor/
按照文件中的格式添加如下内容:
type hal_demo_hwservice, hwservice_manager_type;
- 修改file_contexts文件
# 同样的按照文件格式添加上service的相应内容
/vendor/bin/hw/android\.hardware\.demo@1\.0-service u:object_r:hal_demo_default_exec:s0
- 修改hwservice_contexts文件
android.hardware.demo::IDemo u:object_r:hal_demo_hwservice:s0
3. 总结
通常selinux权限的添加就这些步骤,需要为启动的服务加一个新的权限描述文件,剩下的就是在系统原有的文件中加上新的描述,将新的接口添加进去。这里附上一个调试selinux的写的比较好的文档:
selinux权限介绍