1. 程式人生 > >Android8.1 新增系統自定義服務一 (SELinux許可權)

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

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 就可以了