您的位置:首页 > 移动开发 > Android开发

Android System Property分析(1):property接口

2015-11-16 15:41 1186 查看
属性系统是android的一个重要特性,它作为一个服务运行在init中,管理系统配置和状态。

1. 命令行使用property方法:

getprop <key>

// ./system/core/toolbox/getprop.c
if (argc == 1) {
list_properties(); // 没有参数时,调用property_list列出所有的属性。
} else {
// 调用property_get获取属性</span>
property_get(argv[1], value, default_value);
}

setprop <key> <value>

// ./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 <key> <value>

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设置属性</span>

env->ReleaseStringUTFChars(keyJ, key);

if (valJ != NULL) {
env->ReleaseStringUTFChars(valJ, val);
}

if (err < 0) {
jniThrowException(env, "java/lang/RuntimeException",
"failed to set system property");
}
}


4. c层接口

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);


命令行,init command,java最终都调用了c层接口,在分析c层接口的实现之前需要先分析property的初始化和架构。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: