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/
并重启设备。
- 修改策略文件后,执行