[Android L]SEAndroid开放设备文件结点权限(读或写)方法(涵盖常用操作:sys/xxx、proc/xxx、SystemProperties)热门干货

转载 2016年06月02日 11:27:23

1 现象描述


基于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)

【声明】欢迎转载,但请保留文章原始出处:http://blog.csdn.net/yelangjueqi/article/details/46761987

2 问题原因


自Android L版本,Google对源码环境普遍启用SELinux安全访问机制,APP及framework层默认情况下再无权限访问设备节点如(sys/xxx,proc/xxx)

3 解决方法


下面以三种常用操作角度阐述为system app进程或system server进程开放权限的方法
1) SEAndroid 为sys设备文件结点开放访问(读或写)权限的方法(如:/sys/class/leds/green/brightness)
2) SEAndroid 为proc设备文件结点开放访问(读或写)权限的方法(如:/proc/touchscreen_feature/gesture_data)
3) SEAndroid 为SystemProperties的自定义属性开放set(写)权限的方法

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 //实际节点

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)

3.1.1 在android/device/qcom/sepolicy/common/file.te,定义selinux type:sysfs_wingtk_leds,如下:

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 # ll -Z
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 #

通过 ll -Z 命令就可以查到。

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  例:chown system /sys/class/timed_output/vibrator/enable
chmod 0777 /sys/class/timed_output/vibrator/enable
QCOM:xx/xx/init.target.rc

注:系统中所有使用android.uid.system作为共享UID的APK,都会首先在manifest节点中增加android:sharedUserId="android.uid.system",然后在Android.mk中增加LOCAL_CERTIFICATE := platform。可以参见Settings等 然后在源码下编译后即可

Linux下C/C++ 目录和文件操作

学习Linux环境编程  读取文件和目录是很重要的环节,因为Linux环境下  "一切皆文件"     首先得明白文件描述符的概念,每一个进程都会默认打开标准输入,标准输出,标准出错 下面这个案列很好...
  • szqsdq
  • szqsdq
  • 2015年09月10日 13:50
  • 1531

Linux C ftruncate 函数清空文件注意事项(要使用 lseek 重置偏移量)

之前有个要把打开的文件清空,然后重新写入的需求,但是使用 ftruncate(fd, 0)后,并没有达到效果,反而文件头部有了'\0',长度比预想的大了。究其原因是没有使用 lseek 重置文件偏移量...

[Android L]SEAndroid开放设备文件结点权限(读或写)方法(涵盖常用操作:sys/xxx、proc/xxx、SystemProperties)热门干货

[Android L]SEAndroid开放设备文件结点权限(读或写)方法(涵盖常用操作:sys/class/xxx、proc/xxx、SystemProperties)热门干货 自Android ...

[Android L]SEAndroid开放设备文件结点权限(读或写)方法(涵盖常用操作:sys/xxx、proc/xxx、SystemProperties)热门干货

目录(?)[-] 温馨提示现象描述问题原因解决方法 1 SEAndroid 为sys设备文件结点开放访问读或写权限的方法如sysclassledsgreenbrightness2 SEAndroi...
  • gnnulzy
  • gnnulzy
  • 2016年10月18日 08:27
  • 216

[Android L]SEAndroid开放设备文件结点权限(读或写)方法(涵盖常用操作:sys/xxx、proc/xxx、SystemProperties)热门干货

点击打开链接温馨提示     建议你先了解一下上一篇博文([Android L]SEAndroid增强Androd安全性背景概要及带来的影响)所讲的内容,先对SEAndroid窥个全貌,然后再继续本节...

[Android L]SEAndroid开放设备文件结点权限(读或写)方法(涵盖常用操作:sys/xxx、proc/xxx、SystemProperties)热门干货

温馨提示      建议你先了解一下上一篇博文([Android L]SEAndroid增强Androd安全性背景概要及带来的影响)所讲的内容,先对SEAndroid窥个全貌,然后再继续本节...

如何验证linux进程打开文件数的默认最大值(通常是1024)? 知识点: ulimit; watch -n 1 'ls -l /proc/xxx/fd | wc -l'

曾经在某公司的笔试题中出现了这样一个题目:linux进程打开文件数的默认最大值是多少? 我当时想, 这不是为难人么? 谁记得住呢? 用ulimit命令查一下不就知道了么? 其实, 本题不过是在考一个简...
  • stpeace
  • stpeace
  • 2016年07月02日 12:13
  • 1502

转载------ #include sys/xxx.h 头文件

原文地址:http://blog.chinaunix.net/space.php?uid=21289517&do=blog&id=1828403 #include sys/xxx...

使用 STM8L DISCOVERY 示例程序添加库文件出现 Error[Li005]: no definition for XXX 的解决办法

今天想用新买的STM8L-DISCOVERY写一个控制舵机的程序。如果使用标准库的话,正确的做法是把 stm8l15x.h 里面 #include "stm8l15x_tim1.h  这一行的注释去掉...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[Android L]SEAndroid开放设备文件结点权限(读或写)方法(涵盖常用操作:sys/xxx、proc/xxx、SystemProperties)热门干货
举报原因:
原因补充:

(最多只允许输入30个字)