Android系统修改硬件设备访问权限
在硬件抽象层模块文件(so)文件中,提供的函数调用open函数来打开设备文件,比如/dev/gpio,如果不修改设备文件/dev/gpio的访问权限,那么应用程序通过JNI接口来调用硬件抽象层提供的函数接口来调用open函数打开设备文件就会失败,这表示当前用户没有权限打开设备文件/dev/gpio文件。在默认情况下,只有root用户才有权限访问系统的设备文件,由于一般的应用程序没有root权限的。
为了解决上面的问题,需要为用户赋予访问设备文件/dev/gpio的权限。在linux系统中,可通过udev规则在系统启动时修改设备文件的访问权限,但在Android系统中没有实现udev规则,而是提供uevent机制,可以在系统启动时修改设备文件的访问权限。
在system/core/rootdir目录下有一个名为ueventd.rc的配置文件,我们可以再里面增加下面一行内容来修改设备文件/dev/freg的访问权限
/dev/gpio 0666 root root
这表示所有的用户均可以访问设备文件/dev/gpio,修改了ueventd.rc文件后可以重新编译Android源代码工程才能生效,但为了节省时间可通过另一种简单的方式。
在编译Android系统时,文件/system/core/rootdir/uevent.rc会被拷贝到/out/target/product/prj/root目录下,并且最终打包在ramdisk.img镜像文件(最小的文件系统,它包括了初始化android系统所需要的全部核心文件)中。当Android系统启动时,会把ramdisk.img镜像文件中的ueventd.rc文件安装在设备根目录下,并且由init进程来解析它的内容和修改相应的设备访问权限:
图1
所以只要我们能够修改ramdisk.img镜像文件中的ueventd.rc文件的内容,就可以修改设备文件/dev/gpio的访问权限了,下面介绍详细的修改办法。
1. 查看ramdisk.img文件格式
在\mediatek\source\kernel\trace32目录下可以找到hsimobile77_ics2_ramdisk.img文件,在\out\target\product\hsimobile77_ics2下有ramdik.img,我也把
hsimobile77_ics2_ramdisk.img拷贝到此目录下,用file命令来查看着两个文件(大小一样)的类型,却不一样,分别是gzip compressed data,from unix和ramdisk.img,很奇怪为什么不一样。下面以hsimobile77_ics2_ramdisk.img举例。
图2
2. 解压hsimobile77_ics2_ramdisk.img
从图2可知hsimobile77_ics2_ramdisk.img是一个gzip文件,所以我们可以执行gunzip文件来解压。
图3
先将hsimobile77_ics2_ramdisk.img该名为ramdisk.img.gz,然后用gunzip命令对它解压,加压后得到的ramdisk.img文件保存在cw6577目录中。
3. 还原ramdisk.img镜像文件
解压后的ramdisk.img文件是一个cpio格式的文件(包含其他文件盒有关信息的归档文件),因此我们可以执行cpio命令对它解除归档:
图4
解除归档后的内容保存在ramdisk目录下,如下图:
图5
4. 修改ueventd.rc文件
进入图5的目录,修改ueventd.rc文件,增加下面的内容:
/dev/gpio 0666 root root
5. 重新打包ramdisk.img镜像文件
先把ramdisk目录归档成为cpio文件,然后压缩成为gzip文件
图6