Android系统属性相关ro.*&persist.* android 获取系统属性

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/*

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

bionic/libc/include/sys/_system_properties.h
#definePROP_PATH_RAMDISK_DEFAULT "/default.prop"
#definePROP_PATH_SYSTEM_BUILD"/system/build.prop"
#definePROP_PATH_SYSTEM_DEFAULT"/system/default.prop"
Android系统属性相关ro.*&persist.* android 获取系统属性
#definePROP_PATH_LOCAL_OVERRIDE"/data/local.prop"

On system initialization, Androidwill allocates a block of shared memory for storing theproperties.
This is done in “init” daemon whose sourcecode isat: device/system/init.
system/core/init/property_service.c
属性服务启动后会从系统文件中读取默认的属性,并写入共享内存中,以上4个文件为按顺序读取
start_property_service(void)
load_properties_from_file(PROP_PATH_SYSTEM_BUILD);
load_properties_from_file(PROP_PATH_SYSTEM_DEFAULT);
load_properties_from_file(PROP_PATH_LOCAL_OVERRIDE);

有两种属性值得一提:

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

如果property_set其它属性,因为属性是在内存里存,所以重启后这个属性就没有了。

(2)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..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/中。

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

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

  

爱华网本文地址 » http://www.aihuau.com/a/25101014/190331.html

更多阅读

Android系统SD卡分区图解教程 安卓系统sd卡分区

最近入手了一部HTC Magic,由于是刚从Symbian系统转到Android系统,还是稍有些不习惯。尤其是相对于Symbian系统来说,Android系统在安装软件的时候只能安装在手机内存,这就给本身内存就不是很大的机器带来了诸多不便。既然有不便,那就要想

Android手机系统软件apk开发制作!免费学教程 android apk系统权限

Android手机系统软件apk开发制作!免费学教程——简介随着Android安卓系统的日益广泛使用,越来越多人发现手机潜在的力量,当然手机应用软件app的朝阳也随之并进,手机app软件潜在着无线巨大的发展空间和利益金钱空间!例如说:微信!UC浏览器!手

Android ImageView的scaleType属性参数解析 ios imageview scale

在Android应用当中,显示图片主要使用的是ImageView控件。当ImageView的长宽不是设置为包含内容,而是设置为固定数值的时候,就有可能出现图片过大或过小的情况,为了能保证良好的显示效果,所以对ImageView可以设置相应的scaleType属性,来控

MIUI米柚 Android系统(版本) android 判断miui系统

米柚百科名片MIUI(米柚)是小米科技旗下基于Android系统深度优化、定制、开发的第三方手机操作系统极受手机发烧友欢迎的Android ROM,专为中国人习惯设计,全面改进原生体验。能够带给国内用户更为贴心的Android智能手机体验。从2010年8月

声明:《Android系统属性相关ro.*&persist.* android 获取系统属性》为网友励志师分享!如侵犯到您的合法权益请联系我们删除