Android LED 工厂模式开发

      给一只半成品手机开发开机工模,刚踩完摄像头的坑(巨坑无比啊,下次写),这个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,烧入测试吧!

你可能感兴趣的:(日常积累)