Android Property实现介绍

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值