打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
【转】Android属性(property)机制

Android属性(property)机制

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.getBooleangetInt等。

 

native C中设置属性:

#include "cutils/properties.h"

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

C中取得属性:

  charencrypted_state[32];

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

最后一个参数是默认值。

 

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

一般property启动应该加在init.<yourhardware>.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函数。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Android 的系统属性(SystemProperties)分析 | Bob's Blo...
Android系统prop属性的研究与分析
Android init进程启动过程分析
深入浅出
Android Property System
Android adb root权限 ? 就爱linux
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服