以下分析以android 4.03为基础

前言

Android的系统属性相当于windows的注册表,由key和value组成,且都是核心系统的一个基本机制。相对于windows的注册表,Android的系统属性要简单一些,它没有windows注册表的树状结构,而只是一个列表,也就是说没有父子关系。value有string,int,long,boolean,但是设置只能通过字符串方式。

Android 的系统属性包括两部分:文件保存的持久属性和每次开机导入的cache属性。前者主要保存在下面几个文件中(目录下):

/default.prop

/system/build.prop

/system/default.prop

/data/local.prop

/data/property目录下的所有presist属性(以presist.开头)

后者则通过API方式使用。

一、接口

1. JAVA层接口:

包名:android.os

类名:SystemProperties,为隐藏类

接口:

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)

其key长度不能超过31字,val不超过91字

文件:

frameworks/base/core/java/android/os/SystemProperties.java

2.JNI接口

在android_os_SystemProperties.cpp定义,在frameworks/base/core/jni/AndroidRuntime.cpp中注册JNI

3.本地接口

接口:

int property_get(const char *key, char *value, const char *default_value)

/* property_set: returns 0 on success, < 0 on failure

*/

int property_set(const char *key, const char *value)

int property_list(void (*propfn)(const char *key, const char *value, void *cookie), void *cookie)

文件:

system/core/include/cutils/properties.h

system/core/libcutils/properties.c

4. 底层bionic内部接口

除非想修改系统属性机制,可以分析一下

int __system_property_get(const char *name, char *value);

int __system_property_set(const char *key, const char *value);

const prop_info *__system_property_find(const char *name);

int __system_property_read(const prop_info *pi, char *name, char *value);

const prop_info *__system_property_find_nth(unsigned n);

文件:

bionic/libc/include/sys/system_properties.h

bionic/libc/include/sys/_system_properties.h

bionic/libc/bionic/system_properties.c

5. init.rc接口

原始rc文件有

system/core/rootdir/init.rc

device/vendor/platformname/init.devicename.rc

编译后在跑到out/target/product/platformname/root/下

做成image后在out/target/product/platformname/ramdisk.img,有可能由于平台不一样,文件名不一样

设备运行后就是在根目录下的一些init*.rc文件

在init.rc我们可以设置属性,监听属性变化

setprop key value

on property:key=value

do_your_work

实现:

property的处理在init进程中,相关文件

system/core/init/property_service.c

system/core/init/property_service.h

入口函数start_property_service及property_init、load_persist_props

1. 通讯机制:

property_set有两套实现,一套接口3:本地接口的实现,会调用接口4:中的 __system_property_set,__system_property_set通过本地SOCKET: “/dev/socket/property_service” 与init进程中properties服务通讯。

在init进程的system/core/init/property_service.c(h)代码中有另一套property_set实现,仅用于init进程。

2. 安全实现:

设置key的value时,需要作鉴权,根据设置程序所在进程的fd获知uid值,比如system server进程可以设置net打头的key,不可以设置gsm打头的key,相关的定义如下:

权限定义system/core/include/private/android_filesystem_config.h

#define AID_ROOT             0  /* traditional unix root user */

#define AID_SYSTEM        1000  /* system server */

#define AID_RADIO         1001  /* telephony subsystem, RIL */

#define AID_DHCP          1014  /* dhcp client */

#define AID_SHELL         2000  /* adb and debug shell user */

#define AID_CACHE         2001  /* cache access */

#define AID_APP          10000 /* first app user */

属性权限表在system/core/init/property_service.c定义,采用白名单方式

