2012年5月28日 星期一

Android應用程序如何訪問/sys和/proc等目錄下的系統文件

http://blog.csdn.net/silvervi/article/details/6315548


Android 下應用程序不能直接 獲得 root 權限,因此如果需要修改 /sys  /proc 等目錄下的文件時,有以下兩種方法可以選擇:

  1. 通過 service 或虛擬設備的方法將使得應用程序臨時 獲得 root 權限
  2.  /sys  /proc 目錄下的文件修改訪問權限,使得它們能夠被程序訪問

對於方法 ,可以參看我後續會寫到的一篇文章《如何使 Android 應用程序獲得 root 權限》,也可以在網上搜索別的相關文章。

這裡講講方法 

為了理解方法 ,首先要知道 Android 上的權限機制。 Android 會為每個安裝在系統上的包( apk )配一個唯一的 linux userID ,名稱為 "app_" 加一個數字,比如 app_43 。這樣該應用程序的文件只對該用戶可見,也就是說,應用程序只能訪問相同 uid  gid 的文件。
另外,也可以通過 AndroidManifest.xml 修改應用程序的 uid 。如果將 android:sharedUserId 項的值改為其它apk  java package name ,則該應用程序和所指定的應用程序擁有相同的 uid ,可以訪問對方的文件。
通過 android:sharedUserId 還可以將應用程序提升為 system 權限。

有了上面的知識,這裡有三種方法來修改我們所要訪問的文件:
  1. 將文件改為 777 權限
  2. 將文件改為 apk  uid  gid
  3. 將文件修改為 system  uid ,同時將 apk 也提升為 system 權限

這三種方法都需要修改所要訪問系統文件的權限。要更改權限,在 init.rc 文件中添加相應的命令即可。下述命令就將 /dev/cpuctl/tasks 修改為 system  uid  gid ,並且將其權限更改為 777 
chown system system /dev/cpuctl/tasks
chmod 0777 /dev/cpuctl/tasks

修改 init.rc 該文件需要修改 ramdisk.img ,具體修改方法可以網上搜索,也可以參看這篇文章最後的附錄。或者在源代碼中直接修改 init.rc 文件然後編譯即可。

下面依次分析一下上面提到的三種修改訪問文件的方法。第一種方法是最簡單的,不過安全性不好,僅僅可以作為實驗使用,不推薦;第二種方法將系統文件文件的 uid 修改後,拓展性不好,並且我不能確定每次分配給apk  uid 是否相同。我這裡試了幾次,重新安裝後 apk  uid 都是相同的,不過沒有找到相關文章,所以不敢用。最後我這裡採用第三種方法實現。

1)首先修改 init.rc
chown system system /sys/bus/usb/devices/testfile

這樣每次啟動後,系統都會執行 init.rc 文件將 testfile  uid 修改為 system ,這樣 uid 同問 system 的程序就能夠訪問該文件了。

2) 其次將 apk 提升為 system 權限

 apk 提升為 system 權限需要目標系統中的簽名文件對 apk 進行簽名,因此這種方法僅適用於某個 rom ,不能用於所有 rom 
具體的提升辦法網上有很多,這裡不再多說,可以參考這兩篇文章:

至此,我們的目標就達成了。

 修改 ramdisk.img 的方法

在網上找到了一些修改 ramdisk.img 的方法,都有點問題,我這裡寫一下自己的流程。由於 ramdisk.img 是首先用 cpio 打包,再用 gzip 壓縮後的文件,因此在解壓和壓縮時都需要經歷這兩個步驟。

1)    mv ramdisk.img ramdisk.img.gz
2)    gunzip ramdisk.img.gz   #gunzip 解壓得到 ramdisk.gz
3)    cpio –iI ramdisk.gz   #  cpio 解壓上一步得到的文件
4)    修改 init.rc
5)    find. | cpio –o –H newc | gzip -9 > ramdisk.gz    #cpio 打包後, gzip 再壓縮
6)    mv ramdisk.gz ramdisk.img

沒有留言:

張貼留言