一开始并没有注意到android8.0以后和之前有多大区别,知道最近有需求要求增加一个自定义服务,一直没有生效报avc权限问题
在SystemServer startOthreService中
ServiceManager.addService () 出现了AVC权限:
SELinux: avc denied {add} for service=gesture pid=1274 uid =1000 scontext=u:r:system_server:s0 tcontxt=u:object_r:xxx_service:s0 tclass=service_manager permissive =0
android 8.0之后在只能在device/xxx/sepoilcy中添加avc权限
/sysetm/sepolicy/Android.mk 编译的out生成路径在 out/target/product/xxx/vendor/etc/selinux/
修改方法
一:
修改文件: devices/设备名称/sepolicy/
platform_app.te 增加 : allow platform_app xxx_serivce:service_manager find;
priv_app.te 增加 : allow priv_app xxx_serivce:service_manager find;
radio.te 增加 : allow radio xxx_serivce:service_manager { add find };
service.te 增加 : type xxx_service, service_manager_type;
system_app.te 增加 : allow system_app xxx_serivce:service_manager add;
system_server.te 增加 : allow system_server xxx_serivce:service_manager { add find };
private/service_contexts 增加 : test u:object_r:xxx_service:s0 //test 是Context 中定义的名字
二 :
1. 可以直接在源码根目录下面make -j22
最主要的是system.img 和boot.img
2. 1 ) 在源码目录下面make selinux_policy -j5 更新seploicy策略文件
2) make vendorimage systemimage -j22
3 ) 使用fastboot flash vendor vendor.img
fastboot flash system system .img 刷入
刷完之后可以到 /etc/selinux/plat_service_contexts 看下问题是否改正
--------------------------------------------------------------------------
我用的是pixel xl aosp编译marlin所以不能修改vendor.img 尝试了一个星期
尝试过 :
1. 生成自定义vendor.img
https://blog.csdn.net/u011341111/article/details/83446318
2. 尝试过在init.rc 中copy nonplat_sepolicy.cil到vendor 也失败了
最后通过另外一种方法解决了这个问题: 公司的项目都会生成vendor.img 所以使用上面的修改比较规范
下面提供不用修改devices/设备名称/sepolicy/ *.te 的方法
直接修改 :android-8.1.0_r15/system/sepolicy/private/service_contexts
window u:object_r:window_service:s0
gesture u:object_r:window_service:s0
* u:object_r:default_android_service:s0
gesture 就是Context定义的service name
修改之后需要在源码目录下面make selinux_policy -j11
会生成out/target/product/marlin/system/etc/selinux/plat_service_contexts
把这个文件adb root && adb remount && adb push plat_service_contexts /system/etc/selinux/ 重启手机
或者make systemimage 然后使用fastboot flash system system.img 就可以了