struct {

const char *prefix;

unsigned int uid;

unsigned int gid;

} property_perms[] = {

{ "net.rmnet0.",      AID_RADIO,    0 },

{ "net.gprs.",        AID_RADIO,    0 },

{ "net.ppp",          AID_RADIO,    0 },

{ "net.qmi",          AID_RADIO,    0 },

{ "net.lte",          AID_RADIO,    0 },

{ "net.cdma",         AID_RADIO,    0 },

{ "ril.",             AID_RADIO,    0 },

{ "gsm.",             AID_RADIO,    0 },

{ "persist.radio",    AID_RADIO,    0 },

{ "net.dns",          AID_RADIO,    0 },

{ "sys.usb.config",   AID_RADIO,    0 },

{ "net.",             AID_SYSTEM,   0 },

{ "dev.",             AID_SYSTEM,   0 },

{ "runtime.",         AID_SYSTEM,   0 },

{ "hw.",              AID_SYSTEM,   0 },

{ "sys.",             AID_SYSTEM,   0 },

{ "service.",         AID_SYSTEM,   0 },

{ "wlan.",            AID_SYSTEM,   0 },

{ "dhcp.",            AID_SYSTEM,   0 },

{ "dhcp.",            AID_DHCP,     0 },

{ "debug.",           AID_SHELL,    0 },

{ "log.",             AID_SHELL,    0 },

{ "service.adb.root", AID_SHELL,    0 },

{ "service.adb.tcp.port", AID_SHELL,    0 },

{ "persist.sys.",     AID_SYSTEM,   0 },

{ "persist.service.", AID_SYSTEM,   0 },

{ "persist.security.", AID_SYSTEM,   0 },

{ NULL, 0, 0 }

};

通过check_perms函数来检查权限

下面是服务控制权限

struct {

const char *service;

unsigned int uid;

unsigned int gid;

} control_perms[] = {

{ "dumpstate",AID_SHELL, AID_LOG },

{ "ril-daemon",AID_RADIO, AID_RADIO },

{NULL, 0, 0 }

};

通过check_control_perms函数来检查权限

3. 监听变化

在修改属性的时候,会通过函数property_changed通知init触发init.rc中的trigger。

4. 属性特殊处理:

1. ctl.开头的属性是控制属性,用于控制系统的本地服务

ctl.start

ctl.stop

ctl.restart

使用语法

ctl.xxx servicename[:args]

2. ro.开头的属性不能被修改;

3. net.开始的属性(除net.change外)设置,将引发net.change=key的属性设置,被bionic/libc/netbsd/resolv/res_state.c中的代码处理(通过__system_property_find函数);

4. persist.开始的属性,如果在init.rc和代码中设置,将会被写到/data/property目录下;

related post

related postandroid services 一、简介 service是android应用4种组件之一,是没有界面的在后台运行的服务。 service有两种形式 1. 启动的(Started) 通过应用组件的接口startService()启动,服务启动后独立运行。 2. 绑定的(Bound) 通过应用组件的接口bindService()启动,提供CS方式的进程间通讯,在所有绑定的组件解除绑定后,服务退出。 这两种形式可以单独也可以同时存在于一个service上。...

