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
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. Android 消息通知栏Notification使用和权限
  2. Android动态权限判断以及动态权限申请
  3. Android 属性动画详解
  4. Android 访问权限许可大全
  5. Android之Bean属性通知类
  6. android 模拟器获取root权限的方法
  7. View的XML 属性大全(官方文档)
  8. 修改Android系统目录的读写权限命令

随机推荐

  1. Android 7.1 Launcher3 支持按键操作显示
  2. android底部菜单栏的实现和百度地图API的
  3. Robolectric使用(四)自定义
  4. Android下的一些调试手段(含kernel调试办
  5. android ViewPager,ViewFlipper,ViewFlow
  6. Android(安卓)Java 获取剪切板的内容,MD5
  7. Android视频处理 --处理视频第一帧缩略图
  8. Android——eclipse共享library以及导出j
  9. Android 只开启一个Activity实例
  10. android 设置EditText和TextView不可见