• Android 应用层如何操作设备节点


    前言:

    有时应用需要访问设备节点,来进行节点进行操作,来达到控制设备的目的,一种是设备是在固定在主板上的,一种是需要usb进行插拔的设备。
    两种方式添加的位置是有差别的。
    第一种设备方式如下:

    • 在init.rc文件中添加该设备的权限
    on post-fs-data
        setprop debug.delaytime.min 10
        setprop debug.delaytime.mid 100
        setprop debug.delaytime.max 1000
        setprop debug.android_watchdog.disable 1
    	
    	chmod 666 /sys/devices/virtual/light_state
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    第二种设备方式如下:

     src/system/core/rootdir/ueventd.rc
    
    • 1

    ueventd.rc文件还是有一定的修改规则

    /dev/tty*                 0777   root       system
    
    • 1

    ueventd.rc文件中的内容大致为这样,第一列表示要修改的设备节点;第二列为修改后的权限;第三列为该节点的用户,注意,不要尝试去修改该节点的用户,很有可能修改导致修改失败。

    整编译软件在out目录下面搜索该文件:find -name init.rc,如果该文件中存在添加加节点的代码,那就说明添加成功了.

    • 应用层向该设备节点写入值
    public static final String LIGHT_POWER_PATH = "/sys/devices/virtual/light_state";
    private void setLightOn() {
      
       try {
          Writer light_tunetoch = new FileWriter(LIGHT_POWER_PATH );
          light_tunetoch .write(frequency);
          light_tunetoch .flush();
          light_tunetoch .close();
       } catch (IOException e) {
          Log.i(TAG, "setLightOn()   IOException e "+e.getMessage());
          e.printStackTrace();
       }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    这样写入值出现问题点如下:
    应用层往设备节点写值出现了没有权限问题,日志如下

    IOException e = /sys/devices/virtual/light_state: open failed: EACCES (Permission denied)
    
    
    • 1
    • 2

    出现这种情况,一般是权限问题。
    解决方案:
    方法1:关闭selinux

    adb root; adb shell setenforce 0
    
    • 1

    方法2:添加权限.

    common/sepolicy/platform_app.te
    common/sepolicy/file.te
    common/sepolicy/file_contexts
    
    • 1
    • 2
    • 3

    在file.te文件添加自己自定义的文件名,并给予文件类型

    type sysfs_fm, fs_type,sysfs_type;
    
    • 1

    在platform_app.te文件中添加如下

    allow platform_app sysfs_fm:file {getattr open write read};
    
    
    • 1
    • 2

    在file_contexts文件中让代码中的节点与自定义文件名关联 [u:object_r表示当前用户 s0表示等级,最低权限等级]

    /sys/devices/virtual//power_state     u:object_r:sysfs_fm:s0
    /sys/devices/virtual//tunetoch     u:object_r:sysfs_fm:s0
    
    • 1
    • 2
  • 相关阅读:
    PieCloudDB Database 3.0 正式发布丨数仓虚拟化技术为数据要素流转注入创新动能
    vue3组合式api的函数系列一
    隐藏文件夹怎么显示?显示文件夹的方法竟然这么简单!
    Nacos配置管理-统一配置管理、配置自动刷新、多环境多服务共享配置
    MobPush 厂商通道SDK集成指南
    红外平行光管ZEMAX光学设计/SOLIDWORKS
    蓝桥杯每日一题2023.11.5
    ASP.NET添加MVC控制器报错
    【java核心技术】Java知识总结 -- 异常
    npm install:Could not resolve dependency:peer...
  • 原文地址:https://blog.csdn.net/houxian1103/article/details/126564961