[Android] 修改设备访问权限

在硬件抽象层模块中,我们是调用open函数来打开对应的设备文件的。例如,在2.3.2小节中开发的硬件抽象层模块freg中,函数freg_device_open调用open函数来打开设备文件/dev/freg。
60 if((dev->fd = open(DEVICE_NAME, O_RDWR)) == -1) { 61       LOGE("Failed to open device file /dev/freg -- %s.", strerror(errno)); 62       free(dev); 63       return -EFAULT; 64 }

如果不修改设备文件/def/freg的访问权限,那么应用程序调用freg_device_open函数打开设备文件/def/freg就会失败,从第61行的日志输出可以看到下面的内容:

Failed to open /dev/hello -- Permission denied.

这表示当前用户没有权限打开设备文件/dev/freg。在默认情况下,只有root用户才有权限访问系统的设备文件。由于一般的应用程序是没有root用户权限的,因此,这里就会提示没有权限打开设备文件/dev/freg。

解决这个问题的办法是,赋予root之外的其他用户访问设备文件/dev/freg的权限。我们知道,在Linux系统中,可以通过udev规则在系统启动时修改设备文件的访问权限3。然而,Android系统并没有实现udev机制,因此,我们就不可以通过定义udev规则来赋予root之外的其他用户访问设备文件/dev/freg的权限。不过,Android提供了另外的一个uevent机制,可以在系统启动时修改设备文件的访问权限。

在system/core/rootdir目录下有一个名为ueventd.rc的配置文件,我们可以在里面增加以下一行内容来修改设备文件/dev/freg的访问权限。

/dev/freg                 0666   root       root

这表示所有的用户均可以访问设备文件/dev/freg,即可以打开设备文件/dev/freg,以及读写它的内容。这样,除了root用户之外,系统中的其他用户也可以调用freg_device_open函数来打开设备文件/dev/freg。

修改了ueventd.rc文件后,需要重新编译Android源代码工程,这样新修改的设备文件/dev/freg的访问权限才能生效。这里,我们介绍一种不必重新编译Android源代码工程就可以使得修改后的设备文件/dev/freg的访问权限生效的方法。

在编译Android源代码工程时,文件system/core/rootdir/ueventd.rc会被拷贝到out/target/product/generic/root目录下,并且最终打包在ramdisk.img镜像文件中。当Android系统启动时,会把ramdisk.img镜像文件中的ueventd.rc文件安装在设备根目录中,并且由init进程来解析它的内容和修改相应的设备文件的访问权限。因此,只要我们能够修改ramdisk.img镜像文件中ueventd.rc文件的内容,就可以修改设备文件/dev/freg的访问权限。接下来就详细介绍修改ramdisk.img镜像文件中ueventd.rc文件的方法。

1. 解压ramdisk.img镜像文件

镜像文件ramdisk.img是一个gzip文件,因此,我们可以执行gunzip命令对它进行解压。

[email protected]:~/Android$ mv ./out/target/product/generic/ramdisk.img ./ramdisk.img.gz

[email protected]:~/Android$ gunzip ./ramdisk.img.gz

我们先将ramdisk.img改名为ramdisk.img.gz,然后调用gunzip命令对它进行解压。解压后得到的ramdisk.img文件保存在~/Android目录中。

2. 还原ramdisk.img镜像文件

解压后得到的ramdisk.img文件是一个cpio4格式的归档文件,因此,我们可以执行cpio命令对它解除归档。
[email protected]:~/Android $ mkdir ramdisk [email protected]:~/Android $ cd ./ramdisk/ [email protected]:~/Android /ramdisk$ cpio -i -F ../ramdisk.img

解除归档后得到的文件保存在~/Android/ramdisk目录中。

3. 修改ueventd.rc文件

进入到~/Android/ramdisk目录中,找到ueventd.rc文件,并且往里面增加以下一行内容:

/dev/freg                  0666   root       root

这一行内容赋予了系统中的所有用户访问设备文件/dev/freg的权限。

4. 重新打包ramdisk.img镜像文件

重新打包ramdisk.img镜像文件的过程其实就是第1步和第2步的逆过程,即先把ramdisk目录归档成cpio文件,然后压缩成gzip文件。
[email protected]:~/Android/ramdisk$ rm -f ../ramdisk.img [email protected]:~/Android/ramdisk$ find . | cpio -o -H newc > ../ramdisk.img.unzip [email protected]:~/Android/ramdisk$ cd .. [email protected]:~/Android$ gzip -c ./ramdisk.img.unzip > ./ramdisk.img.gz [email protected]:~/Android$ rm -f ./ramdisk.img.unzip [email protected]:~/Android$ rm -R ./ramdisk [email protected]:~/Android$ mv ./ramdisk.img.gz ./out/target/product/generic/ramdisk.img

这样,重新打包后得到的ramdisk.img镜像文件中的ueventd.rc文件就修改好了,系统在启动之后就会通过init进程来赋予系统中的所有用户访问设备文件/dev/freg的权限。 _______________________________________ 3 udev是Linux 2.6内核新增的一个功能,用来替代原来的devfs,是Linux系统默认的设备管理工具。udev  机制以守护进程的形式运行,通过侦听内核发出来的uevent来管理/dev目录下的设备文件,包括添加或者删除设备文件、修改设备文件的访问权限等。 4 cpio是一种包含其他文件和有关信息的归档文件,具体可以参考http://www.gnu.org/software/cpio/。

