APP层控制呼吸灯

APP层控制呼吸灯

 Android是基于Linux内核,设备的节点是设备驱动的逻辑文件,可以通过设备节点来访问设备驱动。但是由于Android 5.0及以上的版本,Google对源码环境普遍采用了SELINUX安全访问机制,APP及Framework层在默认情况下是无权限访问设备节点的。

解决办法有两种:以SystemAPP或者System Server进程开放权限。1)SEAndroid 为Sys设备节点开放访问(读或写)权限方法(如:sys/class/leds/red_aux/brightness)2)SEAndroid为proc设备节点开放访问(读或写)权限方法(如:proc/touchscrren_feature/gesture_data) 

1)SEAndroid 为Sys设备节点开放访问(读或写)权限方法(如:sys/class/leds/red_aux/brightness)

以操作呼吸灯设备节点为例进行说明,如红灯sys/class/leds/red_aux/brightness,为APP层system app进程开放访问权限(读或写)

     1.APP层写节点之前,必须确保当前应用程序能够有权限去读写,否则是无法正常写入的,如果应用没有权限写设备节点,首先进入源码目录中system/core/rootdir/init.rc

;修改内容如下:

        //开放节点让系统进程可以访问

     chown systemsystem /sys/class/leds/red_aux/brightness

       //修改设备节点可读可写

     chmod 0666/sys/class/leds/red_aux/brightness

2.然后进入/device/qcom/sepolicy/common中找到file.te文件按,加入以下的类型声明:

# leds file

type sysfs_ledred_leds, fs_type, sysfs_type;

在同一目录下找到file_contexts文件,绑定sysfs_ledred_leds到对应的实际节点,加入以下声明:

/sys/devices/soc/75b5000.i2c/i2c-7/7-0045/leds/red_aux/brightnessu:object_r:sysfs_ledred_leds:s0

获取实际节点方法:1.获取root权限 2.切换到sys/class/leds3.ls -l 指令查看节点对应的实际挂载点如red_aux  对应的实际节点查看是../../devices/soc/75b5000.i2c/i2c-7/7-0045/leds/red_aux/

注意不同设备其对应的节点和实际挂载点会有所不同,根据各自的设备请自行查看。

3.再在该目录下找到syserem_app.te文件,加入以下权限声明:

allow system_app sysfs_ledred_leds:file rw_file_perms;//rw_file_perms代表读写权限,该话的意思事允许systen_app进程能够拥有对sysfs_ledred_leds的这个字符设备的读写权限;如果system_server则表示是system_server进程

allow system_app sysfs_ledred_leds:file { create openread setattr write };

注意:以上的sysfs_ledred_leds必须与file.te文件中声明的文件类型、名称必须一致。

/**

* 往文件里面写数据

* @param path 代表要写值的路径,即要写值得LED挂载节点路径

* @param value 要写的值

*/

private void write_int(String path, int value) {

String strColor = String.valueOf(value);

try {

BufferedWriter bufWriter = null;

bufWriter = new BufferedWriter(new FileWriter(path));

bufWriter.write(strColor);

Log.i(TAG,"strColor======"+strColor);

bufWriter.close();

} catch (Exception e) {

e.printStackTrace();

Log.e(TAG, "can't write the " + path);

}

}

4.在AndroidMainefest.xml中配置android:sharedUserId=”android.uid.system”;该步骤是必须的,因为在3步骤设置就是只运行系统APP进程来进行访问设备节点。

然后write_init("/sys/class/leds/red_aux/brightness",255);既可以点亮的LED灯红色。

  如果需要开放system server能够对节点权限进行控制,需要在/device/qcom/sepolicy/common目录下找到system_server.te文件,增加allow system_server sysfs_ledred_leds:file rw_file_perms;该方法的缺点:需要在framework层添加随系统启动的service,增加代码量 优点是:可以自由控制哪些应用可以访问,哪些应用禁止访问已经开放的设备节点,可以更好的保护安全问题;2.framework和app层都可以访问该设备节点,不用再另外申请权限。

读写proc节点(未测试)

3.2.1 在alps/mediatek/common/sepolicy/file.te 定义selinux type: proc_quick_gesture,如下: typeproc_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等节点

 

你可能感兴趣的:(other)