给一只半成品手机开发开机工模,刚踩完摄像头的坑(巨坑无比啊,下次写),这个LED三色灯的坑足足踩了5个小时,在此记录下。
一,项目需求
点击LED测试,手机LED灯颜色依次显示红-绿-蓝,手动选择Pass/Fail。
二,项目坑点
APP层采用修改系统文件的方式,直接控制LED颜色,具体代码参考应用层修改LED指示灯,写的很不错,现在说下按照这个方法写,我遇到的坑!
java.io.FileNotFoundException: /sys/class/leds/green/brightness: open failed: EACCES (Permission denied)
看到这个错误,第一反应就是,没申请系统都写权限?重新申请,没用!
最终找到这个文章http://blog.csdn.net/yelangjueqi/article/details/46761987。根本原因是:自Android L版本,Google对源码环境普遍启用SELinux安全访问机制,APP及framework层默认情况下再无权限访问设备节点如(sys/xxx,proc/xxx),顺利解决问题,感谢!并在此记录汇总下。
三,记录和整理
关于SEAndroid为sys设备文件节点开发访问(读写)权限的方法,默认是在external/sepolicy目录下面,但是MTK和QCOM平台都创建了自己管理SELinux policy的目录:
MTK:alps/device/mediatek/common/sepolicy
QCOM:android/device/qcom/sepolicy/common
所以建议在对应的平台去操作,本篇以高通平台上修改LED三色灯为例。
操作LED灯的设备文件节点时,会有两个节点,分别是虚拟节点和实际节点,如红灯:
虚拟节点:/sys/class/leds/green/brightness
实际节点:/sys/devices/soc.0/gpio-leds.66/leds/green/brightness
类似windows平台的快捷方式,所以单纯的修改快捷方式是不起作用的。
【1】如何获取实际节点:
(1)连接上手机,获取remount权限
(2)adb shell
(3)进入sys/class/leds,执行ls -l -Z
【2】获取到虚拟节点和实际节点后,需要配置在项目中
(1)在android/device/qcom/sepolicy/common/file.te,定义
type sysfs_wingtk_leds, fs_type, sysfs_type;
(2)在android/device/qcom/sepolicy/common/file_contexts绑定
/sys/devices/soc.0/gpio-leds.66/leds/green/brightness u:object_r:sysfs_wingtk_leds:s0
(3)在android/device/qcom/sepolicy/common/system_app.te,申请权限
allow system_app sysfs_wingtk_leds:file rw_file_perms; //此处权限配置为仅允许system_app进程访问
【3】最后一步,需要apk设置为系统app
在AndroidManifest.xml,配置:android:sharedUserId="android.uid.system"
【4】编译bootimage,烧入测试吧!