最近遇到乙個問題,之前執行好好的程式,在最近的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引數中指定 登入時所在組。預設該項時,系統新建乙個與使用者名稱同名的組,並且初始化時設為該組名...