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