1. 程式人生 > >[Android] 修改裝置訪問許可權

[Android] 修改裝置訪問許可權

在硬體抽象層模組中,我們是呼叫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命令對它進行解壓。

[email protected]:~/Android$ mv ./out/target/product/generic/ramdisk.img ./ramdisk.img.gz

[email protected]:~/Android$ gunzip ./ramdisk.img.gz

我們先將ramdisk.img改名為ramdisk.img.gz,然後呼叫gunzip命令對它進行解壓。解壓後得到的ramdisk.img檔案儲存在~/Android目錄中。

2. 還原ramdisk.img映象檔案

解壓後得到的ramdisk.img檔案是一個cpio4格式的歸檔檔案,因此,我們可以執行cpio命令對它解除歸檔。

[email protected]:~/Android $ mkdir ramdisk
[email protected]:~/Android $ cd ./ramdisk/
[email protected]:~/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檔案。

[email protected]:~/Android/ramdisk$ rm -f ../ramdisk.img
[email protected]:~/Android/ramdisk$ find . | cpio -o -H newc > ../ramdisk.img.unzip
[email protected]:~/Android/ramdisk$ cd ..
[email protected]:~/Android$ gzip -c ./ramdisk.img.unzip > ./ramdisk.img.gz
[email protected]:~/Android$ rm -f ./ramdisk.img.unzip
[email protected]:~/Android$ rm -R ./ramdisk
[email protected]:~/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/。

相關推薦

[Android] 修改裝置訪問許可權

