《Android Property>>

Android属性系统详解
本文深入介绍了Android系统中的属性系统,包括属性的定义、用途及如何通过C和Java API进行操作。此外,还详细阐述了属性服务的工作原理及其与共享内存(Ashmem)的交互过程。


每个属性都有一个名称和值,他们都是字符串格式。属性被大量使用在Android系统中,用来记录系统设置
或进程之间的信息交换。属性是在整个系统中全局可见的。每个进程可以get/set属性。
在系统初始化时,Android将分配一个共享内存区来存储的属性。这些是由“init”守护进程完成的,其源代
码位于:device/system/init。“init”守护进程将启动一个属性服务。属性服务在“init”守护进程中运行。
每一个客户端想要设置属性时,必须连接属性服务,再向其发送信息。属性服务将会在共享内存区中修改和
创建属性。任何客户端想获得属性信息,可以从共享内存直接读取。这提高了读取性能。
客户端应用程序可以调用libcutils中的API函数以GET/SET属性信息。libcutils的源代码位于:device
/libs/cutils。API函数是:
int property_get(const char *key, char *value, const char *default_value);
int property_set(const char *key, const char *value);
而libcutils又调用libc中的 __system_property_xxx 函数获得共享内存中的属性。libc的源代码位
于:device/system/bionic。
属性服务调用libc中的__system_property_init函数来初始化属性系统的共享内存。当启动属性服务时,
将从以下文件中加载默认属性:
/ default.prop
/system/build.prop
/system/default.prop
/data/local.prop
属性将会以上述顺序加载。后加载的属性将覆盖原先的值。这些属性加载之后,最后加载的属性会被保持在
/data/property中。
特别属性
如果属性名称以“ro.”开头,那么这个属性被视为只读属性。一旦设置,属性值不能改变。
如果属性名称以“persist.”开头,当设置这个属性时,其值也将写入/data/property。
如果属性名称以“net.”开头,当设置这个属性时,“net.change”属性将会自动设置,以加入到最后修改的
属性名。(这是很巧妙的。 netresolve模块的使用这个属性来追踪在net.*属性上的任何变化。)
属性“ ctrl.start ”和“ ctrl.stop ”是用来启动和停止服务。每一项服务必须在/init.rc中定义.系统启动时,
与init守护进程将解析init.rc和启动属性服务。一旦收到设置“ ctrl.start ”属性的请求,属性服务将使用该
属性值作为服务名找到该服务,启动该服务。这项服务的启动结果将会放入“ init.svc.<服务名>“属性中
。客户端应用程序可以轮询那个属性值,以确定结果。
Android toolbox程序
Android toolbox程序提供了两个工具: setprop和getprop获取和设置属性。其使用方法:
getprop <属性名>
setprop <属性名><<属性值>
Java
在Java应用程序可以使用System.getProperty()和System.setProperty()函数获取和设置属性。
Action
默认情况下,设置属性只会使"init"守护程序写入共享内存,它不会执行任何脚本或二进制程序。但是,您
可以将您的想要的实现的操作与init.rc中某个属性的变化相关联.例如,在默认的init.rc中有:
# adbd on at boot in emulator
on property:ro.kernel.qemu=1
start adbd
on property:persist.service.adb.enable=1
start adbd
on property:persist.service.adb.enable=0
stop adbd
这样,如果你设置persist.service.adb.enable为1 ,"init"守护程序就知道需要采取行动:开启adbd服
务。
文章中提到的共享内存就是Android特有的共享方式:ashmen
Ashmem是一个匿名共享内存(Anonymous SHared MEMory)系统,该系统增加了接口因此进程间可
以共享具名内存块。举一个例子,系统可以利用Ashmem存储图标,当绘制用户界面的时候多个进程也可
Android 的属性系统(翻译) - Tekkaman Itachi - 优快云博客第1页 共2页
http://blog.youkuaiyun.com/tekkamanitachi/archive/2009/06/18/4280982.aspx
Ashmem是一个匿名共享内存(Anonymous SHared MEMory)系统,该系统增加了接口因此进程间可
以共享具名内存块。举一个例子,系统可以利用Ashmem存储图标,当绘制用户界面的时候多个进程也可
以访问。Ashmem优于传统Linux共享内存表现在当共享内存块不再被用的时候,它为Kernel提供一种回
收这些共享内存块的手段。如果一个程序尝 试访问Kernel释放的一个共享内存块,它将会收到一个错误提
示,然后重新分配内存并重载数据。
Android 的属性系统(翻译) - Tekkaman Itachi - 优快云博客第2页 共2页
http://blog.youkuaiyun.com/tekkamanitachi/archive/2009/06/18/4280982.aspx

<?xml version="1.0" encoding="UTF-8" standalone="no"?> <project version="1.3"> <component name="Screen1" type="Screen" version="1"> <property name="Title">LoveApp</property> <property name="BackgroundColor">FFE6F2</property> <component name="HorizontalArrangement1" type="HorizontalArrangement" version="1"> <property name="Width">FILL_PARENT</property> <property name="Height">FILL_PARENT</property> <property name="BackgroundColor">F8DCE8</property> <component name="Image1" type="Image" version="1"> <property name="Width">80</property> <property name="Height">80</property> <property name="Picture">https://i.imgur.com/xxx.png</property> <property name="AlignHorizontal">CENTER</property> </component> <component name="Label1" type="Label" version="1"> <property name="Text">可以成为我的恋人吗?</property> <property name="FontSize">18</property> <property name="TextColor">333333</property> <property name="AlignHorizontal">CENTER</property> </component> <component name="Button1" type="Button" version="1"> <property name="Text">可以</property> <property name="BackgroundColor">F44336</property> <property name="TextColor">FFFFFF</property> </component> <component name="Button2" type="Button" version="1"> <property name="Text">不要</property> <property name="BackgroundColor">2196F3</property> <property name="TextColor">FFFFFF</property> </component> </component> </component> <block xmlns="http://www.appinventor.org/xml/block"> <variables> <variable type="com.google.appinventor.components.runtime.Button"> <name>Button1</name> </variable> <variable type="com.google.appinventor.components.runtime.Button"> <name>Button2</name> </variable> </variables> <block type="button_click" id="YVY-6|UY42s93mD@PnG9" x="290" y="154"> <field name="COMPONENT">Button1</field> <next> <block type="control_show_alert" id="eWZ6D#;98s213!k@bF7w"> <field name="MESSAGE">太好啦~一起开启甜甜的旅程吧!</field> </block> </next> </block> <block type="button_click" id=")X2;9^4Y;R%3fF3k4|wH" x="290" y="329"> <field name="COMPONENT">Button2</field> <next> <block type="control_show_alert" id="6U^Jm%6=u%L53^V!r?2J"> <field name="MESSAGE">没关系呀~我会继续努力让你心动哒!</field> </block> </next> </block> </block> </project>
07-21
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值