property_get/property_set

本文深入探讨了Android系统中属性的概念、作用及其管理流程,包括属性的存储方式、加载顺序、读写操作和特殊属性类型。阐述了属性服务在系统初始化阶段的配置与实现细节,以及客户端通过libcutils和libc接口获取和设置属性的方法。



每个属性都有一个名称和值,他们都是字符串格式。属性被大量使用在Android系统中,用来记录系统设置或进程之间的信息交换。属性是在整个系统中全局可见的。每个进程可以get/set属性。

 

在系统初始化时,Android将分配一个共享内存区来存储的属性。这些是由“init”守护进程完成的,其源代码位于:device/system/init。“init”守护进程将启动一个属性服务。

 

属性服务在“init”守护进程中运行。每一个客户端想要设置属性时,必须连接属性服务,再向其发送信息。属性服务将会在共享内存区中修改和创建属性。任何客户端想获得属性信息,可以从共享内存直接读取。这提高了读取性能。客户端应用程序可以调用libcutils中的API函数以GET/SET属性信息。libcutils的源代码位于:device/libs/cutils。API函数是:

int property_get(const char *key, char *value, const char *default_value);

int property_set(const char *key, const char *value);

 

而libcutils又调用libc中的 __system_property_xxx 函数获得共享内存中的属性。libc的源代码位于:device/system/bionic。

 

属性服务调用libc中的__system_property_init函数来初始化属性系统的共享内存。当启动属性服务时,将从以下文件中加载默认属性:

 

/default.prop

/system/build.prop

/system/default.prop

/data/local.prop

 

属性将会以上述顺序加载。后加载的属性将覆盖原先的值。这些属性加载之后,最后加载的属性会被保持在/data/property中。

 

特别属性如果属性名称以“ro.”开头,那么这个属性被视为只读属性。一旦设置,属性值不能改变。

 

如果属性名称以“persist.”开头,当设置这个属性时,其值也将写入/data/property。

 

如果属性名称以“net.”开头,当设置这个属性时,“net.change”属性将会自动设置,以加入到最后修改的属性名。(这是很巧妙的。 netresolve模块的使用这个属性来追踪在net.*属性上的任何变化。)

 

属性“ ctrl.start ”和“ ctrl.stop ”是用来启动和停止服务。

 

每一项服务必须在/init.rc中定义.系统启动时,与init守护进程将解析init.rc和启动属性服务。一旦收到设置“ ctrl.start ”属性的请求,属性服务将使用该属性值作为服务名找到该服务,启动该服务。这项服务的启动结果将会放入“ init.svc.<服务名>“属性中 。客户端应用程序可以轮询那个属性值,以确定结果



