具有system許可權的程序無法訪問sdcard

2021-09-30 16:19:43 字數 1989 閱讀 2403

最近遇到乙個問題,之前執行好好的程式,在最近的daily build版本上無法正常執行,後來發現問題是:

我的程式在sdcard中找檔案時找不到,而我shell進去後看到檔案明明存在,而程式對該檔案卻視而不見。折騰了頗久,發現了乙個問題:

正常版本上 adb shell mount 後:

/dev/block/vold/179:19 /storage/sdcard1 vfat rw,dirsync,nosuid,nodev,noexec,relatime,uid=1000,gid=1015,fmask=0002,dmask=0002,allow_utime=0020,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0

不可使用的版本:

/dev/block/vold/179:19 /storage/sdcard1 vfat rw,dirsync,nosuid,nodev,noexec,relatime,uid=1000,gid=1015,fmask=0702,dmask=0702,allow_utime=0020,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0

後來問模組owner才知道:

平台做的改進,禁止具有system許可權的程序訪問sdcard,防止sdcard unmount時,導致system_server程序發生crash,從而被kill掉。

一聽到這個理由後,我真是發飆了,為了解決某個問題而對系統做這麼大的改變,真想投訴那傢伙。

後來到網上搜了一下,發現很多程式設計師遇到這個問題。看來谷歌也是這麼做的,我還能說什麼呢,認命了。

訪問sdcard成功的要素:

androidmanifest..xml中包含:

不能包含:    android:shareduserid="android.uid.system"

如果有system許可權又想訪問sdcard,怎麼辦?

android2.2以後修改

修改/system/core/vold/volume.cpp 檔案

將fat::domount(devicepath, "/mnt/secure/staging", false, false, false, 

1000, 1015, 0702, true))  

修改為:

[html]

fat::domount(devicepath, "/mnt/secure/staging", false, false, false, 

1000, 1015, 0002, true)) 

引數含義:

1000代表的是uid,即sytem

1015代表的是gid,

0002:是對許可權的掩碼

0002:表示 system: rwx-rwxr-x,此時system有讀寫執行許可權

如果system不需要寫許可權可以將0002改為

0202: 表示 r-xrwxr-x。

預設的0702代表 ---rwxr-x

。然後將vold重新編譯一下,用adb push 命令push到 /system/bin/目錄下。重新啟動一下機器就ok了。

對於android 2.1以下:

可以修改/system/core/vold/volmgr_vfat.c

[html]

rc = mount(devpath, vol->mount_point, "vfat", flags,"utf8,uid=1000,gid=1000,fmask=711,dmask=700,shortname=mixed"); 

改為 [html]

rc = mount(devpath, vol->mount_point, "vfat", flags,"utf8,uid=1000,gid=1000,fmask=0,dmask=0,shortname=mixed"); 

這裡的dmask和fmask和上面的作用類似。通過改寫711和700可以配置出不同的許可權。

使apk具有system許可權

使apk具有system許可權的方法 方法一 1.在應用程式的androidmanifest.xml中的manifest節點中加入 android shareduserid android.uid.system 這個屬性。2.修改android.mk檔案,加入local certificate pl...

Oracle中system使用者的實際許可權

之前新建了乙個資料庫,通過pl sql developer登入,使用的是system使用者,身份為sysdba,結果報錯 insufficient privileges 許可權不足 最後只好讓sys使用者登入後執行grant sysdba to system為system使用者賦予sysdba許可權...

linux下建立具有root許可權的帳號

說明 u 0 指將uid指定為0 零 與root相同,登入後的提示符為 而非 o 指因為重複了uid 與root帳號的uid重複 必須指定這個引數.g root 初始化組的組名,當使用者屬於多個組時,在 g引數中指定 登入時所在組。預設該項時,系統新建乙個與使用者名稱同名的組,並且初始化時設為該組名...