安卓驱动设备节点权限设置

本文所在的平台是安卓10

前言:

因为安卓本身有自己的一套框架,对于驱动的设备节点而言,开机后会读取一个.rc脚本去改变设备节点的权限。有些刚接触安卓的小白,认为像linux一样用c语言或者java去改写设备权限,一套操作下来发现没用。其实安卓有自己的一套简单的方法提供大家使用。

本人在写应用的时候,需要直接改设备节点的值,但是api是改不了的。

1.设备节点

安卓设备节点,通常是只root用户去读写,其他用户是不可写的。

ls -l

这就导致,我们应用层是无法执行一些cat 或者是echo的操作。

网上有很多介绍一些应用层如何去读写设备节点的方法,在比较新的安卓版本,比如本平台android10是用不了这些的了。所以还得源码修改。

 

2.修改方法

办法一:

简单的,可以用adb修改,但是不用永久,关机重启就没了。

adb root
adb shell
chmod 777 /sys/class/...

ps:如果root不了的话,一样是改不了的。

 

方法二:

在.rc脚本增加权限   本平台路径:/devices/xxx(机子平台,如高通晓龙)/common/rootdir/etc/init.xxx.rc

会发现,有很多这样的改变设备节点的语句。我们把想要修改的节点也照猫画虎的添加上去就行了。

在linux里,也有类似的操作。例如:/etc/profile  .bashrc等。

然后我们重新编译源码就可以了。

 

3.应用修改设备节点

最后,再提供一个apk在有权限后,修改设备节点的一个例子,方法有很多。

package com.retrostation.devicemanager;

import android.util.Log;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StringReader;

public class CmdUtils {

    public static void echoCmd(String cmdPath ,int value){
        String TAG = "CmdUtils";
        Log.e(TAG, "onCheckedChanged: oncethings:"+ value);
        try {
            Process process = Runtime.getRuntime().exec("sh");
            DataOutputStream dos = new DataOutputStream(process.getOutputStream());
            dos.writeBytes("echo "+value+" > "+cmdPath+" \n");
            dos.flush();
            dos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static String catCmd(String cmdPath){
        try {
            String result = "";
            String con = "";
            Process process = Runtime.getRuntime().exec("cat "+cmdPath);
            BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));
            while ((result=br.readLine())!=null){
                con = result + con;
            }
            return con;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "";
    }
}

简单写的一个工具类,本人主要用来cat和echo操作。大家可复制使用。

ps:oncethings是本人的英文名,用作logcat筛选。

 

最后,希望可以帮到大家,如果有用的就收藏一下,白嫖的就点个赞。

<think>好的,用户想知道在安卓设备上操作设备节点需要哪些权限。首先,我需要回忆一下安卓系统的权限管理机制,尤其是涉及到硬件设备节点的部分。设备节点通常位于/dev或者/sys等目录下,访问这些节点通常需要特定的权限。 首先,SELinux是一个关键点,因为即使应用有Linux层的权限,如果SELinux策略禁止访问,也会失败。用户可能需要配置SELinux规则,比如添加允许的type或修改文件上下文。引用[2]和[3]提到了SELinux的权限配置和关闭方法,这可能相关。 然后,Linux文件系统权限设备节点的访问需要对应的读、写、执行权限。例如,/dev节点可能需要用户组权限,比如加入root组或shell组,但普通应用通常无法这样做,所以可能需要系统签名或者root权限。 接下来是安卓权限声明,比如在AndroidManifest.xml中声明普通权限,但设备节点可能涉及更高级别的权限,需要系统应用权限或者使用platform签名。引用[1]提到的权限策略控制,比如读写存储的权限,可能类似,但设备节点可能需要更高的权限。 另外,init.rc中的配置也很重要,如果节点是在启动时创建的,可能需要修改init.rc脚本,确保创建时权限正确。引用[4]提到在init.rc中创建文件节点失败的解决方法,可能需要调整权限或SELinux标签。 还有用户提到系统应用和内置应用的情况,如果是系统应用,可能需要platform签名,并且声明sharedUserId为android.uid.system。普通应用可能无法直接访问,除非有root权限。 最后,可能需要综合应用这些方法:配置SELinux、确保文件系统权限、使用系统签名,或者提权到root。但普通应用很难做到,所以用户可能需要根据具体情况,比如是否是系统开发者,或者需要root设备。</think>在Android系统中操作设备节点涉及多层级权限控制,需同时满足以下条件: ### 一、Linux文件系统权限 设备节点通常位于$ /dev $或$ /sys $目录下,需要对应文件的读写权限: ```bash # 查看节点权限示例 ls -l /dev/input/event0 # 输出:crw-rw---- root input 13, 64 2023-08-01 10:00 event0 ``` 需满足: 1. 用户/组匹配(如加入`input`组) 2. 设置正确读写权限($ chmod 660 /dev/xxx $) ### 二、SELinux策略控制[^2] 即使通过文件系统权限,仍需满足SELinux策略: 1. 进程上下文与文件标签匹配 2. 策略规则允许特定操作类型 ```policy # 示例策略规则 allow process_type device_type:chr_file { read write open }; ``` ### 三、Android权限声明 1. 普通应用需在$ AndroidManifest.xml $声明权限: ```xml <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> ``` 2. 系统级操作需平台签名: ```xml android:sharedUserId="android.uid.system" ``` ### 四、特殊访问场景 1. **Root权限**:通过`su`执行命令 ```java Runtime.getRuntime().exec("echo 1 > /sys/class/leds/lcd-backlight/brightness"); ``` 2. **内核驱动接口**:通过`sysfs`或`procfs`暴露控制接口 ### 五、init.rc配置[^4] 在系统启动时配置节点权限: ```rc on early-init chmod 0660 /dev/ttyS0 chown system system /dev/ttyS0 ```
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值