命令行 properties设置和获取接口分析
代码在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; }
Java code properties设置和获取的接口:
以get为例,实际调用native_get
public static String get(String key) { if (key.length() > PROP_NAME_MAX) { throw new IllegalArgumentException("key.length > " + PROP_NAME_MAX); } return native_get(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
C code properties设置和获取的接口:
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的方式实现的,因此只介绍该方法 |