aosp开发中,遇到从上层做开关,hal层做判断的需要,比如控制摄像头使用。这时候就需要找一个属性可以在java和c c++ 层同时操作的属性,系统学习了下属性存储,在此记录!
1. 什么是 SystemProperties
SystemProperties 是 Android 系统提供的一种键值对存储机制,用于管理全局配置属性。这些属性通常用于控制系统行为、硬件功能或调试选项。它们在系统启动时由 init 进程加载,并在运行时可被修改(视权限而定)。
- 存储位置: 属性通常存储在内存中,部分持久化属性(如以 persist. 开头的)会保存到文件中(例如 /data/property/)。
- 访问方式: 提供 Java 和 C/C++ 两种 API,分别用于应用层和原生层。
- 权限: 系统属性分为只读和读写属性,修改通常需要系统权限(root 或 system 用户)。
2. Java 层:SystemProperties 类
2.1 原理
在 Java 层,SystemProperties 是 Android SDK 提供的一个工具类,位于 android.os.SystemProperties 包中。它通过 JNI(Java Native Interface)调用底层的 C/C++ 属性服务(property_service),间接与 Android 的属性系统交互。
- 底层实现: 调用 libandroid_runtime.so 中的 native 方法,最终映射到 libcutils 的 property_get 和 property_set 函数。
- 权限限制: 在普通应用中,SystemProperties.set 可能因权限不足而失败,通常需要系统签名或运行在系统进程中。
2.2 API
- 读取: SystemProperties.get(String key, String def)
- key: 属性名。
- def: 默认值(若属性不存在则返回)。
- 返回: 属性值的字符串。
- 写入: SystemProperties.set(String key, String value)
- key: 属性名。
- value: 要设置的值。
2.3 示例代码
import android.os.SystemProperties;
public