赞
踩
Android 里有很多属性(property),每个属性都有一个名称和值,他们都是字符串格式。这些属性定义了 Android 系统的一些公共系统属性。借用大神的一句话,系统属性就是 真·全局变量。
属性变更的请求时init事件循环处理的另一个事件,在Android平台中,为了让运行中的所有进程共享系统运行时所需要的各种设置值,系统开辟了属性存储区域,并提供了访问该区域的API。属性由键(key)与值(value)构成,其表现形式为“键=值”。
在Android平台中,在访问属性值时,添加了访问权限控制(SELinux),增强了访问的安全性。系统中所有运行中的进程都可以访问属性值,但仅有init进程才能修改属性值。其他进程修改属性值时,必须向init进程提出请求,最终由init进程负责修改属性值。在此过程中,init进程会先检查各属性的访问权限,而后再修改属性值。
当属性值更改后,若定义在init.rc文件中的某个特定条件得到满足,则与此条件相匹配的动作就会发生,每个动作都有一个触发器,决定动作的执行时间,记录在“on property”关键字后的命令即被执行。
个人看来属性系统有一下四个优点,当然缺点也很明显,只能支持三种基本类型:string、int、boolean
当编写本地应用程序时,可以使用 property_get 和 property_set 这两个API来读取/设置属性。要使用它们,我们需要 include cutils/properties.h,并链接 libcutils 库。
int property_get(const char *key, char *value, const char *default_value);
int8_t property_get_bool(const char *key, int8_t default_value);
int64_t property_get_int64(const char *key, int64_t default_value);
int32_t property_get_int32(const char *key, int32_t default_value);
int property_set(const char *key, const char *value);
int property_list(void (*propfn)(const char *key, const char *value, void *cookie), void *cookie);
以上就是 properties.h 中申明的所有方法,其中 property_set 返回 0 表示执行成功,返回值 <0 表示失败。
代码中以(其中会涉及selinux的问题)
setprop vendor.audio.lpa.enable 1
setprop vendor.audio.lpa.hold_second 20
property_get_int32("vendor.audio.lpa.hold_second", 60);
用此函数来获取对应值
java 层调用 /frameworks/base/core/java/android/os/SystemProperties.java 中的 set 和 get 方法即可设置和获取系统属性
public static String get(String key) {}
public static String get(String key, String def) {}
public static int getInt(String key, int def) {
public static long getLong(String key, long def) {}
public static boolean getBoolean(String key, boolean def) {}
public static void set(String key, String val) {}
public static void addChangeCallback(Runnable callback) {}
通过 JNI 最终调用的还是 /system/core/libcutils/properties.c 中的 property_get 和 property_set。
Android toolbox 程序提供了两个工具: setprop 和 getprop 获取和设置属性。其使用方法:
getprop <属性名>
setprop <属性名><<属性值>
可以通过命令adb shell: getprop查看手机上所有属性状态值。
默认情况下,设置属性只会使 “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服务。
device/linaro/poplar/BoardConfig.mk
BOARD_KERNEL_CMDLINE := androidboot.hardware=poplar androidboot.selinux=permissive
对应的property为ro.boot.hardware和ro.boot.selinux
// sepolicy/property_contexts
ro.boot.wifivendor u:object_r:vendor_default_prop:s0
// sepolicy/audioserver.te
get_prop(audioserver, vendor_default_prop)
这个是对property的selinux设置方式。audioserver的进程可以访问以vendor_default_prop为标签的property(ro.boot.wifivendor)
参考链接 |
Android属性系统简介及使用 |
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。