Android(安卓)System Property分析(1):property接口
16lz
2022-08-04
属性系统是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.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的初始化和架构。
更多相关文章
- Android(安卓)Wifi模块分析(三)
- Android中dispatchDraw分析
- Android四大基本组件介绍与生命周期
- Android(安卓)Service AIDL
- Android调用天气预报的WebService简单例子
- Android开发——Android搜索框架(二)
- android打电话发短信
- android 拨打紧急号码,通话时开启免提功能实现
- Android调用.NET Webservice报org.ksoap2.serialization.SoapPri