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等节点