Android8.1 新增系统自定义服务一 (SELinux权限)

           一开始并没有注意到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 就可以了


 

 

你可能感兴趣的:(android)