其实之前就接触过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进行读写。

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

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

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




android_Id 什么情况下变化 android id属性_Android


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


android_Id 什么情况下变化 android id属性_加载_02


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

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

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

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


android_Id 什么情况下变化 android id属性_android_Id 什么情况下变化_03


直接看截图内容就好,不解释了。