当前位置:   article > 正文

键盘灯功能。开放底层节点操作所需权限和se权限。avc权限问题_allow system_app sysfs_leds

allow system_app sysfs_leds

frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java

在public intinterceptKeyBeforeQueueing(KeyEvent event, int policyFlags) {方法中处理按键

加入

  1. StringLED_PATH ="/sys/class/leds/keyboard-backlight/brightness";
  2. if(keyCode !=KeyEvent.KEYCODE_VOLUME_UP && keyCode != KeyEvent.KEYCODE_VOLUME_DOWN
  3. && keyCode !=KeyEvent.KEYCODE_VOICE_ASSIST && keyCode !=KeyEvent.KEYCODE_TV_DATA_SERVICE && keyCode !=KeyEvent.KEYCODE_TV_RADIO_SERVICE ){
  4. if(down){
  5. mHandler3.removeMessages(0);
  6. controlBrightness("1",LED_PATH);
  7. }else if (event.getAction() ==KeyEvent.ACTION_UP){
  8. mHandler3.postDelayed(new Runnable() {
  9. public void run() {
  10. controlBrightness("0",LED_PATH);
  11. }
  12. }, 3000);
  13. }
  14. }

所需方法

  1. privatevoid controlBrightness(String commod,String Path) {
  2. BufferedWriter bufWriter;
  3. try {
  4. bufWriter = new BufferedWriter(newFileWriter(Path));
  5. bufWriter.write(commod);
  6. bufWriter.close();
  7. } catch (IOException e) {
  8. Log.e("KeyboardLight"," ***controlRedBrightness ERROR*** Here is what I know:"
  9. + e.getMessage());
  10. e.printStackTrace();
  11. }
  12. }
  13. 导包import java.io.BufferedWriter;
  14. importjava.io.FileWriter;
  15. importjava.io.IOException;

新开一个mHandler3,避免之前的mHandler已经移除了消息或执行了什么消息。

这里面是去掉了一些侧键和音量键,通过写底层键盘灯节点的方式进行

这个节点需要写权限,

开放底层节点操作所需权限和se权限,这里以键盘灯和音量旋钮节点为例

首先先在device/droi/pl2281_zrk/init.project.rc

开放上层节点操作权限,加入

  1. chownsystem system /sys/devices/platform/rotary_pwr/rotary_power
  2. chmod 666/sys/devices/platform/rotary_pwr/rotary_power
  3. chmod 666/sys/class/leds/keyboard-backlight/brightness
  4. chown system system/sys/class/leds/keyboard-backlight/brightness

这里的路径其实是软路径,并不代表就一定是底层真实路径,不过上层就可以用这个来操作了,此时还有SeLinux权限需要开放,会报avc权限问题

device/mediate/目录下,当然在device/droi下面也行

sepolicy/basic/non_plat/file.te定义需要开放节点的名称

  1. +#ledkeyborad
  2. +type sysfs_leds_keyboradlight,fs_type, sysfs_type, mlstrustedsubject;
  3. +type sysfs_rotary_status,fs_type, sysfs_type, mlstrustedsubject;

注意sysfs_leds_keyboradlight这个名称前面的sysfs_是固定的,后面自定义名称,有点类似SystemProperties.get("persist.sys.packageinstall.status","0"))

后面的fs_type,sysfs_type, mlstrustedsubject 就是固定格式让他作为系统可开放的类型

然后在sepolicy/basic/non_plat/file_contexts

匹配对应真实路径

  1. +#led keyborad
  2. +/sys/devices/platform/leds-mt65xx/leds/keyboard-backlight/brightnessu:object_r:sysfs_leds_keyboradlight:s0
  3. +/sys/devices/platform/rotary_pwr/rotary_statusu:object_r:sysfs_rotary_status:s0

这里就是真实路径,然后这个格式固定u:object_r:sysfs_leds_keyboradlight:s0

替换名称就行,就是规定se规则到这个节点为false,跳过

有些节点没有软路径就是真实路径,比如这里的旋钮节点,但是键盘灯节点就有这个底层真实路径,结合之前的状态灯节点也同理,

查看节点的真实路径,adbshell 后su模式

ls –l 上层应用节点 看看是否有指向真实路径

最后就是真正执行这节点开放的是

sepolicy/basic/non_plat/system_server.te

  1. +#led keyborad
  2. +allow system_server sysfs_leds_keyboradlight:dirsearch;
  3. +allow system_server sysfs_leds_keyboradlight:filerw_file_perms;
  4. +allow system_server sysfs_rotary_status:filerw_file_perms;

就是开放正常的读写权限,注意这边键盘灯操作是在framework层调用,最后报的也是system_server给的avc不足,反之如果是系统apk或者内置的应用需要权限的话

就在

sepolicy/basic/non_plat/system_app.te

加入,就是换一个类型system_app

  1. +#led keyborad
  2. +allow system_appsysfs_leds_keyboradlight:dir search;
  3. +allow system_appsysfs_leds_keyboradlight:file rw_file_perms;
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/391997
推荐阅读
相关标签
  

闽ICP备14008679号