<think> 首先,用户的问题是关于获取Android中property_getproperty_set的C++样例代码。用户提供了站内引用,我需要参考这些引用,因为它们包含了相关信息。 从引用[1]和[^1]中: - 提到了android.os.SystemProperties类,但用户指定了C++代码。 - 指出property_getproperty_set通过JNI调用Native方法。 从引用[2]和[^2]中: - 详细描述了property_getproperty_set的使用方法。 - 提供了函数原型: - int property_get(const char *key, char *value, const char *default_value); - int property_set(const char *key, const char *value); - 给出了一个C代码示例(虽然用户问C++,但C++中可以兼容C代码): - 包含了一个属性获取的代码片段。 - 提到了编译时需要链接libcutils.so,头文件是<cutils/properties.h>。 从引用[3]和[^3]中: - 重复了函数原型。 用户之前的指令: - 回答结构需清晰,逐步解决问题。 - 保证回答真实可靠。 - 使用中文回答。 - 生成相关问题。 - 引用的段落末尾添加引用标识。 系统级指令: - 行内数学表达式用$...$,但这个问题不涉及数学,所以可能不需要。 - 独立公式用$$...$$,也不相关。 - LaTeX语法正确,但这里主要是代码。 - 生成相关问题。 我的回答结构: 1. **介绍property_getproperty_set**:简要解释它们是什么和在Android中的作用。 2. **提供C++示例代码**:基于引用中的信息,编写一个简单的C++代码示例。 - 包括必要的头文件、库链接。 - 展示如何使用property_getproperty_set。 3. **注意事项**:如权限、编译要求等。 4. **生成相关问题**:在末尾添加相关问题。 示例代码: - 引用[^2]中提供了一个C代码片段,我可以基于那个写一个C++版本。C++中可以利用std::string或char数组。 - 函数原型: - property_get(key, value_buffer, default_value):获取属性值,存储在value_buffer中。 - property_set(key, value):设置属性值。 - 需要#include <cutils/properties.h> - 链接libcutils.so。 完整的C++示例: - 写一个简单的程序,演示设置和获取一个属性。 - 例如,设置一个属性如"my.property",然后获取它。 步骤: 1. 引入头文件。 2. 定义一个字符数组来存储值。 3. 调用property_set设置属性。 4. 调用property_get获取属性。 5. 检查返回值。 权限: - 在Android中,设置属性可能需要root权限或特定权限,因为属性是全局的。 生成相关问题: - 例如: 1. 如何在Android应用中通过JNI调用property_get/property_set? 2. property_get/property_set的安全性考虑是什么? 3. Android系统属性的命名约定有哪些? 确保回答真实可靠: - 基于Android文档:我知道property_getproperty_set是Android系统API的一部分,通常用于系统级开发。 - 引用提供的参考:在相关部分添加引用标识如[^2]。 最终回答框架: - 开头:解释property_get/property_set。 - 中间:提供C++样例代码,用代码块包裹。 - 结尾:注意事项和生成的相关问题。 </think> ### Android中property_get/property_set的C++示例代码 在Android系统中,`property_get`和`property_set`是用于读取和设置系统属性的核心API。这些属性存储在全局共享空间中(如`/data/property`),常用于系统配置、进程间通信或功能开关控制[^2]。以下是一个完整的C++示例代码,演示如何使用这些函数。 #### C++示例代码 ```cpp // 必需的头文件 #include <cutils/properties.h> // property_get/property_set API声明 #include <cstring> // 字符串操作函数 #include <cstdio> // 输入输出函数 int main() { // 定义属性键和值(使用char数组,长度不超过PROPERTY_VALUE_MAX) const char* key = "MY_CUSTOM_PROPERTY"; // 属性键名,建议大写字母和点号命名 char value[PROPERTY_VALUE_MAX] = "\0"; // 存储属性值的缓冲区,默认为空字符串 // 步骤1: 设置属性值(property_set演示) const char* set_value = "123"; // 要设置的值 int set_result = property_set(key, set_value); // 设置属性 if (set_result == 0) { printf("属性设置成功: %s=%s\n", key, set_value); // [^2] } else { printf("属性设置失败: 错误码 %d\n", set_result); } // 步骤2: 获取属性值(property_get演示) int get_result = property_get(key, value, "default"); // 第三个参数为默认值 if (get_result > 0) { // 返回值表示值长度,>0成功 printf("属性获取成功: %s=%s\n", key, value); // 可选:基于值进行逻辑处理 if (strcmp(value, "123") == 0) { printf("属性值为123,触发特定逻辑\n"); // [^2] } } else { printf("属性获取失败: 使用默认值 %s\n", value); // 失败时返回默认值 } return 0; } ``` #### 关键说明 1. **函数原型**(基于引用[^2][^3]): - `int property_set(const char *key, const char *value)`: 设置属性值。返回0表示成功,负数表示错误。 - `int property_get(const char *key, char *value, const char *default_value)`: 获取属性值。返回值是实际字符串长度,失败时使用`default_value`填充。 2. **编译要求**: - 链接`libcutils.so`库:在编译命令中添加`-lcutils`(例如:`g++ example.cpp -o output -lcutils`)[^2]。 - 权限:在Android系统中,设置属性可能需要root权限或`android.permission.ACCESS_SURFACE_FLINGER`等系统权限,否则`property_set`可能失败[^1][^2]。 3. **注意事项**: - **缓冲区大小**:属性值最大长度为`PROPERTY_VALUE_MAX`(通常为250字节),值过长会导致截断。 - **命名规范**:属性键建议使用大写字母和点号(如`WLAN.SWITCH.FLAG`),避免冲突[^2]。 - **安全性**:属性全局可见,不当修改可能导致系统不稳定。建议仅在系统服务或底层代码中使用。 - **替代方案**:在Java层可通过`android.os.SystemProperties`类间接调用这些方法(使用JNI)[^1]。 #### 相关问题 1. 如何在Android应用中通过JNI调用property_getproperty_set? 2. Android系统属性的存储位置和管理机制是怎样的?[^2] 3. property_get/property_set的性能瓶颈有哪些?如何优化频繁的属性读写?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值