1.使用目的
目的都是为了测试。
减少编译流程。提高测试效率
2.使用方法流程
2.1 初始化默认值
方法一.
配置文件进行配置。
方法二.
手动初始化
bash
setprop test.prop.id 1
2.2 获取键值并
c++
property_get
2.3 配置头文件
c++
<cutils/properties.h>
3.注意事项
3.1 关于无法设置属性 test_flag 的权限问题分析及解决方案
问题原因 (重 - - 命名规则)
错误 PROP_ERROR_PERMISSION_DENIED (0x18) 表明当前进程 缺乏修改该属性的权限,通常由以下原因导致:
-
SELinux 策略限制
Android 从 5.0 开始强制启用 SELinux,若属性操作未在 SELinux 策略文件中声明权限,即使应用具备
system或root权限也会被拒绝。 -
属性命名规则不合法
- 以
ro.开头的属性为只读属性,不可修改。 - 自定义属性需符合系统前缀规范(如
persist.sys.、vendor.等),否则默认策略可能禁止写入。
- 以
-
进程权限不足
仅
system或root进程可通过property_set修改属性值,普通应用需声明android:sharedUserId="android.uid.system"并使用平台签名。
解决方案
1. 检查并修正 SELinux 策略
-
Step 1:添加属性上下文
在
property_contexts文件中将属性关联到合法的安全上下文(如system_prop):texttest_flag u:object_r:system_prop:s0 -
Step 2:配置进程的 SELinux 权限
在进程的
.te文件(如hal_test_ztt.te)中添加权限声明:textset_prop(hal_test_ztt, system_prop) get_prop(hal_test_ztt, system_prop)若属性需自定义类型(如
test_prop),需在property_contexts和.te文件中同步定义。 -
Step 3:绕过
neverallow规则(可选)若遇到
neverallow规则冲突(如default_prop),需在domain.te中添加例外或改用自定义属性类型。
2. 规范属性命名
- 若属性需持久化,使用
persist.前缀(如persist.sys.test_flag)。 - 避免与系统内置属性冲突,建议添加唯一标识符(如
vendor.test_flag.test.flag)。
3. 提升进程权限
- 对于系统应用 :
在AndroidManifest.xml中声明android:sharedUserId="android.uid.system",并使用平台签名。 - 对于 Root 设备 :
通过su提权后操作,但需注意商业版本可能禁用此方式。
4. 临时调试方法
-
关闭 SELinux 强制模式(仅限调试):
bashadb shell setenforce 0此操作重启后失效,不可用于生产环境。
验证步骤
-
检查 SELinux 日志
通过
adb shell dmesg | grep avc查看权限拒绝的详细上下文,确认是否缺少set_prop权限。 -
测试属性读写
bashadb shell setprop test_flag "false" # 尝试设置 adb shell getprop test_flag # 验证值是否生效 -
编译并刷写 SELinux 策略
- 修改策略文件后,执行
make selinux_policy。 - 将生成的
*.sepolicy文件推送至/vendor/etc/selinux/并重启设备。
- 修改策略文件后,执行