在硬體抽象層模組中,我們是呼叫open函式來開啟對應的裝置檔案的。例如,在2.3.2小節中開發的硬體抽象層模組freg中,函式freg_device_open呼叫open函式來開啟裝置檔案/dev/freg。 60 if((dev->fd = open(DEVICE

mysql修改外部訪問許可權

  mysql>use mysql; mysql>update user set host =’%’ where user=’root’ mysql>select host,use

android自定義訪問許可權

android 中如果我們想讓我們的activity或service限制別人的訪問,可以加上自定義許可權,只有加上我們定義的許可權才能訪問我們的元件,具體在我們應用中的AndroidManifest.xml 中新增 <permission andr

Android usb 無訪問許可權

usb許可權問題解決辦法: http://stackoverflow.com/questions/11183792/android-usb-host-and-hidden-devices   create  file: /system/etc/permissions/

android裝置許可權為777卻無法訪問的問題

    在android5或5.1的開發中經常會碰到,明明裝置節點是有777的許可權,可是在我們程式中訪問這個裝置卻報Permission denied,無法開啟裝置。     這是因為在Android 5.0或5.1下,採取了SEAndroid/SElinux的安全機制。

Android應用層對裝置訪問許可權的實現

android應用層對裝置的訪問許可權的實現 如果應用程式出現開啟裝置許可權不夠的錯誤,可能是建立裝置節點時賦予的許可權不夠。 問題:攝像頭總是許可權不夠,只能在shell下重新設定可用。 分析:android對裝置節點的管理不是使用udev,在init裡面,syst

shell命令以及執行原理、檢視或修改掩碼(umask)、Linux許可權管理、Linux設定檔案訪問許可權(chmod)、粘滯位、修改檔案的擁有者(chown)、修改檔案的所屬組(chgrp)

shell命令以及執行原理:   Linux嚴格意義上說的是一個作業系統,我們稱之為”核心”,但是我們普通使用者,不能直接使用核心,而是通過核心的”外殼”程式,也就是所謂的shell,來與核心溝通。   Linux中的命令大多數都是可執行程式。但其實捕捉我們

Android 在 SElinux下 訪問許可權的獲取

https://source.android.com/security/selinux/device-policy http://www.cnblogs.com/Ph-one/p/5708836.html https://blog.csdn.net/lqxandroid2012/article/

android在hal下 如何獲得對一個核心節點的訪問許可權

Android 5.0以上,我們發現jni通過hal層去操作核心節點時PERMISSION DENIED 即使在Android原始碼工程目錄下,進入到system/core/rootdir目錄,裡面有一個名為ueventd.rc檔案,往裡面新增一行:/dev/h

django admin 修改原生模板,路徑覆蓋,路徑訪問許可權控制,

(1)修改原生模板 admin管理系統的模板路徑預設為 /usr/lib64/python2.7/site-packages/django/contrib/admin/templates static

使用ES檔案瀏覽器通過Android裝置訪問Win7電腦上的共享檔案

閒話少敘。最近剛入手一臺平板,臺電P85HD雙核(K6N2),各種倒騰。很自然的,想到了通過平板訪問電腦中的檔案,這樣就可以通過平板看電影了。當然,其中一個前提是我的筆記本和平板都在同一個區域網內。 我將筆記本上有電影的資料夾設定了共享,然後在平板上安裝了ES檔案瀏覽器。進

Android各種訪問許可權Permission詳解

在Android的設計中,資源的訪問或者網路連線,要得到這些服務都需要宣告其訪問許可權,否則將無法正常工作。在Android中這樣的許可權有很多種,這裡將各類訪問許可權一一羅列出來,供大家使用時參考之用。 android.permission.EXPAND_STATUS

linux下目錄許可權檢視與修改以及檔案和目錄訪問許可權設定

檢視檔案許可權的語句:   在終端輸入: ls -l xxx.xxx (xxx.xxx是檔名)   那麼就會出現相類似的資訊,主要都是這些: -rw-rw-r--   一共有10位數   其中: 最前面那個 - 代表的是型別   中間那三個 rw- 代表的是所有者(user

android6.0第三方APP獲得裝置節點的訪問許可權

之前使用android4.4的系統進行開發時 system/app(系統自帶APP) 目錄下的 app 可以直接訪問 dev 目錄下的裝置節點,Android 5.0 以後,因為採取了 SEAndroid/SElinux 的安全機制,即使擁有 root許可權,或

Android訪問許可權設定

ACCESS_CHECKIN_PROPERTIES    允許在登入資料庫的時候讀寫其中的屬性表,並上傳改變的值 ACCESS_COARSE_LOCATION    允許應用訪問範圍(如WIFI)性的定位 ACCESS_FINE_LOCATION    允許應用訪問精確(如GPS)性的定位 ACCESS_LO

Android系統檔案安全許可權檢測/system/build.prop修改

Android4.4上修改system/build.prop的檔案許可權後,導致系統不能正常啟動,需把許可權修改回0644,才能正常啟動。 追蹤串列埠,發現錯誤: 由於需要應用修改sytem/build.prop檔案,所以得跳過system/build.prop的檔案安

Android Studio SD卡訪問許可權及asserts資料夾下的檔案操作

Android Studio SD卡訪問許可權 1、在 AndroidManifext.xml 中新增如下程式碼 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /&

Linux原始碼安裝MySQL5.7,修改編碼,給root設定遠端訪問許可權

使用原始碼安裝MySQL 5.7,並且修改編碼為UTF-8,給root賬戶授權,使其能遠端訪問 一、上傳mysql-5.7.16-linux-glibc2.5-x86_64.tar.gz 二、解壓至/usr/local/下     tar -zxvfmysql-5.

Apache修改根目錄沒有訪問許可權問題的解決

關鍵錯誤:You don't have permission to access / on this server 其實我也不是很清楚,這樣修改會出現什麼問題!所以如果是本地除錯的話,可以使用,而應用於伺服器的話,請慎重!否則出現安全問題,本人概不負責! 今天因為要修改 Ap

Android註冊裝置管理器(獲取超級管理員許可權)

注意:一旦一個應用開啟了超級管理員許可權,是不能直接在  設定--->應用程式裡  進行刪除的(刪除失敗)    必須要在  設定--->位置和安全--->選擇裝置管理器  裡取消要刪除應用的啟用  然後再去應用程式裡刪除 1.建立一個DeviceAdmi