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

属性系统是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");
    }
}


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的初始化和架构。




你可能感兴趣的:(android)