基本信息 本文基于Amloigc T972平台代码,其中:
Android Version: 9 API-Level: 28
读者需要注意,不同的API-Level有较大不同,而且可能与AOSP有轻微的差别。
一、接口
1.1 libcutils
对于大部分native进程来说使用这个接口。
1.1.1 property_get
- 客户代码
#include <cutils/properties.h> // ... if(!(property_get("ro.product.hwid", value, NULL) > 0)) { DEVICE_LOG("read %s property Failed\n", name); return -1; } // ...
- 实现
// system/core/libcutils/properties.cpp // ... int property_get(const char *key, char *value, const char *default_value) // ...
1.1.2 property_set
- 客户代码
#include <cutils/properties.h> // ... property_set("service.bootanim.exit", "0"); // ...
- 实现
// system/core/libcutils/properties.cpp // ... int property_set(const char *key, const char *value) // ...
其中调用更低层的__system_property_set。
1.2 bionic
libcutils调用bionic
1.2.1 __system_property_get
- 客户代码
#include <sys/system_properties.h> // ... char buf[PROPERTY_VALUE_MAX] = ""; int len = __system_property_get("ro.build.type", buf); // ...
- 实现
// bionic/libc/bionic/system_property_api.cpp // ... int __system_property_get(const char* name, char* value) // ...
1.2.2 __system_property_set
该接口的客户代码就比较多了,具体可以参考AndroidXRef:Searched +full:__system_property_set +(path:c path:cpp) (Results 1 - 6 of 6) sorted by relevance 下面列举几个常见的客户代码,有兴趣的读者可以继续追踪。
- 客户代码-1: setprop
// external/toybox/toys/android/setprop.c #include <sys/system_properties.h> // ... if (__system_property_set(name, value)) error_msg("failed to set property '%s' to '%s'", name, value); // ...
- 客户代码-2: start
// external/toybox/toys/android/start.c #include <sys/system_properties.h> // ... for (; *ss; ss += direction) if (__system_property_set(property, *ss)) error_exit("failed to set property '%s' to '%s'", property, *ss); // ...
- 客户代码-3: libcutils
// system/core/libcutils/properties.cpp #include <sys/system_properties.h> // ... int property_set(const char *key, const char *value) // ...
对应之前libcutils的接口。
- 实现
// bionic/libc/bionic/system_property_set.cpp // ... int __system_property_set(const char* key, const char* value) // ...
二、协议版本
2.1 kProtocolVersion1(1)
旧的版本中不支持过长的name和value。
if (g_propservice_protocol_version == kProtocolVersion1) {
// Old protocol does not support long names or values
if (strlen(key) >= PROP_NAME_MAX) return -1;
if (strlen(value) >= PROP_VALUE_MAX) return -1;
prop_msg msg;
memset(&msg, 0, sizeof msg);
msg.cmd = PROP_MSG_SETPROP;
strlcpy(msg.name, key, sizeof msg.name);
strlcpy(msg.value, value, sizeof msg.value);
return send_prop_msg(&msg);
}
2.2 kProtocolVersion2(2)
新版本协议仅支持’ro.’开头的属性的值,超过PROP_VALUE_MAX(92)的限制。
// New protocol only allows long values for ro. properties only.
if (strlen(value) >= PROP_VALUE_MAX && strncmp(key, "ro.", 3) != 0) return -1;
2.3 property service version
GaeUHD:/ # getprop ro.property_service.version
2
在Amlogic T972中该值为2。
| 微博 weibo.com/liuxk99