天天看点

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      

第二种设备方式如下:

src/system/core/rootdir/ueventd.rc      

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

/dev/tty*                 0777   root       system      

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();
   }
}      

这样写入值出现问题点如下:

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

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

出现这种情况,一般是权限问题。

解决方案:

方法1:关闭selinux

adb root; adb shell setenforce 0      

方法2:添加权限.

common/sepolicy/platform_app.te
common/sepolicy/file.te
common/sepolicy/file_contexts      

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

type sysfs_fm, fs_type,sysfs_type;      
allow platform_app sysfs_fm:file {getattr open write read};      
/sys/devices/virtual//power_state     u:object_r:sysfs_fm:s0
/sys/devices/virtual//tunetoch     u:object_r:sysfs_fm:s0