属性系统是android的一个重要特性,它作为一个服务运行在init中,管理系统配置和状态。
1. 命令行使用property方法:
getprop
// ./system/core/toolbox/getprop.c
if (argc == 1) {
list_properties(); // 没有参数时,调用property_list列出所有的属性。
} else {
// 调用property_get获取属性
property_get(argv[1], value, default_value);
}
setprop
// ./system/core/toolbox/setprop.c
// 调用property_set设置属性
if(property_set(argv[1], argv[2])){
fprintf(stderr,"could not set property\n");
return 1;
}
2. init.rc中使用property方法:
setprop
setprop命令对应的函数为do_setprop,此函数先调用expand_props对“{}”进行处理,然后调用property_set设置属性
int do_setprop(int nargs, char **args){
// 处理{}
ret = expand_props(prop_val, value, sizeof(prop_val));
property_set(name, prop_val);
return 0;
}
示例:setprop sys.usb.state ${sys.usb.config}
3. java层使用property方法:
./frameworks/base/core/java/android/os/SystemProperties.java中定义了操作property的java层接口
public static String get(String key, String def);
public static int getInt(String key, int def);
public static long getLong(String key, long def);
public static boolean getBoolean(String key, boolean def);
public static void set(String key, String val);
具体实现都调用./frameworks/base/core/jni/android_os_SystemProperties.cpp中的native方法来实现。
static jint SystemProperties_get_int(JNIEnv *env, jobject clazz,
jstring keyJ, jint defJ){
len = property_get(key, buf, ""); // 调用property_get获取属性值
error:
return result;
}
static void SystemProperties_set(JNIEnv *env, jobject clazz,
jstring keyJ, jstring valJ){
err = property_set(key, val); // 调用property_set设置属性
env->ReleaseStringUTFChars(keyJ, key);
if (valJ != NULL) {
env->ReleaseStringUTFChars(valJ, val);
}
if (err < 0) {
jniThrowException(env, "java/lang/RuntimeException",
"failed to set system property");
}
}
int property_get(const char *key, char *value, const char *default_value);
/* property_set: returns 0 on success, < 0 on failure
*/
// ./system/core/libcutils/properties.c
int property_set(const char *key, const char *value);
int property_list(void (*propfn)(const char *key, const char *value, void *cookie), void *cookie);