项目场景:
Android13 EDLA认证 VTS测试 vts_treble_sys_prop_test
问题描述
VTC 测试 vts_treble_sys_prop_test Fail ;报错log如下所示
AssertionError: 7 !=0 : properties in /vendor /etc/selinux/vendor_property_contexts have wrong Property types:
name: persist.xxx., type: u:object_r:exported_system_prop:s0
name: sys.xxx., type: u:object_r:exported_system_prop:so
name: ro.xxx., type: u:object_r:exported_system_prop:s0
name: xxx., type: u:object_r:exported_system_prop:s0
name: ro.vendor.xxx., type: u:object_r:exported_system_prop:s0
name: persist.vendor.xxx., type: u:object_r:exported_system_prop:s0
name: vendor.xxx., type: u:object_r:exported_system_prop:s0
问题分析流程:
1. 按log分析,vendor_property_contexts 存在非法的SELinux 属性定义。
persist.xxx. u:object_r:exported_system_prop:s0
sys.xxx. u:object_r:exported_system_prop:s0
ro.xxx. u:object_r:exported_system_prop:s0
xxx. u:object_r:exported_system_prop:s0
以上为 exported_system_prop类型的自定义属性,在 device\amlogic\common\sepolicy\property_contexts 文件中定义。
2. 编译后发现 device\amlogic\common\sepolicy\property_contexts 下的属性定义会被写到 vendor\etc\selinux\vendor_property_contexts中
3. Google EDLA认证规定,vendor_property_contexts 中的属性定义必须为 vendor_xxx_prop类型(vendor_nfc_prop、vendor_platform_prop、vendor_default_prop等),而自定义的persist.xxx. 、persist.vendor.xxx. 等属性类型为exported_system_prop 类型导致SELinux属性非法问题 vts_treble_sys_prop_test fail。
4. 尝试将自定义的persist.xxx. 、persist.vendor.xxx. 等属性定义为 vendor_platform_prop,发现应用层无法读取自定义属性,会报 RuntimeException: failed to set system property 问题,无权限读写 system property 。
Process: com.xxx.xxxx, PID: 3978
java.lang.RuntimeException: failed to set system property
at android.os.SystemProperties.native_set(Native Method)
at android.os.SystemProperties.set(SystemProperties.java:196)
5. System 层无法读写vendor_xxx_prop 类型的属性,那是不是System层的属性在别的property_contexts 下定义,带着这个疑问全局搜索了property_contexts文件发现,项目中存在多个property_contexts文件。System目录下也有对应sepolicy目录,此目录下的property_contexts文件如下图:
6. system/sepolicy/private/property_contexts 中发现有定义exported_system_prop 类型的属性;此目录下的属性定义在编译时会写到 out\target\product\xxx\system\etc\selinux\plat_property_contexts 目录下
persist.sys.locale u:object_r:exported_system_prop:s0 exact string
persist.sys.timezone u:object_r:exported_system_prop:s0 exact string
persist.sys.test_harness u:object_r:test_harness_prop:s0 exact bool
7. 将自定义属性persist.xxx. 等移植到 system/sepolicy/private/property_contexts 中,编译测试后可解决 VTS测试 vts_treble_sys_prop_test Fail问题,应用层也可以正常读写 system property
解决方案:
将 device\amlogic\common\sepolicy\property_contexts 中自定义的 exported_system_prop 类型属性 移到 system/sepolicy/private/property_contexts中 即可。
总结
1. device\amlogic\common\sepolicy\property_contexts 中定义vendor类型的属性,编译后会将属性定义写入到 vendor\etc\selinux\vendor_property_contexts中。Google要求此文件中的属性类型必须为vendor_xxx_prop类型。
2. system/sepolicy/private/property_contexts 中可定义system类型的属性,译后会将属性定义写入到 system\etc\selinux\plat_property_contexts中
仅个人经验,如有错误,欢迎指出。