[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命令对它进行解压。
USER@MACHINE:~/Android$ mv ./out/target/product/generic/ramdisk.img ./ramdisk.img.gz
USER@MACHINE:~/Android$ gunzip ./ramdisk.img.gz
我们先将ramdisk.img改名为ramdisk.img.gz,然后调用gunzip命令对它进行解压。解压后得到的ramdisk.img文件保存在~/Android目录中。
2. 还原ramdisk.img镜像文件
解压后得到的ramdisk.img文件是一个cpio4格式的归档文件,因此,我们可以执行cpio命令对它解除归档。
USER@MACHINE:~/Android $ mkdir ramdisk USER@MACHINE:~/Android $ cd ./ramdisk/ USER@MACHINE:~/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文件。
USER@MACHINE:~/Android/ramdisk$ rm -f ../ramdisk.img USER@MACHINE:~/Android/ramdisk$ find . | cpio -o -H newc > ../ramdisk.img.unzip USER@MACHINE:~/Android/ramdisk$ cd .. USER@MACHINE:~/Android$ gzip -c ./ramdisk.img.unzip > ./ramdisk.img.gz USER@MACHINE:~/Android$ rm -f ./ramdisk.img.unzip USER@MACHINE:~/Android$ rm -R ./ramdisk USER@MACHINE:~/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/。
[Android] 修改设备访问权限的更多相关文章
- Android系统修改硬件设备访问权限
Android系统修改硬件设备访问权限 在硬件抽象层模块文件(so)文件中,提供的函数调用open函数来打开设备文件,比如/dev/gpio,如果不修改设备文件/dev/gpio的访问权限,那么应用程 ...
- android 65 文件访问权限
package com.itheima.createfile; import java.io.File; import java.io.FileNotFoundException; import ja ...
- 修改Apache访问权限
You don't have permission to access / on this server.错误,居然说我此台服务器上无权限,ok解决办法如下: 找到:apache文件,进入conf文件 ...
- ubuntu 下修改文件访问权限chmod 777 -R *血的教训!没事别乱开权限!用谁开谁的就行。。。最后不要用这个命令,文件操作全部改用终端
本文转自: 个人建议 Ubuntu下修改目录权限命令如下:chmod 600 name (只有所有者有读和写的权限)chmod 644 name (所有者有读和写的权限,组用户只有读的权限)chmod ...
- ubuntu修改文件访问权限
遇到“bash .....权限不够”的问题时, 从控制台进入到那个文件夹 chmod 777 * -R 全部子目录及文件权限改为 777
- Android修改system只读权限
在Root后的真机上使用adb remount命令不知道为什么不行. 但有些时候还是想向system文件夹下面写文件,例如把tcpdump工具放到/system/bin 下面,然后就可以直接使用tcp ...
- mysql修改外部访问权限
mysql>use mysql; mysql>update user set host =’%’ where user=’root’ mysql>select host,user f ...
- 在ubuntu下真机调试android程序出现设备没有访问权限
今天把android的开发环境从windows平台切换到了ubuntu上. java jdk android-adt android-ndk都下好,环境变量都配好之后, 在调试程序的时候,出现设备没有 ...
- Android开发,缺少权限导致无法修改原文件,获取所有文件访问权限的方法
在Android 11开发中,app会遇到使用绝对路径无法打开某文件的情况(文件存在根目录下,获取到的路径为:/storage/emulated/0/XXX.txt),而使用相对路径打开文件后(获取到 ...
随机推荐
- 20个linux命令行工具监视性能(下)
昨天晚上第一次翻译了<20 Command Line Tools to Monitor Linux Performance>中的前十个命令,翻译得不是很好,今天晚上继续把后面的十个也翻译给 ...
- CSS3的几个标签速记1
border-radius:CSS3圆角 语法:border-radius:25px; 椭圆边角:语法-border-radius:xx%;或者15px/100px; box-shadow ...
- 九度OJ 1528 最长回文子串 -- Manacher算法
题目地址:http://ac.jobdu.com/problem.php?pid=1528 题目描述: 回文串就是一个正读和反读都一样的字符串,比如"level"或者"n ...
- OpenJudge 2774 木材加工
1.链接: http://bailian.openjudge.cn/practice/2774/ 2.题目: 总Time Limit: 1000ms Memory Limit: 65536kB Des ...
- centos 6.4 安装php-fpm 及常用扩展,(转)
今天又装了一次开发环境,以前忘记记录了 这次记录一下 ---------------------------------------- centos6 yum安装nginx.php-fpm 时间201 ...
- WF4的数据库 表
WF4的数据库 表 SQL 建表 SqlPersistenceProviderSchema.sql InstanceData 实例数据表 SqlPersistenceService_Schema.sq ...
- div重叠不变形
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- 《Effective Java》读书笔记
一.引言 1.几条基本规则:(清晰性和简洁性最为重要) 模块的用户永远也不应该被模块的行为所迷惑(那样就不清晰了),模块要尽可能小,但又不能太小 代码应该被重用,而不是被拷贝 模块之间的依赖性应该尽可 ...
- controller.pp 各组件的安装顺序
controller 属性: admin_address => $controller_node_address, public_address => $c ...
- eclipse:java.lang.OutOfMemoryError: PermGen space 最简单的解决方式
我使用的工具是STS, Eclipse同理: 打开如下界面: 左则选择项目启动使用的Tomcat-->在右侧面板Tab项中选择" Arguments":在VM argumen ...