转自 http://blog.csdn.net/zhudaozhuan/article/details/50966080
property是Android常用的一个TOOL(可以理解为TOOL),使用起来非常方便,不管是Java层还是c++层,都可以使用property。
1.非SEAndroid property限定
android 5.X之前,例如kikat4.4 :
system\core\init\property_service.c
- { "ril.", AID_RADIO, 0 },
- { "gsm.", AID_RADIO, 0 },
- { "persist.radio", AID_RADIO, 0 },
- { "net.dns", AID_RADIO, 0 },
- { "sys.usb.config", AID_RADIO, 0 },
- { "net.", AID_SYSTEM, 0 },
- { "dev.", AID_SYSTEM, 0 },
- { "runtime.", AID_SYSTEM, 0 },
- { "hw.", AID_SYSTEM, 0 },
- { "sys.", AID_SYSTEM, 0 },
- { "sys.powerctl", AID_SHELL, 0 },
- { "service.", AID_SYSTEM, 0 },
- { "wlan.", AID_SYSTEM, 0 },
property根据AID不同,只能操作指定前缀的属性。比如gsm.* 只能是AID_RADIO process可以set & get,其他USER则无法设置此前缀的property。
AID和UID有如下对应关系:
system\core\include\private\android_filesystem_config.h
- #define AID_SYSTEM 1000
-
- #define AID_RADIO 1001
- #define AID_BLUETOOTH 1002
- #define AID_GRAPHICS 1003
- #define AID_INPUT 1004
- #define AID_AUDIO 1005
- #define AID_CAMERA 1006
- #define AID_LOG 1007
- #define AID_COMPASS 1008
- #define AID_MOUNT 1009
- #define AID_WIFI 1010
通过busybox ps可以查看进程的UID:
- PID USER TIME COMMAND
- 1741 10004 0:00 {d.process.media} android.process.media
- 1804 10011 0:01 {ndroid.systemui} com.android.systemui
- 1987 10005 0:00 {externalstorage} com.android.externalstorage
- 2083 10038 0:00 {utmethod.pinyin} com.android.inputmethod.pinyin
- 2176 1001 0:00 {m.android.phone} com.android.phone
- 2195 1000 0:01 {droid.launcher3} com.android.launcher3
android5.X之后,在system\core\init\property_service.c以及其他文件,没有看到对property_perms的定义。
在TvSettings.apk写demo验证:
- SystemProperties.set("jacky.debug.prop","1");
- SystemProperties.set("log.jacky.prop","1");
- SystemProperties.set("gsm.jacky.prop","1");
get到结果:
- [gsm.jacky.prop]: [1]
- [jacky.debug.prop]: [1]
- [log.jacky.prop]: [1]
gsm和log前缀对于kikat4.4,UID=1000的process是无法设置的,但是在android 5.1平台可以设置,说明android 5.X后已经没有对property前缀的限制了。
2.SEAndroid对property配置
在property_service.c里面没有对property的限制了,但是在SEAndroid还是有根据前缀,给予不同的SContext。
external\sepolicy\property_contexts
- net. u:object_r:system_prop:s0
- dev. u:object_r:system_prop:s0
- runtime. u:object_r:system_prop:s0
- hw. u:object_r:system_prop:s0
- sys. u:object_r:system_prop:s0
- sys.powerctl u:object_r:powerctl_prop:s0
- service. u:object_r:system_prop:s0
- wlan. u:object_r:system_prop:s0
- dhcp. u:object_r:dhcp_prop:s0
- dhcp.bt-pan.result u:object_r:pan_result_prop:s0
- bluetooth. u:object_r:bluetooth_prop:s0
类似以前版本,不同的前缀,对应不同的AID,这里对应不同的Scontext。
有介绍,对于app,只有domain为system_app的process才可以进行prop相关操作。
因此当我们需要客制化property前缀试,需要在property_contexts进行相关的配置。
例如:
- ms.media. u:object_r:audio_prop:s0
- ms.dvfs. u:object_r:audio_prop:s0
其他domain,比如surfaceflinger.te中配置:
# Set properties.
allow surfaceflinger system_prop:property_service set;
allow surfaceflinger ctl_bootanim_prop:property_service set;
也可以对prop进行设置,所以当其他的domain process无法设置prop时,可以添加allow语句添加权限。
总结:
SEAndroid对property的配置,和kikat4.4版本的AID配置一样,对应的前缀,指定对应的SContext即可。以及当其他domain的process需要设置property时,可以通过allow语句添加权限(不确定是否会违反neverallow).