Android中Property模块的键值设置

所属分类: 软件编程 / Android 阅读数: 36
收藏 0 赞 0 分享

Android中Property模块的键值设置

Prop模块是保存少量的全局共享信息,其保存的数据具有信息量少,跨进程共享数据等特性;每一条信息包含两个属性,键名和键名对应的键值,例如:

ro.product.locale.language=en

“Ro.product.locale.language”表示本产品本地语言,表示该条信息的名字,“en”表示该条信息的取值为英文,这样任何一个应用程序就知道本机使用的语言情况。在接口设计时也需要有两个参数,name和value(键名和键值),方法有set和get,例如:

Set(String name,String value);
String Get(String name);

当然,无论上层怎么设计,在C底层键名name和键值value都是以char数组进行保存的,因为设计者并不知道传入name和value的数据大小。

在android.os.SystemProperties类中对prop模块进行了封装,该类使用Set和Get直接进行设置和获取,当然这些java接口最终还是调用系统接口完成的。在jni层有一个property_service.c文件,文件中有对应的实际处理接口,这些接口即可以给java调用,也可以一些系统命令使用(例如setprop和getprop命令就是调用这些接口方法)。SystemProperties类中的get方法没有什么限制,但是set方法就有权限的限制,应用程序是不能随便使用set接口的。

SystemProperties类的访问必须要有系统权限,并且应用的uid必须是系统id:1000或者为root:0。因为set和get操作不同,set时该操作建立了一个socket管道通过发cmd出去完成的,服务端接收cmd同时比较权限,关键代码如下:

if (uid == AID_SYSTEM || uid == AID_ROOT)
  return check_control_mac_perms(name, sctx);

只有权限是AID_SYSTEM(系统ID)和AID_ROOT(root用户ID)才能通过验证;而get没有权限检查,不过试想也正常,如果谁都能进行修改,那这黑客也太好当了。当然个人觉得,对于set的设计使用权限验证无可厚非,但对于查看系统属性这样的功能(get),应该还可以进行细分,比如有些属性是不重要的,任何进程和用户都可以读取使用;当然有些敏感的数据在指定读取权限时也可以进行指定(由于时间有限本人没有更深入的细读,也不知道android系统是否完成了这些功能)。

设置键值名时需要注意的地方

在进行设置时,包含两个参数,变量名和变量值,形如:[[key]]: [[value]]。如果原来没有对应的key值,那么就会在该模块中创建一个新的键值,否则覆盖原有键值。对于键值名在设计时最好按规范书写,比如“类名.模块.用途”,这样清晰可记而且不容易冲突。另外,如果属性名称以“ro.”开头,那么这个属性被视为只读属性。一旦设置,属性值不能改变。这个判断动作是在property_service.c中的property_set函数中完成的:

if(!strncmp(name, "ro.", 3)) return -1;

如果是以“persist.”开头,当设置这个属性时,其值也将写入/data/property/目录中,键值名就是该属性名,下次开机重新加载和读取该属性;该文件中的load_persistent_properties函数就是用来完成该功能。特别的属性名以“net.change”开头那么其值中必须以“net.”开头,例如键值名为[net.change]: 那么键值为[net.qtaguid_enabled],这个设置目前还没想到有什么作用。

Shell中对应的prop操作命令

在android的shell中也有对应的命令进行操作,有如下三个命令:

  • getprop [keyname] Keyname为需要获取的键值名,如果没有参数则打印全部的键值信息。
  • setprop [keyname] [value] Keyname为需要获取的键值名,value为设置的值,这个值为字符串。
  • watchprops 监听系统属性的变化,如果期间系统的属性发生变化则把变化的值显示出来。

在init.rc中也使用setprop来设置一些属性状态。

补充setprop:

Property模块的键值设置

Prop模块是保存少量的全局共享信息,其保存的数据具有信息量少,跨进程共享数据等特性;每一条信息包含两个属性,键名和键名对应的键值。“Ro.product.locale.language”表示本产品本地语言,表示该条信息的名字,“en”表示该条信息的取值为英文,这样任何一个应用程序就知道本机使用的语言情况。

Android终端属性prop操作的底层实现

在init.c文件中main函数中会调用start_property_service(),而它分别调用load_properties_from_file函数读取PROP_PATH_SYSTEM_BUILD(/system/build.prop)、PROP_PATH_SYSTEM_DEFAULT(/system/default.prop)和PROP_PATH_LOCAL_OVERRIDE(/data/local.prop)存放系统属性的文件并设置到系统属性。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

更多精彩内容其他人还在看

Android网络编程之获取网络上的Json数据实例

这篇文章主要介绍了Android网络编程之获取网络上的Json数据实例,本文用完整的代码实例讲解了在Android中读取网络中Json数据的方法,需要的朋友可以参考下
收藏 0 赞 0 分享

Android中的windowSoftInputMode属性详解

这篇文章主要介绍了Android中的windowSoftInputMode属性详解,本文对windowSoftInputMode的9个属性做了详细总结,需要的朋友可以参考下
收藏 0 赞 0 分享

Android网络编程之UDP通信模型实例

这篇文章主要介绍了Android网络编程之UDP通信模型实例,本文给出了服务端代码和客户端代码,需要的朋友可以参考下
收藏 0 赞 0 分享

Android中使用ListView实现漂亮的表格效果

这篇文章主要介绍了Android中使用ListView实现漂亮的表格效果,本文用详细的代码实例创建了一个股票行情表格,需要的朋友可以参考下
收藏 0 赞 0 分享

Android中刷新界面的二种方法

这篇文章主要介绍了Android中刷新界面的二种方法,本文使用Handler、postInvalidate两种方法实现界面刷新,需要的朋友可以参考下
收藏 0 赞 0 分享

Android SDK三种更新失败及其解决方法

这篇文章主要介绍了Android SDK三种更新失败及其解决方法,需要的朋友可以参考下
收藏 0 赞 0 分享

Android学习笔记——Menu介绍(一)

Android3.0(API level 11)开始,Android设备不再需要专门的菜单键。随着这种变化,Android app应该取消对传统6项菜单的依赖。取而代之的是提供anction bar来提供基本的用户功能
收藏 0 赞 0 分享

Android学习笔记——Menu介绍(二)

这次将继续上一篇文章没有讲完的Menu的学习,上下文菜单(Context menu)和弹出菜单(Popup menu)
收藏 0 赞 0 分享

Android学习笔记——Menu介绍(三)

今天继续昨天没有讲完的Menu的学习,主要是Popup Menu的学习,需要的朋友可以参考下
收藏 0 赞 0 分享

Android显示网络图片实例

这篇文章主要介绍了Android显示网络图片的方法,以实例形式展示了Android程序显示网络图片的方法,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多