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
