在硬件抽象层模块中,我们是调用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. notepad++中的python缩进问题

    现在并没有遇到什么卵问题,但查到资料说会有问题,先记一笔,tab自动换4个空格 cmd /k "$(FULL_CURRENT_PATH)" & PAUSE & EX ...

  2. C语言文件读写

    1.用fopen打开文件 该函数的原型为FILE *fopen(const char *filename, const char *mode),第一个参数是文件名,第二个参数是打开文件的模式. 打开文 ...

  3. JAVA日历

    效果图如下: import java.awt.*; import java.awt.event.*; import java.util.*; import javax.swing.*; import ...

  4. Volley网络请求框架的基本用法

    备注: 本笔记是参照了 http://blog.csdn.net/ysh06201418/article/details/46443235  学习之后写下的 简介:  Volley是google官网退 ...

  5. C++字符串函数与C字符串函数比较

    赋值拷贝: #include <iostream> #include <string> using namespace std; void main(){ string a=& ...

  6. iOS网络编程总结

    好长时间没有进行更行了,最近学到AFNetworking框架,在学习完成之后做出一个总结 1.第三方网络的框架 AFNEtworking使用简单,对最新的iOS特性都有很好的支持,对NSURL进行了封 ...

  7. jQuery手风琴广告展示插件

    效果说明:当鼠标移动到已折叠广告的标题后,折叠当前已展开的广告,并同步展开相应的折叠广告.这种Accordion效果,看似简单,但因为存在动画同步的问题,不能简单地用两个animate()来实现.必须 ...

  8. MySQL字符串类型转换时间类型

    如果MySQL数据库里面的某个时间用的是varchar(或者是char)类型的,这样可以方便系统使用而不用随便转换时间类型来适应数据库版本的不同,当要把取出的字段转换成时间类型的时候,可以按如下方法操 ...

  9. Windows Server R2服务器 IIS7 部署MVC3网站

    报错:调用 GetProcAddress 失败,在 ISAPI 筛选器 "C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi ...

  10. hggroup和adress

    hggroup通常放在标签内部,不过不做强制要求! ​adress 通常用于作者的联系信息.比如名字,Email,电话,地址.标签内字体显示斜体. ​ 与 标签的比较:比div简洁,更少的用到id或c ...