Android Q平台上vendor进程访问system属性的一种实现方式

Google的Treble计划实现了system和vendor的分离,目的是降低Android系统的碎片化。初衷是好的,但是实际效果一般,对开发者的影响是限制更多,实现更复杂,系统的运行效率更慢。

突然有一天发现vendor分区中的进程无法访问ro.serialno属性了,研究发现是Treble中的SELinux进行了限制,也是为了实现system和vendor的分离。但是,我们又不能不访问,下面给出了一种实现方式。

以高通平台为例来说明。高通平台的策略路径为 /device/qcom/sepolicy,高通平台和手机厂商的修改通常会放到vendor目录下。

1、新增属性 vendor.serialno。Q平台对新增属性有规定,必须以“ro.vendor.”、“vendor.”、“persist.vendor.” 开头;

2、增加一个rc文件(prop_sync.rc),实现 ro.serialno 和 vendor.serialno 的同步;

新建文件 - /device/qcom/msm8937/prop_sync.rc
on property:ro.serialno=*
    setprop vendor.serialno ${ro.serialno}

在 /device/qcom/msm8937.mk 添加编译
PRODUCT_COPY_FILE += device/qcom/msm8937/prop_sync.rc:/system/etc/init/prop_sync.rc

3、给属性 vendor.serialno 打安全标签;

在 /device/qcom/sepolicy/vendor/property_contexts 中增加如下语句:

vendor.serialno        u:object_r:exported_default_prop:s0

4、添加te策略,使得vendor进程可以访问 vendor.serialno 属性,foo_vendor是vendor进程的安全域;

get_prop(foo_vendor, exported_default_prop) 

5、编译和调试;

make selinux_policy

adb push out/target/product/xx/vendor/etc/selinux/precompiled_sepolicy /vendor/etc/selinux/precompiled_sepolicy
adb push out/target/product/xx/vendor/etc/selinux/vendor_property_contexts /vendor/etc/selinux/vendor_property_contexts
adb reboot

 


版权声明:本文为wangxuguang_原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。