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

摘要:
在linux系统中,可通过udev规则在系统启动时修改设备文件的访问权限,但在Android系统中没有实现udev规则,而是提供uevent机制,可以在系统启动时修改设备文件的访问权限。当Android系统启动时,会把ramdisk.img镜像文件中的ueventd.rc文件安装在设备根目录下,并且由init进程来解析它的内容和修改相应的设备访问权限:图1所以只要我们能够修改ramdisk.img镜像文件中的ueventd.rc文件的内容,就可以修改设备文件/dev/gpio的访问权限了,下面介绍详细的修改办法。

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 0666root 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进程来解析它的内容和修改相应的设备访问权限:

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

图1

所以只要我们能够修改ramdisk.img镜像文件中的ueventd.rc文件的内容,就可以修改设备文件/dev/gpio的访问权限了,下面介绍详细的修改办法。

1.查看ramdisk.img文件格式

在mediateksourcekernel race32目录下可以找到hsimobile77_ics2_ramdisk.img文件,在out argetproducthsimobile77_ics2下有ramdik.img,我也把

hsimobile77_ics2_ramdisk.img拷贝到此目录下,用file命令来查看着两个文件(大小一样)的类型,却不一样,分别是gzip compressed data,from unix和ramdisk.img,很奇怪为什么不一样。下面以hsimobile77_ics2_ramdisk.img举例。

Android系统修改硬件设备访问权限第2张

图2

2.解压hsimobile77_ics2_ramdisk.img

从图2可知hsimobile77_ics2_ramdisk.img是一个gzip文件,所以我们可以执行gunzip文件来解压。

Android系统修改硬件设备访问权限第3张

图3

先将hsimobile77_ics2_ramdisk.img该名为ramdisk.img.gz,然后用gunzip命令对它解压,加压后得到的ramdisk.img文件保存在cw6577目录中。

3.还原ramdisk.img镜像文件

解压后的ramdisk.img文件是一个cpio格式的文件(包含其他文件盒有关信息的归档文件),因此我们可以执行cpio命令对它解除归档:

Android系统修改硬件设备访问权限第4张

图4

解除归档后的内容保存在ramdisk目录下,如下图:

Android系统修改硬件设备访问权限第5张

图5

4.修改ueventd.rc文件

进入图5的目录,修改ueventd.rc文件,增加下面的内容:

/dev/gpio 0666root root

5.重新打包ramdisk.img镜像文件

先把ramdisk目录归档成为cpio文件,然后压缩成为gzip文件

Android系统修改硬件设备访问权限第6张

图6

免责声明:文章转载自《Android系统修改硬件设备访问权限》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇WPF笔记一关于ESB(企业服务总线)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

gitlab 笔记

#http://www.jianshu.com/p/060e7223e211?open_source=weibo_search docker stop gitlabdocker stop redisdocker stop postgresqldocker rm gitlabdocker rm redisdocker rm postgresql docker...

python连接服务器上传文件,后台执行命令

上传文件 import osimport paramikoimport loggingfrom django.core.cache import cachefrom YunTai import settings def upload_files(connectIp): ssh = paramiko.Transport((connectIp, 22...

Linux磁盘设备文件(sda,sdb,sdc…)变化问题

在Linux下往往会碰到这样的问题,磁盘的设备文件,比如/dev/sda, sdb, sdc等等在某些情况下会混乱掉,比如sda变成了sdb或者sdc变成了sdb等等,这样无形中会导致磁盘设备管理的混乱,最常见的比如Linux文件系统的启动问题。很多人在遇到这种问题的时候都去找磁盘、阵列厂家,怀疑是他们的问题,其实这种底层的磁盘(单个磁盘或者RAID阵...

Centos7下oracle配置(详细)

一、硬件配置 CentOS7@VMware® Workstation 15 Pro,分配资源:CPU:2颗,内存:4GB,硬盘空间:30GB 二、软件准备  linux.x64_11gR2_database_1of2.zip linux.x64_11gR2_database_2of2.zip SecureCRT 三、虚拟机的配置 挂载镜像,配置本地yum源...

STM32 串口采用DMA方式收发

FROM:https://blog.csdn.net/gdjason/article/details/51019219 什么是DMA —- Directional Memory Access, 直接存储器存取用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU干预,数据可以通过DMA快速地移动,这就节省了CPU的资源来做其他操作 我...

CentOS7安装配置telnet-server

CentOS7安装配置telnet-server 1.安装xinetd和telnet-server yum -y install telnet-server xinetd 2.启服务(服务管理方式和CentOS6稍有区别) systemctl enable xinetd.server systemctl enable telnet.socket sy...