Android 调试技术 一、JAVA层单步调试 参见“用eclipse单步调试Laucher” 参见“用eclipse编译调试adnroid的Browser” 二、Native层单步调试 参见“使用GDB 单步调试Android本地代码” 三、JAVA层堆栈打印 1. 在指定的函数内打印相关java调用 Log.d(TAG,Log.getStackTraceString(new...

android 2.3 应用管理机制分析 分析目的 为了分析内存不足时,android如何选择需要被杀死的应用的机制。改进以达到避免重要应用不被杀死。 一、架构   二、ActivityManagerService中应用等级 Android应用优先级及内存限制 Procss Priority Name ActivityManagerService...

android 2.3启动分析—init进程 前言 Android init进程作为android系统的第一个进程,有设置环境、启动各种android本地服务(不同于android service)、android精子进程,监测android本地服务状态,设备状态,系统属性设置改变事件,击键事件及Log等功能。 Android修改了linux init的配置机制,添加了android本地服务管理功能。android本地服务管理包括服务依赖、重启等机制。 一、Init启动顺序分析 1. init首先分析从kernel传入的参数,可能有以下的参数 qemu...

Android mirror制作及相关使用 1. mirror的制作 #su - git #curl http://android.git.kernel.org/repo >~/bin/repo #chmod a+x...

android 监测属性值变化,Android 的系统属性(SystemProperties)分析 | Bob's Blo...相关推荐

  1. angular生命周期钩子ngOnChanges-父组件使子组件输入属性值变化时触发

    触发条件: 父组件使子组件输入属性值变化时才会调用,子组件自己改变输入属性的值不会调用 @input属性(输入属性)发生变化时,会调用 当输入属性为对象时,当对象的属性值发生变化时,不会调用 当对象的 ...

  2. java属性监听_Java event事件监听属性值变化 demo

    1.定义一个 ValueChangedEvent ValueChangedEvent用于在设置属性值的时候,触发事件. package org.teamlet; import java.util.Ev ...

  3. 跨域 · 后台设置:头部header(服务器端添加属性、属性值,浏览器端获取属性及其值) - 数据篇

    跨域 · 后台设置:头部header自定义属性 (服务器端添加属性.属性值,浏览器端获取属性及其值) headers 服务端配置 # For more information on configura ...

  4. JQuery属性选择器(属性值是变量、多属性选择)

    结论: 1.属性值是变量时,$("div[属性 = "+变量+"]"):2.属性值是变量时,$(`div[属性 = ${变量}`):3.多属性选择器时,$(&q ...

  5. Android 使用反射机制获取或设置系统属性(SystemProperties)

    网上有很多介绍,但是感觉比较混乱!由于自己能力有限,只做一些简单易懂的介绍. 一.获取和设置SystemProperties属性的代码 下面是通过反射来获取和设置系统属性的代码 public fina ...

  6. android监控指纹信息变化,android监听指纹变化(解决反射思路在android10不生效的问题)...

    前天偶尔运行代码,一个段异常映入眼帘,我擦android10上反射机制监听不到指纹id等数据了,原因是android10彻底抛弃了之前指纹的api.所以反射不到了. 怎么解决这个问题?我们换个思路当然 ...

  7. android按钮点击变化,Android实现按钮点击效果(第一次点击变色,第二次恢复)...

    1.首先创建一个按钮 android:id="@+id/click" android:layout_width="fill_parent" android:la ...

  8. php 按钮的属性值,HTML button标签的属性有哪些

    HTML button的属性有:autofocus.disabled.form.formaction.formenctype.formmethod.formnovalidate.formtarget. ...

  9. java 操作属性值_java反射机制根据属性名获取属性值的操作

    一.考虑安全访问范围内的属性,没有权限访问到的属性不读取 /** * 根据属性名获取属性值 * * @param fieldName * @param object * @return */ priv ...

最新文章

  1. 《Java疯狂讲义》(第3版)学习笔记 2 - Java语言的运行机制
  2. 计算机专业体系 网易云,计算机系统结构 (二) 计算机主要系统构成
  3. 三层架构—实践篇(.Net登录实例)
  4. linux过滤脚本中的字段,Shell脚本中常用的文本过滤命令
  5. 自由自在休闲食品引领时尚潮流
  6. Indy10收发Hotmail邮件
  7. Python 二叉树实现
  8. 新思科技与台积电开发基于N4P制程的最广泛IP核组合
  9. 在IT界取得成功应该知道的10件事(ZT)
  10. 拓端tecdat|R语言广义线性模型GLM、多项式回归和广义可加模型GAM预测泰坦尼克号幸存者
  11. 林正隆(coolfire)
  12. java正则表达式结尾_java 正则表达式
  13. 用计算机将复数转换成角度,卡西欧FX-991ES计算器能计算电路里的复数加减乘除然后换算成角度吗?...
  14. tumblr_使用Tumblr创建美丽且易于更新的博客
  15. cocos ClippingNode 之绘制六边形战力(一)
  16. The application bundle does not contain a valid identifier
  17. Pinta 1.6发布!在 Ubuntu 和 Linux Mint 上安装
  18. xcode真机调试--添加iOS最新版本-添加最新的 DeveloperDiskImage
  19. ctfshow 爆破 web21-web28
  20. 计算机丢s7aregsx.dll,打开STEP7 显示:S7aregsx.dll 文件丢失-工业支持中心-西门子中国...

热门文章

  1. 三,天猫精灵SDK驱动开发板LED
  2. Java项目结构及路径
  3. 概率论总结(五):极限理论之大数定律、中心极限定理、概率收敛
  4. 机械转嵌入式开发需要学什么东西?嵌入式软件工程师学习路线
  5. python-定时给指定微信女朋友发送天气预报和每日一句自动聊天抢红包抢票
  6. Mbus新增主动报警功能,简单问题的波折路程。
  7. 完美解决Windows10安装HCL模拟器各种疑难问题!!!
  8. MySQL 6:MySQL存储过程、存储函数
  9. Git 设置用户名和邮箱
  10. Sentinel 相关知识点整理