1. 属性简介

Android里有很多属性(property),每个属性都有一个名称和值,他们都是字符串格式。这些属性定义了Android系统的一些公共系统属性。比如:

[dalvik.vm.dexopt-flags]: [m=y]

[dalvik.vm.heapgrowthlimit]: [48m]

[gsm.operator.iso-country]: []

[gsm.operator.isroaming]: [false]

[gsm.operator.numeric]: []

[gsm.sim.operator.alpha]: []

[gsm.sim.operator.iso-country]: []

[gsm.sim.operator.numeric]: []

这些属性多数是开机启动时预先设定的,也有一些是动态加载的。

系统启动时以下面的次序加载预先设定属性:

/default.prop

/system/build.prop

/system/default.prop

/data/local.prop

/data/property/*

后加载的如果有重名的则覆盖前面的。

有两种属性值得一提:

persist.* : 以persist开始的属性会在/data/property存一个副本。也就是说,如果程序调property_set设了一个以persist为前缀的属性,系统会在/data/property/*里加一个文件记录这个属性,重启以后这个属性还有。如果property_set其它属性,因为属性是在内存里存,所以重启后这个属性就没有了。

ro.* :以ro为前缀的属性不能修改。

2. 应用程序属性使用方法

在java应用里设置属性:

import android.os.SystemProperties;

SystemProperties.set("persist.sys.country",”china”);

在java里取得属性:

String vmHeapSize = SystemProperties.get("dalvik.vm.heapgrowthlimit", "24m");

也可以用SystemProperties.getBoolean,getInt等。

在native C中设置属性:

#include "cutils/properties.h"

property_set("vold.decrypt", "trigger_load_persist_props");

在C中取得属性:

char encrypted_state[32];

property_get("ro.crypto.state", encrypted_state, "");

最后一个参数是默认值。

3. 启动脚本中属性使用方法

一般property启动应该加在init.<your hardware>.rc而不是直接init.rc里。下面是一个init.rc里的例子:

# adbd on at boot in emulator

on property:ro.kernel.qemu=1

start adbd

意思是如果ro.kernel.qemu=1,也就是当前是模拟器的话,则启动adb服务。

4. property权限

只有有权限的进程才能修改属性,要不随便写一个就改系统属性那当黑客也太容易了。

权限在system/core/init/property_service.c里定义:

property_perms[] = {

{ "net.rmnet0.",      AID_RADIO,    0 },

{ "net.gprs.",        AID_RADIO,    0 },

{ "net.ppp",          AID_RADIO,    0 },

{ "net.qmi",          AID_RADIO,    0 },

{ "ril.",             AID_RADIO,    0 },

{ "gsm.",             AID_RADIO,    0 },

{ "persist.radio",    AID_RADIO,    0 },

{ "net.dns",          AID_RADIO,    0 },

{ "net.",             AID_SYSTEM,   0 },

{ "dev.",             AID_SYSTEM,   0 },

{ "runtime.",         AID_SYSTEM,   0 },

{ "hw.",              AID_SYSTEM,   0 },

{ "sys.",             AID_SYSTEM,   0 },

...

其实一般应用程序都不会去修改系统属性,所以也不用太在意。

5. 属性实现原理

属性初始化的入口点是property_init ,在system/core/init/property_service.c中定义。它的主要工作是申请32k共享内存,其中前1k是属性区的头,后面31k可以存247个属性(受前1k头的限制)。property_init初始化完property以后,加载/default.prop的属性定义。

其它的系统属性(build.prop, local.prop,…)在start_property_service中加载。加载完属性服务创建一个socket和其他进程通信(设置或读取属性)。

Init进程poll属性的socket,等待和处理属性请求。如果有请求到来,则调用handle_property_set_fd来处理这个请求。在这个函数里,首先检查请求者的uid/gid看看是否有权限,如果有权限则调property_service.c中的property_set函数。

在property_set函数中,它先查找就没有这个属性,如果找到,更改属性。如果找不到,则添加新属性。更改时还会判断是不是“ro”属性,如果是,则不能更改。如果是persist的话还会写到/data/property/<name>中。

最后它会调property_changed,把事件挂到队列里,如果有人注册这个属性的话(比如init.rc中on property:ro.kernel.qemu=1),最终会调它的会调函数。

property名字长度限制是32字节,值的限制是92字节。不知道是google怎么想的 — 一般都是名字比值长得多!比如[dalvik.vm.heapgrowthlimit]: [48m]

Android属性(property)机制的更多相关文章

  1. 深入讲解Android Property机制

    深入讲解Android Property机制 侯亮 1      概述 Android系统(本文以Android 4.4为准)的属性(Property)机制有点儿类似Windows系统的注册表,其中的 ...

  2. 通过AnimationSet 同步或一部播放多个动画 Android 属性动画(Property Animation) 完全解析 (下)

    AnimationSet提供了一个把多个动画组合成一个组合的机制,并可设置组中动画的时序关系,如同时播放,顺序播放等. 以下例子同时应用5个动画: 播放anim1: 同时播放anim2,anim3,a ...

  3. Android 属性系统 Property service 设定分析 (转载)

    转自:http://blog.csdn.net/andyhuabing/article/details/7381879 Android 属性系统 Property service 设定分析 在Wind ...

  4. Android 属性动画(Property Animation) 全然解析 (下)

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38092093 上一篇Android 属性动画(Property Animatio ...

  5. Android 属性动画(Property Animation) 完全解析 (下)

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38092093 上一篇Android 属性动画(Property Animatio ...

  6. Android属性动画完全解析(上),初识属性动画的基本用法

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/43536355 在手机上去实现一些动画效果算是件比较炫酷的事情,因此Android系 ...

  7. Android属性动画完全解析(上)

    Android属性动画完全解析(上) 转载:http://blog.csdn.net/guolin_blog/article/details/43536355 在手机上去实现一些动画效果算是件比较炫酷 ...

  8. Android系统Surface机制的SurfaceFlinger服务对帧缓冲区(Frame Buffer)的管理分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8046659 在前文中,我们分析了Surface ...

  9. Android 属性动画 源码解析 深入了解其内部实现

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/42056859,本文出自:[张鸿洋的博客] 我参加了博客之星评选,如果你喜欢我的博 ...

  10. Android属性动画-基本用法

    在手机上去实现一些动画效果算是件比较炫酷的事情,因此Android系统在一开始的时候就给我们提供了两种实现动画效果的方式,逐帧动画(frame-by-frame animation)和补间动画(twe ...

随机推荐

  1. 网络编程--ASI--(ASIHTTPRequest)介绍

    ASIHTTPRequest 虽然是明日黄花,但是还是稍微归纳一下,理清思路,知道这个曾经的她都能干嘛. 1. ASI基于底层的 CFNetworking 框架,运行效率很高. 2. 黄金搭档:ASI ...

  2. 转:SVN常见问题与解决方法

    今天发现一个SVN很奇葩的问题.原来SVN提交的时候也是识别提交路径的大小写的... 发现网上有篇博客总结的挺好的.转载下来,转载出路:http://blog.csdn.net/shinn613/ar ...

  3. 基于Tomcat + JNDI + ActiveMQ实现JMS的点对点消息传送

    前言 写了一个简单的JMS例子,之所以使用JNDI 是出于通用性考虑,该例子使用JMS规范提供的通用接口,没有使用具体JMS提供者的接口,这样可以保证我们编写的程序适用于任何一种JMS实现(Activ ...

  4. JAVA同步容器和并发容器

    同步容器类 同步容器类的创建 在早期的JDK中,有两种现成的实现,Vector和Hashtable,可以直接new对象获取: 在JDK1.2中,引入了同步封装类,可以由Collections.sync ...

  5. 烂泥:openvpn双网卡客户端与内网机器通信

    本文由ilanniweb提供友情赞助,首发于烂泥行天下 想要获得更多的文章,可以关注我的微信ilanniweb. 前段时间写了一篇有关openvpn搭建与内网机器通信的文章,那篇文章是基于服务器单网卡 ...

  6. head,tail

    测试文件headtail 1 L 2 L 3 L 4 L 5 L 6 L 7 L 8 L 9 L 10 L 11 L 12 L 13 L 14 L 15 L 16 L 17 L 18 L 19 L h ...

  7. 56相册视频(土豆相册视频 激动相册视频 QQ动感影集等)——下载教程

    由于目前流行的相册视频或影集大多是由Flash.音乐和图片组合而成的动画,不属于完整视频,所以不能用常规的解析方法下载. 鉴于很多朋友希望可以下载自己精心制作的相册,故在本教程中,我们将以图文并茂的方 ...

  8. ssh升级

    Openssh升级操作步骤(此方法仅供参考) 1 .开启telnet服务 未避免openssh升级失败,导致ssh无法连接,在升级前首先开启telnet服务. 首先要确定是否安装了telnet 修改配 ...

  9. java与mysql连接

    package DBHelper; import java.sql.*; public class Demo { public static void main(String[] args) { St ...

  10. 周五了啦啦啦啦-LAMP+PHP‘s OOP

    hi 周五咯~~ 1.LAMP配置完结篇 五.LAMP配置环境优化 5.4 虚拟主机工作原理 apache的虚拟主机.virtual-host 用不同的域名访问不同的目录——手动模拟dns 修改hos ...