`

Android property system

阅读更多

         属性系统是 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运作流程源码分析

    Android system property运作流程源码分析

    Android 代码分析

    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...

    Android System Property

    NULL 博文链接:https://u010837360.iteye.com/blog/2054680

    android arm平台64位libc.so

    解决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:APK,用于设置系统属性

    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 ...

    Riru-LocationReportEnabler:Riru模块。 通过钩子启用位置报告system_property_get

    默认情况下, __system_property_get和__system_property_read_callback (API 26+)将被挂在这些包中 com.google.android.gsf com.google.android.gms com.google.android.apps.maps 返回值将被更改 gsm.sim....

    一个简单的开源Android工具类库

    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> Proguard -keep class com.wx.android.common.** { *; } -keepclassmembers class com.wx.android.common.** { *; } -dontwarn ...

    Introduction.to.Android.Application.Development(4th,2013.12) pdf

    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 NDK 获取手机部分信息 build.prop

    以下是 Android 手机 build.prop 信息,可同时在java 和 NDK获取到 下面是通过 adb shell cat /system/build.prop 获取到的信息 # begin build properties开始设置系统性能 # autogenerated by buildinfo.sh{通过...

    SystemProperties:Adobe Air本机扩展系统属性

    Adobe Air本机扩展系统属性(Android / IOS) 如果您喜欢我提出的认捐,请: SystemProperties类可以提供一些Adobe无法获得的缺少的属性。 还可以检查IOS是否可以与其他程序一起打开URL。 ...

    Android代码-Android学习

    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

    android x86_64平台64位libc.so

    解决undefined reference to `__system_property_get'问题,这是android x86_64平台64位libc.so

    Exploring SE for Android 无水印书签修正版pdf

    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...

    深入理解Android:卷I--详细书签版

     第3章围绕init进程,介绍了如何解析init.rc以启动Zygote和属性服务(property service)的工作原理。  第4章剖析了zygote和system_server进程的工作原理。本章的拓展思考部分讨论了Andorid的启动速度、虚拟机...

    android群雄传

    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 解析...

    Android 实现永久性开启adb 的root权限

    主要根据ro.secure 以及 ro.debuggable 等system property 来控制。 默认即档ro.secure 为0 时,即开启root 权限,为1时再根据ro.debuggable 等选项来确认是否可以用开启root 权限。为此如果要永久性开启adb 的root ...

    developing android application with adobe air.part1

    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...

    developing android application with adobe air.part4.rar

    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...

    developing android application with adobe air.part3.rar

    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...

Global site tag (gtag.js) - Google Analytics