1. property应用例子
Java:
import android.os.SystemProperties;
SystemProperties.get("persist.sys.usb.config", "mtp,adb");
SystemProperties.getBoolean("ro.adb.secure", false);
SystemProperties.set("sys.usb.config", config);
SystemProperties.set需要有system权限,可以这么做
a. 在Android.mk中,加上LOCAL_CERTIFICATE :=platform
b. 在AndroidManifest.xml中,加上android:sharedUserId="android.uid.system"

Native C:
#include <cutils/properties.h>
LOCAL_SHARED_LIBRARIES := \
libcutils

int property_set(const char *key, const char *value)
int property_get(const char *key, char *value, const char *default_value)
property_set("service.adb.root", "1");
property_get("ro.debuggable", value, "")

2. 设置属性的调用过程
SystemProperties.set in Java
set frameworks/base/core/java/android/os/SystemProperties.java
native_set(key, val)
SystemProperties_set frameworks/base/core/jni/android_os_SystemProperties.cpp
property_set /system/core/libcutils/properties.c

setprop in .rc/.sh file
setprop_main system/core/toolbox/setprop.c
property_set /system/core/libcutils/properties.c

property_set /system/core/libcutils/properties.c
HAVE_LIBC_SYSTEM_PROPERTIES #define HAVE_LIBC_SYSTEM_PROPERTIES 1 in build/core/combo/include/arch/linux-arm/AndroidConfig.h
__system_property_set bionic/libc/bionic/system_properties.c
send_prop_msg(PROP_MSG_SETPROP)
handle_property_set_onfd(case PROP_MSG_SETPROP) system/core/init/property_service.c
检查权限
if "ctl." 开头 handle_control_message() system/core/init/init.c
ctrl.start msg_start() 启动service
ctrl.stop msg_stop() 停止service
ctrl.restart msg_restart() 重启service
else property_set()
如果能找到且以ro开头,就返回-1;能找到且不以ro开头调用 __system_property_update()
如果找不到则调用__system_property_add()
如果是"net."开头,调用property_set("net.change", name)
如果以"persist."开头,调用write_persistent_property();
property_changed(name, value);
除了"persist."开头的property,关机后值会消失;以"persist."开头的会保存在/data/property目录下一文件里,可以看write_persistent_property()

3. 属性的初始值
从下面一些文件可以得到属性的初始值
void start_property_service(void)
{
...
load_properties_from_file(PROP_PATH_SYSTEM_BUILD);
load_properties_from_file(PROP_PATH_SYSTEM_DEFAULT);
load_override_properties();
/* Read persistent properties after all default values have been loaded. */
load_persistent_properties();
...
#define PROP_PATH_RAMDISK_DEFAULT "/default.prop"
#define PROP_PATH_SYSTEM_BUILD "/system/build.prop"
#define PROP_PATH_SYSTEM_DEFAULT "/system/default.prop"
#define PROP_PATH_LOCAL_OVERRIDE "/data/local.prop"

4. 属性的权限
如果是serice, 调用check_control_perms()检查权限,可以看看control_perms[]
如果是其他属性,调用check_perms()检查权限,可以看看property_perms[]

5. property_changed() system/core/init/init.c
void property_changed(const char *name, const char *value)
{
if (property_triggers_enabled)
queue_property_triggers(name, value);
}

queue_property_triggers()
action_add_queue_tail(act)

设置完属性后,会调用on property相应的action, 可以看看init.rc

更多相关文章

  1. ListView的一些属性设置
  2. [Android] Android(安卓)Tweened Animations动画使用详解二
  3. Android(安卓)编译流程解析01-AppPlugin初始化
  4. android EditText 不自动弹出键盘的方法
  5. EditText光标不显示问题
  6. Android(安卓)自定义设置文本字体间间距
  7. android WebView 应用内点击超链接不调用系统浏览器
  8. Android(安卓)电话的反射调用机制实现静默接听电话
  9. android竖向进度条简单实现

随机推荐

  1. andriod 获得机型信息
  2. Android培训班(30)
  3. android 摇一摇功能程序的注意事项
  4. Android中SharedPreferences的使用
  5. Android4.0 隐藏虚拟按键 实现全屏
  6. android 组件生命周期
  7. android studio 中好用的插件————你
  8. Android马赛克效果MosaicView
  9. android 文本切换 TextSwicher
  10. GitHub上不错的Android开源项目(三)