时间: 2024-10-11 16:38:51

[Android] 修改设备访问权限的相关文章

修改进程访问权限

OpenProcessToken 要对一个任意进程(包括系统安全进程和服务进程)进行指定了写相关的访问权的OpenProcess操作,只要当前进程具有SeDeDebug权限就可以了.要是一个用户是Administrator或是被给予了相应的权限,就可以具有该权限.可是,就算我们用Administrator帐号对一个系统安全进程执行OpenProcess(PROCESS_ALL_ACCESS,FALSE, dwProcessID)还是会遇到“访问拒绝”的错误.什么原因呢?原来在默认的情况下进程的一

Android基础--文件访问权限

1.Android 底层是Linux内核,因此文件访问权限与Linux中文件访问权限类似 d   rwx   rwx   rwx 文件类型 owner group other 文件类型   d 代表文件夹,-代表文件,l 代表链接 owner文件创建的用户 group 与文件创建者在同一组的其他用户 other 与文件创建者不在同一组的其他用户 Android中每一个应用都对应独立的用户,不同应用所在组是不同的,可以通过设置是两个应用在同一个组中   2.以下是在当前应用的私有空间内创建文件时指

修改文件访问权限

Cacls.exe显示或者修改文件的访问控制表(ACL)CACLS filename [/T] [/E] [/C] [/G user:perm] [/R user [...]]               [/P user:perm [...]] [/D user [...]]   filename      显示 ACL.   /T            更改当前目录及其所有子目录中                 指定文件的 ACL.   /E            编辑 ACL 而不替换.

android下文件访问权限

文件权限:   - --- --- --- 一共有10个 表示符 第一个 - :d-->表示文件夹   l-->表示 快捷方式  -  表示 的为文件 第(2-4):表示当前用户权限    rw-  可读可写     rwx   可读可写可执行 第(5-7):表示当前用户组所在权限 第(8-10): 表示 除当前组之外的其他权限 如上图所示 : 私有文件权限 : - rw- rw- --- 对应的二进制    110 110 000     十进制 660 可读文件权限 : - rw- rw-

ubuntu 下修改文件访问权限chmod 777 -R *

本文转自: 个人建议 Ubuntu下修改目录权限命令如下:chmod 600 name (只有所有者有读和写的权限)chmod 644 name (所有者有读和写的权限,组用户只有读的权限)chmod 700 name (只有所有者有读和写以及执行的权限)chmod 666 name (每个人都有读和写的权限)chmod 777 name (每个人都有读和写以及执行的权限) 其中 name 指文件名,也可以是目录名. 整个命令的形式是chmod ×××(所有者)×××(组用户)×××(其他用户)

Android修改system只读权限

在Root后的真机上使用adb remount命令不知道为什么不行. 但有些时候还是想向system文件夹下面写文件,例如把tcpdump工具放到/system/bin 下面,然后就可以直接使用tcpdump命令抓包 后来查了下,还是有解决的办法的,步骤如下 C:\Users\Liuming\adb shell $su #mount # mount -o remount /dev/block/mtdblock0 /system# mount 这是system就不是只读的了,可以写文件了 但不知怎

android进阶之文件访问权限

android是基于linux的,所以文件访问权限和linux一样.其中r代表可读,W代表可写,X代表可执行. 文件访问权限分三组. 1-3 当前用户(应用)访问权限. 4-6 当前用户所在组的访问权限. 7-9 其他用户(应用)访问权限. android应用是一个独立的用户,对应一个独立的组. 可以通过如下指令来查看用户组和用户ID: 强制修改文件访问权限: - --- --- --- (第一个-代表目录,后面是三组的权限- 代表0) - rw- --- --- (代表当前用户可读可写)(对应

Android文件访问权限

文件访问权限 Android的文件访问权限控制和linux一样. 文件访问权限:谁能访问这个文件.使用drwxrwxrwx这是个字符控制 第一个字母 d:表示文件夹 -:表示文件 后面每三个字母分为一组 第一组: rwx 是文件拥有者的权限 r:read,读 w:write,写 x:execute,执行 -:表示没有该权限 第二组:rwx表示的是和文件拥有者同属于一组的用户对文件拥有的权限 r:read,读 w:write,写 x:execute,执行 -:表示没有该权限 第三组:rwx表示其他

部分关键字--this/extends/super/static/final/abstract/访问权限总结

1.this关键字的作用 1)调用本类中的属性; 2)调用本类中的构造方法;且只能放首行,且必须留一个构造方法作为出口,即不能递归调用 3)表示当前对象; 2.匿名对象 直接new出来的对象,不创建变量名,且只能使用一次,通常作为方法的参数及返回值使用 3.继承 关键字:extends 通过继承,子类可以直接访问父类中非私有的属性及方法 只允许单继承,但是可以多层继承 子类对象的实例化过程是先调用父类的构造器,再调用子类的构造器; 子类程序调用方法,先调用子类方法,如果子类没有再调用父类中的方法