android properties分析(2) 应用层 properties设置和获取接口分析

命令行 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的方式实现的,因此只介绍该方法

你可能感兴趣的:(android properties分析(2) 应用层 properties设置和获取接口分析)