属性系统是
android
的一个重要特性。它作为一个服务运行,管理系统配置和状态。所有这些配置和状态都是属性。每个属性是一个键值对(
key/value pair
),其类型都是字符串。
从功能上看,属性与
windows
系统的注册表非常相似。许多
android
应用程序和库直接或者间接地依赖此特性,以决定它们的运行时行为。例如,
adbd
进程查询属性服务已确认当前是否运行在模拟器环境中。另一个例子是
java.io.File.pathSpearator
,其返回存储于属性服务中的值。
属性系统是如何工作的
属性系统的上层架构如下图所示。
图中有
3
个进程、一组永久属性文件和一块共享内存区域。共享内存区域是所有属性记录的存储所在。只有属性服务进程才可以写入共享内存区域,它负责从永久文件中加载属性记录并将它们保存在共享内存中。
consumer
进程将共享内存加载到其自身的虚拟地址空间并直接访问这些属性。
setter
进程同样将共享内存加载到其自身的虚拟地址空间,但其不能直接写该内存。当
setter
试图增加或者更新一个属性时,它将该属性通过
unix domain socket
发送至属性服务。属性服务代表
setter
进程将该属性写入共享内存和永久文件中。
属性服务运行于
init
进程中。
init
进程首先创建一个共享内存区域,并保存一个指向该区域的描述符
fd
。
init
进程将该区域通过使用了
MAP_SHARED
标志的
mmap
映射至它自身的虚拟地址空间,这样,任何对于该区域的更新对于所有进程都是可见的。
fd
和区域大小被存储在一个名为
ANDROID_PROPERTY_WORKSPACE
的变量中。任何其他进程,比如
consumer
和
setter
将使用这个变量来获得
fd
和尺寸,这样它们就能
mmap
这个区域到它们自身的虚拟地址空间中。该共享内存区域如下图所示。
在这之后,
init
进程将从下列文件加载属性:
/default.prop
/system/build.prop
/system/default.prop
/data/local.prop
下一步是启动属性服务。在这一步中,一个
unix
domain socket
服务被创建。此
socket
的路径是
/dev/socket/property_service
,该路径对于其他客户端进程是熟知的。最后,
init
进程调用
poll
来等待该
socket
上的连接事件。
在
consumer
一边,当它初始化
libc
(
bionic/libc/bionic/libc_common.c
__libc_init_common
函数),它将从环境变量中返回
fd
和尺寸,并映射共享内存到其自身的地址空间(
bionic/libc/bionic/system_properties.c __system_properties_init
函数)。在这之后,
libcutils
可以想读取普通内存那样为
consumer
读取属性。
目前,属性是不能够被删除的。也就是说,一旦添加了一个属性,它将不能够被删除,其键也不能够被改变。
如何读取
/
设置属性
Android
上有三种主要途径来
get/set
属性。
1、
native code
当编写本地应用程序时,可以使用
property_get
和
property_set
这两个
API
来读取
/
设置属性。要使用它们,我们需要
include cutils/properties.h
,并链接
libcutils
库。
2、
java code
在
Java
包(
java.lang.System
)中提供有
System.getProperty
和
System.setProperty
方法。但值得注意的是,尽管这两个
API
在语义上等同
native
函数,但其将数据存储于完全不同的位置。实际上,
dalvik VM
使用一个哈希表来存储这些属性。所以,用这两个
API
存储的属性是独立的,不能存取
native
属性,反之亦然。
然而
Android
有一个内部隐藏类(
@hide
,对
SDK
不可见)
android.os.SystemProperties
来操纵
native
属性。其通过
jni
来存取
native
属性库。
3、
shell
脚本
Android
提供
getprop
和
setprop
命令行工具来获取和更新属性。其依赖
libcutils
实现。
以上翻译自http://rxwen.blogspot.com/2010/01/android-property-system.html,有修正。
补充:通过查看
property_service.c
,我们可以明确以下事实:
1、
属性名不是随意取的。在
property_perms
数组中定义了当前系统上可用的所有属性的前缀,以及相对应的存取权限
UID
。对属性的设置要满足权限要求,同时命名也要在这些定义的范围内。
2、
PA_COUNT_MAX
指定了系统(共享内存区域中)最多能存储多少个属性。
3、
PROP_NAME_MAX
指定了一个属性的
key
最大允许长度;
PROP_VALUE_MAX
则指定了
value
的最大允许长度。
此外,http://blog.csdn.net/tekkamanitachi/archive/2009/06/18/4280982.aspx 这篇文章翻译了Android的官方文档,从另一个角度叙述了属性系统,需要者请参看。
分享到:
相关推荐
Android system property运作流程源码分析
9 Android Property System 38 10 Build ALSA with Android's tool chain 40 11 Disable Android screen saver 44 12 Hack Android SD Card support 45 13 How to add permission for device node 46 14 Input Event...
NULL 博文链接:https://u010837360.iteye.com/blog/2054680
解决undefined reference to `__system_property_get'问题,这是android arm平台64位libc.so,来源路径:/system/lib64/libc.so,具体看文章:http://blog.csdn.net/luoyong123456/article/details/50587417
SystemProperty-Setting-APP Environment: Android Studio / Android 5.0 Description: This app is the system app, which need to be build in android framework or be signed. And this app is the example ...
默认情况下, __system_property_get和__system_property_read_callback (API 26+)将被挂在这些包中 com.google.android.gsf com.google.android.gms com.google.android.apps.maps 返回值将被更改 gsm.sim....
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> Proguard -keep class com.wx.android.common.** { *; } -keepclassmembers class com.wx.android.common.** { *; } -dontwarn ...
on the Android File System 285 Creating Manageable User Preferences 286 Creating a Preference Resource File 287 Using the PreferenceActivity Class 289 Organizing Preferences with Headers 291 Learning ...
以下是 Android 手机 build.prop 信息,可同时在java 和 NDK获取到 下面是通过 adb shell cat /system/build.prop 获取到的信息 # begin build properties开始设置系统性能 # autogenerated by buildinfo.sh{通过...
Adobe Air本机扩展系统属性(Android / IOS) 如果您喜欢我提出的认捐,请: SystemProperties类可以提供一些Adobe无法获得的缺少的属性。 还可以检查IOS是否可以与其他程序一起打开URL。 ...
A video recoder examplecolorConversion: a color conversion example with assembly to speed upPropertyAnimation: demo apps for the Android-3.0 and above property animation system. FrameAni
解决undefined reference to `__system_property_get'问题,这是android x86_64平台64位libc.so
This book is intended for developers and engineers with some familiarity of operating system concepts as implemented by Linux. A basic background in C code would be helpful. Their positions range from...
第3章围绕init进程,介绍了如何解析init.rc以启动Zygote和属性服务(property service)的工作原理。 第4章剖析了zygote和system_server进程的工作原理。本章的拓展思考部分讨论了Andorid的启动速度、虚拟机...
9.1.2 System Property 207 9.1.3 Android系统信息实例 208 9.2 Android Apk应用信息获取之Package Manager 209 9.2.1 Package Manager 210 9.3 Android Apk应用信息获取之Activity Manager 215 9.4 解析...
主要根据ro.secure 以及 ro.debuggable 等system property 来控制。 默认即档ro.secure 为0 时,即开启root 权限,为1时再根据ro.debuggable 等选项来确认是否可以用开启root 权限。为此如果要永久性开启adb 的root ...
Locating a Device Using Global Positioning System and Network/WiFi Technology AIR and Android Reverse Geocoding Maps EXIF Data and the Map Object The speed Property Conclusion Chapter 11 : Microphone...
Locating a Device Using Global Positioning System and Network/WiFi Technology AIR and Android Reverse Geocoding Maps EXIF Data and the Map Object The speed Property Conclusion Chapter 11 : Microphone...
Locating a Device Using Global Positioning System and Network/WiFi Technology AIR and Android Reverse Geocoding Maps EXIF Data and the Map Object The speed Property Conclusion Chapter 11 : Microphone...