您的位置:首页 > 移动开发 > Android开发

Android 系统属性的点滴

2016-01-12 22:48 537 查看
其实之前就接触过Android的系统属性相关的一些知识,只是已经很久没用过了,差不多都忘光了。

最近遇到了点问题,只好翻下之前的笔记,以及在网上找些资料来加深下了解。

--------------------------

关于Android系统属性的几点:

Android的属性系统:

1,每个属性都有一个名称和值,他们都是字符串格式

2,用来记录系统设置或进程之间的信息交换。

3,android分配一个共享内存区来存储的属性,属性是在整个系统中全局可见的

4, 每个进程可以get/set属性, set是通过向init进程发出请求,又init去完成,get可以直接读取共享内存

属性的格式: 以点分格式,可以自己定义,但以下为特殊属性

属性名称以"ro."开头,那么这个属性被视为只读属性。一旦设置,属性值不能改变

属性名称以"persist."开头,当设置这个属性时,其值也将写入/data/property/

属性名称以"net."开头,当设置这个属性时,"net.change"属性将会自动修改,用于记录最新被修改的以net.开头的属性

属性"ctrl.start"和"ctrl.stop"是用来启动和停止服务

系统中默认的属性文件/代码:

/default.prop

/system/build.prop

/system/default.prop

/data/local.prop

以上文件一般只有前两个,后两个没有

属性将会以上述顺序加载。后加载的属性将覆盖原先的值。这些属性加载之后,

最后加载的属性会被保持在/data/property/目录中中。

/default.prop : 系统默认的属性,一般都在根文件系统目录的顶层

ro.secure=0

ro.allow.mock.location=1

ro.debuggable=1

persist.sys.usb.config=mass_storage,adb

/system/build.prop: 系统编译的属性,主要记录编译时间,编译主机,编译平台,以及dvm的信息,

由Makefile自动生成

/data/property/:

persist.sys.country persist.sys.localevar

persist.sys.language persist.sys.profiler_ms

修改和查看属性的方法:

命令和shell脚本中:

getprop <属性名>

setprop <属性名><<属性值>

代码:

java:

System.getProperty()

System.setProperty()

c/c++ :

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

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

启动服务:

property_set("ctrl.start", "dhcpcd_p2p");

----------------------------

我目前接触到的是/system/build.prop,而我想做的就是自定义个prop,然后在可以通过代码对该prop进行读写。

最初测试的时候,定义了个 persist.xxx,然后发现在代码中只能是读到该值,无法写入值,当然也没报错。

后面还是找了很多的资料,关键是也没找到个好的解决方法,连反射调用都尝试了。

不过还好 在 stackoverflow(http://stackoverflow.com/questions/27611738/what-linux-permissions-are-needed-for-systemproperties-set-to-work-android)
上总算找到了最终的原因(下面是截图)



有了上面的线索,马上到Android源码上找下property_service.c
瞧瞧





上面的内容就是property_service.c
的内容截图,源码路径在 是 /system/core/init/property_service.c

那我们现在就知道了,在property_service.c
中是定义了property项中相应字段的权限。所以我最初尝试的persist.XXX是由于权限问题,而如果想实现在代码中可以读和写property相应项的话,默认的debug.XXX 就有这个权限,最终我也是使用这种方法。还有一种方法就是,可以修改下property_service.c 中的相应字段的权限,不过我还没去尝试验证,只是觉得应该可以。

下面再看下perprty_service.c 中定义相应字段的权限用的AID_RADID、AID_SYSTEM 是在哪里定义的。

直接看system/core/include/private/android_filesystem_config.h



直接看截图内容就好,不解释了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: