前言:
此篇blog直接切入主题教大家怎么去修改相应代码,配置相应的寄存器直至设备正常运行,至于原理之前有博客介绍了,不在这里多谈了。
应用层控制呼吸灯
Android是基于Linux内核,设备的节点是设备驱动的逻辑文件,可以通过设备节点来访问设备驱动。但是由于Android 5.0及以上的版本,Google对源码环境普遍采用了SELINUX安全访问机制,APP及Framework层在默认情况下是无权限访问设备节点的。
解决办法有两种:以System APP或者System Server进程开放权限。
1)SEAndroid 为Sys设备节点开放访问(读或写)权限方法(如:sys/class/leds/red_aux/brightness)
- SEAndroid为proc设备节点开放访问(读或写)权限方法(如:proc/touchscrren_feature/gesture_data)
我们在这里以第一种方式修改操作呼吸灯设备节点为例进行说明,如红灯sys/class/leds/red_aux/brightness,为APP层system app进程开放访问权限(读或写)
1.APP层写节点之前,必须确保当前应用程序能够有权限去读写
否则是无法正常写入的,如果应用没有权限写设备节点,首先进入源码目录中system/core/rootdir/init.rc;
修改内容如下:
//开放节点让系统进程可以访问
chown system system /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;
3.在同一目录下找到file_contexts文件
绑定sysfs_ledred_leds到对应的实际节点,加入以下声明:
/sys/devices/soc/75b5000.i2c/i2c-7/7-0045/leds/red_aux/brightness u:object_r:sysfs_ledred_leds:s0
4.获取实际节点方法:
1)获取root权限
2)切换到sys/class/leds
3)ls -l 指令查看节点对应的实际挂载点
如red_aux 对应的实际节点查看是…/…/devices/soc/75b5000.i2c/i2c-7/7-0045/leds/red_aux/
注意:不同设备其对应的节点和实际挂载点会有所不同,根据各自的设备请自行查看。
5.再在该目录下找到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 open read 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);
}
}
6.在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层都可以访问该设备节点,不用再另外申请权限。
7.读写proc节点
1) 在alps/mediatek/common/sepolicy/file.te 定义selinux type: proc_quick_gesture,如下: type proc_quick_gesture, fs_type;
2)在 alps/mediatek/common/sepolicy/genfs_contexts,绑定proc_quick_gesture到对应的实际节点 genfscon proc /touchscreen_feature/gesture_data u:object_r:proc_quick_gesture:s0
3) 在alps/mediatek/common/sepolicy/common/system_app.te,申请权限 allow system_app proc_quick_gesture:file rw_file_perms;
4) 在AndroidManifest.xml,配置:android:sharedUserId=“android.uid.system” 经过以上4步,system_app进程就具备权限(读或写)访问/proc/touchscreen_feature/gesture_data等节点
//
apq8098_latv common msm8909 msm8916 msm8937 msm8952 msm8953 msm8974 msm8976 msm8992 msm8994 msm8996 msm8998 msmnile msmskunk msmsteppe ota sdm660 sdm710 sdm845 ssg test
yongjin@yongjin:~/work/F300/F300-master/device/qcom/sepolicy/vendor$ git diff .
diff --git a/device/qcom/sepolicy/vendor/common/file.te b/device/qcom/sepolicy/vendor/common/file.te
index 7484a71…c700ee2 100755
— a/device/qcom/sepolicy/vendor/common/file.te
+++ b/device/qcom/sepolicy/vendor/common/file.te
@@ -91,6 +91,7 @@ type persist_rfs_shared_hlos_file, file_type, vendor_persist_type;
#mm-pp-daemon file type for sysfs access
#type sysfs_leds, fs_type, sysfs_type;
+type sysfs_brightness, sysfs_type, fs_type;
#Define the files written during the operation of mm-pp-daemon
type data_ad_calib_cfg, file_type, data_file_type;
diff --git a/device/qcom/sepolicy/vendor/common/file_contexts b/device/qcom/sepolicy/vendor/common/file_contexts
index 681dd02…01d2756 100755
— a/device/qcom/sepolicy/vendor/common/file_contexts
+++ b/device/qcom/sepolicy/vendor/common/file_contexts
@@ -8,6 +8,11 @@
#add by maw for kla
/dev/ttyMSM0 u:object_r:pos_serial_device:s0
#end
+
+/sys/devices/platform/soc/soc:gpio-leds/leds/blue/brightness u:object_r:sysfs_brightness:s0
+/sys/devices/platform/soc/soc:gpio-leds/leds/green/brightness u:object_r:sysfs_brightness:s0
+/sys/devices/platform/soc/soc:gpio-leds/leds/red/brightness u:object_r:sysfs_brightness:s0
+/sys/devices/platform/soc/soc:gpio-leds/leds/yellow/brightness u:object_r:sysfs_brightness:s0
/dev/adsprpc-smd u:object_r:qdsp_device:s0
/dev/adsprpc-smd-secure u:object_r:xdsp_device:s0
diff --git a/device/qcom/sepolicy/vendor/common/system_app.te b/device/qcom/sepolicy/vendor/common/system_app.te
index 2434bcd…1d03f6d 100644
— a/device/qcom/sepolicy/vendor/common/system_app.te
+++ b/device/qcom/sepolicy/vendor/common/system_app.te
@@ -36,6 +36,10 @@ allow system_app pos_serial_device:chr_file { read write open ioctl };
allow system_app sysfs_gpio:file { read write open ioctl };
allow system_app sysfs_gpio:dir { read search };
#end
+
+allow system_app sysfs_leds:dir search;
+allow system_app sysfs_brightness:file {rw_file_perms open};
+
#add by yanhuayi for factory test app
allow system_app sysfs_battery_supply:dir { read search };
allow system_app sysfs_battery_supply:file { read open getattr};