在硬件抽象层模块中,我们是调用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] 修改设备访问权限的更多相关文章

  1. Android系统修改硬件设备访问权限

    Android系统修改硬件设备访问权限 在硬件抽象层模块文件(so)文件中,提供的函数调用open函数来打开设备文件,比如/dev/gpio,如果不修改设备文件/dev/gpio的访问权限,那么应用程 ...

  2. android 65 文件访问权限

    package com.itheima.createfile; import java.io.File; import java.io.FileNotFoundException; import ja ...

  3. 修改Apache访问权限

    You don't have permission to access / on this server.错误,居然说我此台服务器上无权限,ok解决办法如下: 找到:apache文件,进入conf文件 ...

  4. ubuntu 下修改文件访问权限chmod 777 -R *血的教训!没事别乱开权限!用谁开谁的就行。。。最后不要用这个命令,文件操作全部改用终端

    本文转自: 个人建议 Ubuntu下修改目录权限命令如下:chmod 600 name (只有所有者有读和写的权限)chmod 644 name (所有者有读和写的权限,组用户只有读的权限)chmod ...

  5. ubuntu修改文件访问权限

    遇到“bash .....权限不够”的问题时, 从控制台进入到那个文件夹 chmod 777 * -R 全部子目录及文件权限改为 777

  6. Android修改system只读权限

    在Root后的真机上使用adb remount命令不知道为什么不行. 但有些时候还是想向system文件夹下面写文件,例如把tcpdump工具放到/system/bin 下面,然后就可以直接使用tcp ...

  7. mysql修改外部访问权限

    mysql>use mysql; mysql>update user set host =’%’ where user=’root’ mysql>select host,user f ...

  8. 在ubuntu下真机调试android程序出现设备没有访问权限

    今天把android的开发环境从windows平台切换到了ubuntu上. java jdk android-adt android-ndk都下好,环境变量都配好之后, 在调试程序的时候,出现设备没有 ...

  9. Android开发,缺少权限导致无法修改原文件,获取所有文件访问权限的方法

    在Android 11开发中,app会遇到使用绝对路径无法打开某文件的情况(文件存在根目录下,获取到的路径为:/storage/emulated/0/XXX.txt),而使用相对路径打开文件后(获取到 ...

随机推荐

  1. 查看帮助文档的一些方法:help,dir,type,func_global等

    help与dir与type:在使用python来编写代码时,会经常使用python自带函数或模块,一些不常用的函数或是模块的用途不是很清楚,这时候就需要用到help函数来查看帮助.这里要注意下,hel ...

  2. asp.net 音乐播放器

    <HTML> <HEAD><TITLE>Playback Example</TITLE> </HEAD> <BODY> < ...

  3. [leetcode] 405. Convert a Number to Hexadecimal

    https://leetcode.com/contest/6/problems/convert-a-number-to-hexadecimal/ 分析:10进制转换成16进制,不能用库函数,刚开始,我 ...

  4. [leetcode] 398. Random Pick Index

    我是链接 看到这道题,想到做的几道什么洗牌的题,感觉自己不是很熟,但也就是rand()函数的调用,刚开始用map<int, vector<int >>来做,tle,后来就想着直 ...

  5. 2016/7/6 神·CPU的人类极限在哪?

    额,这其实是个搞怪贴 #include<stdio.h>int main(void){ int i,k; for(i=0;;i++) { k=i+222222222; printf(&qu ...

  6. [Effective Objective-C 读书笔记] 第1章 几条基本写法 (2~5条)

    我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3575599.html,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体验 ...

  7. 转载 shell sort

    http://blog.sina.com.cn/s/blog_6d09b5750100x6zg.html 首先是shell排序实现多列排序,这里添加竖线以作分割,如下文件test: a|gggg|4| ...

  8. 用EPPlus导入导出数据到excel

    项目上中要用到将数据库中所有表导出为Excel,以及将Excel数据导入数据库中的操作,使用EPPlus组件,编写以下两个函数. using OfficeOpenXml;using OfficeOpe ...

  9. svn 相关

    // svn相关内容,windows下的可以根据网上的,安装客户端和服务器端安装成功后,可以在服务器端中的 Repositories中建立相关的项目库文件夹,右键相应的文件夹可以复制相关的 url,一 ...

  10. FBWF和EWF的对比

    最近在公司接触了嵌入式的wes7系统,wes7和wes2009是组件化的windows系统,除具有最新版的windows功能之外还具有适用于嵌入式系统的一些嵌入式功能,如例如EWF,FBWF. FBW ...