代码在system/core/toolbox/
getprop.c
setprop.c
看code,实际就是调用C code中的接口,getprop也是一样的
#include <cutils/properties.h>
int setprop_main(int argc, char *argv[])
{
if(argc != 3) {
fprintf(stderr,"usage: setprop <key> <value>\n");
return 1;
}
if(property_set(argv[1], argv[2])){
fprintf(stderr,"could not set property\n");
return 1;
}
return 0;
}
以get为例,实际调用native_get
public static String get(String key) {会调用frameworks/base/core/jni/android_os_SystemProperties.cpp
static void SystemProperties_set(JNIEnv *env, jobject clazz,
jstring keyJ, jstring valJ)
{
key = env->GetStringUTFChars(keyJ, NULL);
if (valJ == NULL) {
val = ""; /* NULL pointer not allowed here */
} else {
val = env->GetStringUTFChars(valJ, NULL);
}
err = property_set(key, val);
}
最终还是调用C code的接口property_set
JAVA和命令行最终都是调用C code的接口。
system/core/libcutils/properties.c
在Code里使用了两个宏,三种实现方法:
#if HAVE_LIBC_SYSTEM_PROPERTIES
使用Bionic C中system_properties实现
#include <sys/_system_properties.h>
int property_set(const char *key, const char *value)
{
return __system_property_set(key, value);
}
#elseif HAVE_SYSTEM_PROPERTY_SERVER
以Server的方式实现
#define SYSTEM_PROPERTY_PIPE_NAME "/tmp/android-sysprop"
gPropFd = connectToServer(SYSTEM_PROPERTY_PIPE_NAME);
#else
采用环境变量的方式实现
#endif
在高通的代码中,采用SYSTEM_PROPERTIES的方式实现的,因此只介绍该方法