type=1400 audit(0.0:43): avc: denied { read write } for name="motor_pwm" dev="tmpfs" ino=1732 scontext=u:r:untrusted_app_25:s0:c512,c768 tcontext=u:object_r:device:s0 tclass=chr_file permissive=0java
基于Android L版本源码环境进行开发时,根据项目需求,APP层须要操做sys/xxx 或 proc/xxx下面的文件结点,可是会报出如下权限异常,没法直接操做这些结点
LedLightFileUtil( 4671): java.io.FileNotFoundException: /sys/class/leds/green/brightness: open failed: EACCES (Permission denied)
LedLightFileUtil( 4671): at libcore.io.IoBridge.open(IoBridge.java:456)
LedLightFileUtil( 4671): at java.io.FileOutputStream.<init>(FileOutputStream.java:87)
LedLightFileUtil( 4671): at java.io.FileOutputStream.<init>(FileOutputStream.java:127)
LedLightFileUtil( 4671): at java.io.FileOutputStream.<init>(FileOutputStream.java:116)linux
【声明】欢迎转载,但请保留文章原始出处:http://blog.csdn.net/yelangjueqi/article/details/46761987android
2 问题缘由安全
自Android L版本,Google对源码环境广泛启用SELinux安全访问机制,APP及framework层默认状况下再无权限访问设备节点如(sys/xxx,proc/xxx)app
3 解决方法ui
下面以三种经常使用操做角度阐述为system app进程或system server进程开放权限的方法
1) SEAndroid 为sys设备文件结点开放访问(读或写)权限的方法(如:/sys/class/leds/green/brightness)
2) SEAndroid 为proc设备文件结点开放访问(读或写)权限的方法(如:/proc/touchscreen_feature/gesture_data)
3) SEAndroid 为SystemProperties的自定义属性开放set(写)权限的方法.net
3.1 SEAndroid 为sys设备文件结点开放访问(读或写)权限的方法(如:/sys/class/leds/green/brightness)
以操做LED灯的设备文件节点为例进行说明,如绿灯:/sys/class/leds/green/brightness,为APP层system app进程开放该节点访问权限(读或写)
绿灯:
/sys/class/leds/green/brightness //快捷方式
/sys/devices/soc.0/gpio-leds.66/leds/green/brightness //实际节点server
PS:默认是在external/sepolicy目录下面,可是MTK平台和QCOM平台都建立了本身管理SELinux policy的目录:
MTK:alps/device/mediatek/common/sepolicy
QCOM:android/device/qcom/sepolicy/common
因此建议你在其平台的相应目录下面去操做,下面以QCOM平台为例,MTK平台配置步骤方法是同样的(alps/device/mediatek/common/sepolicy)xml
3.1.1 在android/device/qcom/sepolicy/common/file.te,定义selinux type:sysfs_wingtk_leds,以下:blog
type sysfs_wingtk_leds, fs_type, sysfs_type;
3.1.2 在android/device/qcom/sepolicy/common/file_contexts,绑定sysfs_wingtk_leds到对应的实际节点,注意是实际节点
/sys/devices/soc.0/gpio-leds.66/leds/green/brightness u:object_r:sysfs_wingtk_leds:s0
PS:能够把/sys/class/leds/green/brightness也声明下,该句不是必须的:
/sys/class/leds/green/brightness u:object_r:sysfs_wingtk_leds:s0
汇总:file_contexts的修改以下:
/sys/class/leds/green/brightness u:object_r:sysfs_wingtk_leds:s0
/sys/devices/soc.0/gpio-leds.66/leds/green/brightness u:object_r:sysfs_wingtk_leds:s0
3.1.3 在android/device/qcom/sepolicy/common/system_app.te,申请权限:
allow system_app sysfs_wingtk_leds:file rw_file_perms;
PS:也能够为其余process申请相关的权限,如:system_server,在android/device/qcom/sepolicy/common/system_server.te
allow system_server sysfs_wingtk_leds:file rw_file_perms;
PS:配置第2步的实际节点时,怎么获取实际节点,方法以下:
root@K31-t7:/sys/class/leds # ls -l
lrwxrwxrwx root root u:object_r:sysfs:s0 flashlight -> ../../devices/soc.0/flashlight.64/leds/flashlight
lrwxrwxrwx root root u:object_r:sysfs:s0 green -> ../../devices/soc.0/gpio-leds.66/leds/green
lrwxrwxrwx root root u:object_r:sysfs:s0 lcd-backlight -> ../../devices/soc.0/1a00000.qcom,mdss_mdp/qcom,mdss_fb_primary.124/leds/lcd-backlight
lrwxrwxrwx root root u:object_r:sysfs:s0 mmc0:: -> ../../devices/soc.0/7824900.sdhci/leds/mmc0::
lrwxrwxrwx root root u:object_r:sysfs:s0 mmc1:: -> ../../devices/soc.0/7864900.sdhci/leds/mmc1::
lrwxrwxrwx root root u:object_r:sysfs:s0 red -> ../../devices/soc.0/gpio-leds.66/leds/red
lrwxrwxrwx root root u:object_r:sysfs:s0 torch-light0 -> ../../devices/soc.0/qcom,camera-led-flash.65/leds/torch-light0
root@K31-t7:/sys/class/leds #
经过 ls -l 命令就能够查到。
3.1.4 在AndroidManifest.xml,配置:android:sharedUserId="android.uid.system",该步时必须的,由于第三步是:
allow system_app sysfs_wingtk_leds:file rw_file_perms; //仅容许system_app进程访问.
通过以上四步,APP层就能够正常读写:/sys/class/leds/green/brightness
为了更好地控制访问权限,若是存在APP层和framework层都要访问某个设备节点,笔者认为最好以此模式来访问设备节点,即不让system_app进程访问,仅仅容许system_server进程来访问,以下:
allow system_server sysfs_wingtk_leds:file rw_file_perms;
缺点:须要在framework层添加随系统启动的service,增长代码量
优势:1.能够自由控制哪些应用能够访问,哪些应用禁止访问已经开放的设备节点,能够更好的保护安全问题
2.framework层和APP层均可以访问该设备节点.不用再另外进行权限申请
3.2 SEAndroid 为proc设备文件结点开放访问(读或写)权限的方法(如:/proc/touchscreen_feature/gesture_data),以MTK平台为例
修改记录
细节展开
3.2.1 在alps/mediatek/common/sepolicy/file.te 定义selinux type: proc_quick_gesture,以下:
type proc_quick_gesture, fs_type;
3.2.2 在 alps/mediatek/common/sepolicy/genfs_contexts,绑定proc_quick_gesture到对应的实际节点
genfscon proc /touchscreen_feature/gesture_data u:object_r:proc_quick_gesture:s0
3.2.3 在alps/mediatek/common/sepolicy/common/system_app.te,申请权限
allow system_app proc_quick_gesture:file rw_file_perms;
3.2.4 在AndroidManifest.xml,配置:android:sharedUserId="android.uid.system"
通过以上4步,system_app进程就具有权限(读或写)访问/proc/touchscreen_feature/gesture_data等节点啦
3.3 SEAndroid 为SystemProperties的自定义属性开放set(写)权限的方法
问题描述
SystemProperties对自定义属性没有写权限,即set时提示没有权限,致使写不成功
解决方法
以"persist.backgrounddata.enable"为例介绍开放属性权限方法
以QCOM平台为例
3.3.1 android/device/qcom/sepolicy/common/property.te
type persist_backgrounddata_prop, property_type;
3.3.2 android/device/qcom/sepolicy/common/property_contexts
persist.backgrounddata.enable u:object_r:persist_backgrounddata_prop:s0
3.3.3 android/device/qcom/sepolicy/common/system_app.te,为system_app进程开放权限
allow system_app persist_backgrounddata_prop:property_service set;
3.3.4 在AndroidManifest.xml,配置:android:sharedUserId="android.uid.system"
通过以上4步,就能够使用SystemProperties.set("persist.backgrounddata.enable"", xx)设置属性了。
延伸阅读
若是经过以上步骤正确配置以后,你仍没有权限读写sys或proc节点,是否是DAN都碎了。再告诉你下,你须要到init.rc里面配置: chown system system 文件结点,而后chmod下文件结点。两个平台配置路径,项目不一样略有差别
MTK:alps/device/mediatek/mt6735/init.mt6735.rc
QCOM:xx/xx/init.target.rc
参考连接:https://blog.csdn.net/yelangjueqi/article/details/46761987