属性系统是
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系统中,SystemUI是用户界面的重要组成部分,它包含了状态栏、通知栏、快速设置面板等关键元素的实现。Android 4.2.2版本的SystemUI源码为我们提供了深入理解Android UI系统工作原理的宝贵资料。接下来,...
解决undefined reference to `__system_property_get'问题,这是android arm平台64位libc.so,来源路径:/system/lib64/libc.so,具体看文章:http://blog.csdn.net/luoyong123456/article/details/50587417
总结,Android应用获取`SystemProperties`主要通过Java层的`SystemProperties`类和Native层的`system_property_get()`函数。在实际开发中,应根据需求选择合适的方法,并注意权限管理和性能优化。
在Android开发过程中,有时我们需要获取设备的网络接口信息,例如IP地址、子网掩码等。`getifaddrs`和`freeifaddrs`是两个在Unix-like系统中广泛使用的C语言函数,用于获取这些信息。但在Android平台上,由于其基于...
String IMSI = android.os.SystemProperties.get(android.telephony.TelephonyProperties.PROPERTY_IMSI); ``` 2. 获取 IMEI 标识 获取 IMEI 标识可以使用两种方法: 1. 使用 `TelephonyManager` 类: ```java ...
在 system/core/init/init.rc 中的 Main 函数中,有一个 for 循环,其中有一个 handle_property_set_fd() 函数,该函数负责检查权限和执行脚本。我们可以在该函数中添加一些代码来让我们的服务启动。例如,我们可以...
"Android RO属性调试修改(mprop逆向)" Android作为一个流行的移动...通过了解init进程的实现机制和__system_property_update函数的原理,我们可以模拟mprop工具来实现RO属性的修改,从而实现Android应用程序的调试。
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 ...
String IMSI = android.os.SystemProperties.get(android.telephony.TelephonyProperties.PROPERTY_IMSI); ``` (2)使用 TelephonyManager 获取 IMSI 号: ```java TelephonyManager tm = (TelephonyManager) ...
默认情况下, __system_property_get和__system_property_read_callback (API 26+)将被挂在这些包中 com.google.android.gsf com.google.android.gms com.google.android.apps.maps 返回值将被更改 gsm.sim....
on property:sys.boot_completed=1 start tcpadb ``` 通过上述三个步骤,可以实现 Android 8.1 开机自启动 WiFi-Adb 连接服务。该服务可以使得 Android 设备在开机后自动启动 WiFi-Adb 连接服务,从而实现无线连接...
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> Proguard -keep class com.wx.android.common.** { *; } -keepclassmembers class com.wx.android.common.** { *; } -dontwarn ...
Android使用Property Animation System来实现各种动画效果,包括视图的平移、旋转、缩放等。在Launcher3中,屏幕切换动画可能涉及到View的TranslationX和TranslationY属性的改变,以实现左右滑动切换屏幕的效果。...
此函数定义在init_parser.c文件中,并将property_init_action函数添加到特定的列表中以进行属性服务的初始化。 6. 移动安全关注点: 在移动安全方面,对Android属性系统的分析具有特别重要的意义。由于属性系统负责...
These files are optimized for execution within the Dalvik VM, which runs on top of the Android operating system. The use of a VM makes Android applications particularly vulnerable to decompilation. ...
在Android 8.0中,文件系统的拥有权也被详尽地管理,系统分区(/system)、供应商分区(/vendor)、进程文件系统(/proc)、系统文件系统(/sys)、临时文件系统(tmpfs)、根文件系统(Rootfs)、数据分区(/data)...
Adobe Air本机扩展系统属性(Android / IOS) 如果您喜欢我提出的认捐,请: SystemProperties类可以提供一些Adobe无法获得的缺少的属性。 还可以检查IOS是否可以与其他程序一起打开URL。 ...