
属性系统
-
2023年2月27日发(作者:电子稳定程序系统)【转】Android的系统属性(SystemProperties)分析
BobsBlog
Android的系统属性(SystemProperties)分析
以下分析以android4.03为基础
前言
Android的系统属性相当于windows的注册表,由key和value
组成,且都是核心系统的一个基本机制。相对于windows的注册表,
Android的系统属性要简单一些,它没有windows注册表的树状结构,
而只是一个列表,也就是说没有父子关系。value有string,int,
long,boolean,但是设置只能通过字符串方式。
Android的系统属性包括两部分:文件保存的持久属性和每次开
机导入的cache属性。前者主要保存在下面几个文件中(目录下):
•/
•/system/
•/system/
•/data/
•/data/property目录下的所有presist属性(以presist.开头)
后者则通过API方式使用。
一、接口
层应用接口:
perty(“key”,default”);
perty(“key”,”value”);
内部接口:
包名:
类名:SystemProperties,为隐藏类
接口:
•publicstaticStringget(Stringkey,Stringdef)
•publicstaticintgetInt(Stringkey,intdef)
•publicstaticlonggetLong(Stringkey,longdef)
•publicstaticbooleangetBoolean(Stringkey,booleandef)
•publicstaticvoidset(Stringkey,Stringval)
其key长度不能超过31字,val不超过91字
文件:
•frameworks/base/core/java/android/os/SystemProperties.j
ava
接口
在android_os_定义,在
frameworks/base/core/jni/中注册JNI
3.本地接口
接口:
•intproperty_get(constchar*key,char*value,constchar
*default_value)
•/*property_set:returns0onsuccess,<0onfailure
•*/
•intproperty_set(constchar*key,constchar*value)
•intproperty_list(void(*propfn)(constchar*key,constchar
*value,void*cookie),void*cookie)
文件:
•system/core/include/cutils/properties.h
•system/core/libcutils/properties.c
4.底层bionic内部接口
除非想修改系统属性机制,可以分析一下
•int__system_property_get(constchar*name,char*value);
•int__system_property_set(constchar*key,constchar
*value);
•constprop_info*__system_property_find(constchar
*name);
•int__system_property_read(constprop_info*pi,char*name,
char*value);
•constprop_info*__system_property_find_nth(unsignedn);
文件:
•bionic/libc/include/sys/system_properties.h
•bionic/libc/include/sys/_system_properties.h
•bionic/libc/bionic/system_properties.c
接口
原始rc文件有
•system/core/rootdir/
•device/vendor/platformname/
编译后在跑到out/target/product/platformname/root/下
做成image后在
out/target/product/platformname/,有可能由于平台
不一样,文件名不一样
设备运行后就是在根目录下的一些init*.rc文件
在我们可以设置属性,监听属性变化
setpropkeyvalue
onproperty:key=value
do_your_work
7.命令行接口
#setpropkeyvalue
#getpropkey
实现:
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值,比如systemserver进程可以设置net打头的key,不可
以设置gsm打头的key,相关的定义如下:
权限定义
system/core/include/private/android_filesystem_config.h
#defineAID_ROOT0/*traditionalunixrootuser*/
#defineAID_SYSTEM1000/*systemserver*/
#defineAID_RADIO1001/*telephonysubsystem,RIL
*/
#defineAID_DHCP1014/*dhcpclient*/
#defineAID_SHELL2000/*adbanddebugshelluser*
/
#defineAID_CACHE2001/*cacheaccess*/
#defineAID_APP10000/*firstappuser*/
属性权限表在system/core/init/property_service.c定义,采用
白名单方式
struct{
constchar*prefix;
unsignedintuid;
unsignedintgid;
}property_perms[]={
{"0.",AID_RADIO,0},
{".",AID_RADIO,0},
{"",AID_RADIO,0},
{"",AID_RADIO,0},
{"",AID_RADIO,0},
{"",AID_RADIO,0},
{"ril.",AID_RADIO,0},
{"gsm.",AID_RADIO,0},
{"",AID_RADIO,0},
{"",AID_RADIO,0},
{"",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},
{"",AID_SHELL,0},
{"",AID_SHELL,0},
{".",AID_SYSTEM,0},
{"e.",AID_SYSTEM,0},
{"ty.",AID_SYSTEM,0},
{NULL,0,0}
};
通过check_perms函数来检查权限
下面是服务控制权限
struct{
constchar*service;
unsignedintuid;
unsignedintgid;
}control_perms[]={
{"dumpstate",AID_SHELL,AID_LOG},
{"ril-daemon",AID_RADIO,AID_RADIO},
{NULL,0,0}
};
通过check_control_perms函数来检查权限
3.监听变化
在修改属性的时候,会通过函数property_changed通知init触
发中的trigger。
4.属性特殊处理:
.开头的属性是控制属性,用于控制系统的本地服务
•
•
•t
使用语法
vicename[:args]
.开头的属性不能被修改;
.开始的属性(除外)设置,将引发
=key的属性设置,被
bionic/libc/netbsd/resolv/res_state.c中的代码处理(通过
__system_property_find函数);
t.开始的属性,如果在和代码中设置,将会被写到
/data/property目录下;