广州的网站建设,linux网站开发工具,上海外包公司网站建设,企业自适应网站建设在硬件抽象层模块中#xff0c;我们是调用open函数来打开对应的设备文件的。例如#xff0c;在2.3.2小节中开发的硬件抽象层模块freg中#xff0c;函数freg_device_open调用open函数来打开设备文件/dev/freg。 60 if((dev-fd open(DEVICE_NAME, O_RDWR)) -1) { 61 … 在硬件抽象层模块中我们是调用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命令对它进行解压。 USERMACHINE:~/Android$ mv ./out/target/product/generic/ramdisk.img ./ramdisk.img.gz USERMACHINE:~/Android$ gunzip ./ramdisk.img.gz 我们先将ramdisk.img改名为ramdisk.img.gz然后调用gunzip命令对它进行解压。解压后得到的ramdisk.img文件保存在~/Android目录中。 2. 还原ramdisk.img镜像文件 解压后得到的ramdisk.img文件是一个cpio4格式的归档文件因此我们可以执行cpio命令对它解除归档。 USERMACHINE:~/Android $ mkdir ramdisk USERMACHINE:~/Android $ cd ./ramdisk/ USERMACHINE:~/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文件。 USERMACHINE:~/Android/ramdisk$ rm -f ../ramdisk.img USERMACHINE:~/Android/ramdisk$ find . | cpio -o -H newc ../ramdisk.img.unzip USERMACHINE:~/Android/ramdisk$ cd .. USERMACHINE:~/Android$ gzip -c ./ramdisk.img.unzip ./ramdisk.img.gz USERMACHINE:~/Android$ rm -f ./ramdisk.img.unzip USERMACHINE:~/Android$ rm -R ./ramdisk USERMACHINE:~/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/。