属性系统是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.cint 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的初始化和架构。




更多相关文章

  1. Android(安卓)Wifi模块分析(三)
  2. Android中dispatchDraw分析
  3. Android四大基本组件介绍与生命周期
  4. Android(安卓)Service AIDL
  5. Android调用天气预报的WebService简单例子
  6. Android开发——Android搜索框架(二)
  7. android打电话发短信
  8. android 拨打紧急号码,通话时开启免提功能实现
  9. Android调用.NET Webservice报org.ksoap2.serialization.SoapPri

随机推荐

  1. Android接口定义语言(AIDL)
  2. Android xml资源文件中@、@android:type
  3. android动态墙纸有关问题
  4. Android架构组件三 Android Architecture
  5. ANDROID Porting系列一、ANDROID编译系统
  6. Android shape图形
  7. Android Drawable Resources系列6:
  8. 13、Android的多线程与异步任务
  9. android 中文粗体
  10. Android文件的读写