在Android 中启动一个新的进程的时候,需要添加相关权限,否则进程无法启动。
以最近添加的BT/WIFI功能进程为例,解决步骤如下:
一、首先设置为permissive模式再启动进程
1.adb shell
setenforce 0 设置为宽容模式
logcat -c 清零logcat 里的log
2.使用QCOM启动相关进程后,再使用QRCT进行进程的通信测试
二、抓取log搜索相关关键字
1.logcat | grep ftmdaemon (也可以使用dmesg | grep ftmdaemon) 查看与启动的该进程所需要的相关权限
logcat 里可能会有如下log报出:
05-19 02:59:38.989 478 478 I hwservicemanage: type=1400 audit(0.0:54): avc: denied { transfer } for scontext=u:r:hwservicemanager:s0 tcontext=u:r:ftmdaemon:s0 tclass=binder permissive=1
05-19 03:00:19.189 4688 4688 I ftmdaemon: type=1400 audit(0.0:55): avc: denied { call } for scontext=u:r:ftmdaemon:s0 tcontext=u:r:hal_bluetooth_default:s0 tclass=binder permissive=1
05-19 03:00:19.199 687 687 I bluetooth@1.0-s: type=1400 audit(0.0:56): avc: denied { call } for scontext=u:r:hal_bluetooth_default:s0 tcontext=u:r:ftmdaemon:s0 tclass=binder permissive=1
05-19 03:00:19.199 4688 4688 I ftmdaemon: type=1400 audit(0.0:57): avc: denied { search } for name="diagchar" dev="sysfs" ino=25033 scontext=u:r:ftmdaemon:s0 tcontext=u:object_r:sysfs_diag:s0 tclass=dir permissive=1
05-19 03:07:55.399 5249 5249 I ftmdaemon: type=1400 audit(0.0:58): avc: denied { dac_override } for capability=1 scontext=u:r:ftmdaemon:s0 tcontext=u:r:ftmdaemon:s0 tclass=capability permissive=1
05-19 03:08:09.339 5249 5249 I ftmdaemon: type=1400 audit(0.0:63): avc: denied { create } for scontext=u:r:ftmdaemon:s0 tcontext=u:r:ftmdaemon:s0 tclass=netlink_generic_socket permissive=1
05-19 03:08:09.339 5249 5249 I ftmdaemon: type=1400 audit(0.0:64): avc: denied { setopt } for scontext=u:r:ftmdaemon:s0 tcontext=u:r:ftmdaemon:s0 tclass=netlink_generic_socket permissive=1
05-19 03:08:09.339 5249 5249 I ftmdaemon: type=1400 audit(0.0:65): avc: denied { bind } for scontext=u:r:ftmdaemon:s0 tcontext=u:r:ftmdaemon:s0 tclass=netlink_generic_socket permissive=1
05-19 03:08:09.339 5249 5249 I ftmdaemon: type=1400 audit(0.0:66): avc: denied { getattr } for scontext=u:r:ftmdaemon:s0 tcontext=u:r:ftmdaemon:s0 tclass=netlink_generic_socket permissive=1
05-19 03:08:09.339 5249 5249 I ftmdaemon: type=1400 audit(0.0:67): avc: denied { write } for scontext=u:r:ftmdaemon:s0 tcontext=u:r:ftmdaemon:s0 tclass=netlink_generic_socket permissive=1
05-19 03:08:09.339 5249 5249 I ftmdaemon: type=1400 audit(0.0:68): avc: denied { read } for scontext=u:r:ftmdaemon:s0 tcontext=u:r:ftmdaemon:s0 tclass=netlink_generic_socket permissive=1
2.分析log
以 05-19 02:59:38.989 478 478 I hwservicemanage: type=1400 audit(0.0:54): avc: denied { transfer } for scontext=u:r:hwservicemanager:s0 tcontext=u:r:ftmdaemon:s0 tclass=binder permissive=1为例
denied { transfer } 资源访问的操作 transfer
scontext=u:r:hwservicemanager:s0 操作主体 hwservicemanager
tcontext=u:r:ftmdaemon:s0 操作客体 ftmdaemon
tclass=binder permissive=1 操作客体所属类别binder
3.根据以上log可以看出,需要在以下两个路径下
\device\qcom\sepolicy\legacy\vendor\common
\device\qcom\sepolicy\generic\vendor\common
ftmdaemon.te文件中添加如下权限(也可以再此目录下任意选择一个te文件添加,因为最后会编译汇总到一个文件):
#============= ftmdaemon ==============
allow ftmdaemon hal_bluetooth_default:binder call;
allow ftmdaemon self:capability dac_override;
allow ftmdaemon self:netlink_generic_socket { write getattr setopt read bind create };
allow ftmdaemon sysfs_diag:dir search;
#============= hal_bluetooth_default ==============
allow hal_bluetooth_default ftmdaemon:binder call;
注:也可以添加如下修改,直接授予关于ftmdaemon进程的所有权限
userdebug_or_eng(` permissive ftmdaemon; ')
这里编辑TE控制语句格式为 : rule_name source_type target_type : class perm_set
rule: 控制类型, 分为:allow 以及 audit
source_type:也叫subject,通常是domain,可以是一组subject,用{}包含起来。
target_type: 代表请求的资源的类型,可以是一组target,用{}包含起来。
class perm_set: 代表对资源访问的操作,perm_set可以是一组,用{}包含起来。
注:一般出现的带有dac_override的那条log可以不管,dac_override 拒绝事件意味着违规进程正在尝试使用错误的 unix user/group/world 权限访问某个文件。正确的解决方案几乎从不授予 dac_override 权限,而是更改相应文件或进程的 unix 权限。有些域(例如init、vold 和 installd)确实需要能够替换 unix 文件权限才能访问其他进程的文件。 — — 来自 google官方文档 <授予 dac_override 权限 >
三、重新编译安卓即可,需要更新 super.img 和 userdata.img
把编译产生的新的镜像文件刷入模块,在不setenforce 0 情况下,再次启动进程,使用QRCT 进行进程通信验证权限是否添加完毕。