android目錄許可權設置許可權
A. 求android系統文件夾media下所有子文件和文件夾的許可權設置
我的也成這樣了,re修改了幾次還沒成功
B. Android的許可權都有哪些
(一)linux文件系統上的許可權
-rwxr-x--x system system 4156 2010-04-30 16:13 test.apk
代表的是相應的用戶/用戶組及其他人對此文件的訪問許可權,與此文件運行起來具有的許可權完全不相關。
比如上面的例子只能說明system用戶擁有對此文件的讀寫執行許可權;system組的用戶對此文件擁有讀、執行許可權;其他人對此文件只具有執行許可權。
而test.apk運行起來後可以干哪些事情,跟這個就不相關了。
千萬不要看apk文件系統上屬於system/system用戶及用戶組,或者root/root用戶及用戶組,就認為apk具有system或root許可權
(二)Android的許可權規則
(1)Android中的apk必須簽名
這種簽名不是基於權威證書的,不會決定某個應用允不允許安裝,而是一種自簽名證書。
重要的是,android系統有的許可權是基於簽名的。比如:system等級的許可權有專門對應的簽名,簽名不對,許可權也就獲取不到。
默認生成的APK文件是debug簽名的。
獲取system許可權時用到的簽名,見:如何使Android應用程序獲取系統許可權
(2)基於UserID的進程級別的安全機制
大家都知道,進程有獨立的地址空間,進程與進程間默認是不能互相訪問的,是一種很可靠的保護機制。
Android通過為每一個安裝在設備上的包(apk)分配唯一的linux userID來實現,名稱為"app_"加一個數字,比如app_43
不同的UserID,運行在不同的進程,所以apk之間默認便不能相互訪問。
Android提供了如下的一種機制,可以使兩個apk打破前面講的這種壁壘。
在AndroidManifest.xml中利用sharedUserId屬性給不同的package分配相同的userID,通過這樣做,兩個package可以被當做同一個程序,
系統會分配給兩個程序相同的UserID。當然,基於安全考慮,兩個package需要有相同的簽名,否則沒有驗證也就沒有意義了。
(這里補充一點:並不是說分配了同樣的UserID,兩程序就運行在同一進程, 下面為PS指令摘取的,
顯然,system、app_2分別對應的兩個進程的PID都不同,不知Android到底是怎樣實現它的機制的)
User PID PPID
system 953 883 187340 55052 ffffffff afe0cbcc S system_server
app_2 1072 883 100264 19564 ffffffff afe0dcc4 S com.android.inputmethod.
system 1083 883 111808 23192 ffffffff afe0dcc4 S android.process.omsservi
app_2 1088 883 156464 45720 ffffffff afe0dcc4 S android.process.acore
(3)默認apk生成的數據對外是不可見的
實現方法是:Android會為程序存儲的數據分配該程序的UserID。
藉助於Linux嚴格的文件系統訪問許可權,便實現了apk之間不能相互訪問似有數據的機制。
例:我的應用創建的一個文件,默認許可權如下,可以看到只有UserID為app_21的程序才能讀寫該文件。
-rw------- app_21 app_21 87650 2000-01-01 09:48 test.txt
如何對外開放?
<1> 使用MODE_WORLD_READABLE and/or MODE_WORLD_WRITEABLE 標記。
When creating a new file with getSharedPreferences(String, int), openFileOutput(String, int), or openOrCreateDatabase(String, int, SQLiteDatabase.CursorFactory), you can use the MODE_WORLD_READABLE and/or MODE_WORLD_WRITEABLE flags to allow any other package to read/write the file. When setting these flags, the file is still owned by your application, but its global read and/or write permissions have been set appropriately so any other application can see it.
(4)AndroidManifest.xml中的顯式許可權聲明
Android默認應用是沒有任何許可權去操作其他應用或系統相關特性的,應用在進行某些操作時都需要顯式地去申請相應的許可權。
一般以下動作時都需要申請相應的許可權:
A particular permission may be enforced at a number of places ring your program's operation:
At the time of a call into the system, to prevent an application from executing certain functions.
When starting an activity, to prevent applications from launching activities of other applications.
Both sending and receiving broadcasts, to control who can receive your broadcast or who can send a broadcast to you.
When accessing and operating on a content provider.
Binding or starting a service.
在應用安裝的時候,package installer會檢測該應用請求的許可權,根據該應用的簽名或者提示用戶來分配相應的許可權。
在程序運行期間是不檢測許可權的。如果安裝時許可權獲取失敗,那執行就會出錯,不會提示用戶許可權不夠。
大多數情況下,許可權不足導致的失敗會引發一個 SecurityException, 會在系統log(system log)中有相關記錄。
(5)許可權繼承/UserID繼承
當我們遇到apk許可權不足時,我們有時會考慮寫一個linux程序,然後由apk調用它去完成某個它沒有許可權完成的事情,很遺憾,這種方法是行不通的。
前面講過,android許可權是經營在進程層面的,也就是說一個apk應用啟動的子進程的許可權不可能超越其父進程的許可權(即apk的許可權),
即使單獨運行某個應用有許可權做某事,但如果它是由一個apk調用的,那許可權就會被限制。
實際上,android是通過給子進程分配父進程的UserID實現這一機制的。
(三)常見許可權不足問題分析
首先要知道,普通apk程序是運行在非root、非system層級的,也就是說看要訪問的文件的許可權時,看的是最後三位。
另外,通過system/app安裝的apk的許可權一般比直接安裝或adb install安裝的apk的許可權要高一些。
言歸正傳,運行一個android應用程序過程中遇到許可權不足,一般分為兩種情況:
(1)Log中可明顯看到許可權不足的提示。
此種情況一般是AndroidManifest.xml中缺少相應的許可權設置,好好查找一番許可權列表,應該就可解決,是最易處理的情況。
有時許可權都加上了,但還是報許可權不足,是什麼情況呢?
Android系統有一些API及許可權是需要apk具有一定的等級才能運行的。
比如 SystemClock.setCurrentTimeMillis()修改系統時間,WRITE_SECURE_SETTINGS許可權好像都是需要有system級的許可權才行。
也就是說UserID是system.
(2)Log里沒有報許可權不足,而是一些其他Exception的提示,這也有可能是許可權不足造成的。
比如:我們常會想讀/寫一個配置文件或其他一些不是自己創建的文件,常會報java.io.FileNotFoundException錯誤。
系統認為比較重要的文件一般許可權設置的也會比較嚴格,特別是一些很重要的(配置)文件或目錄。
如
-r--r----- bluetooth bluetooth 935 2010-07-09 20:21 dbus.conf
drwxrwx--x system system 2010-07-07 02:05 data
dbus.conf好像是藍牙的配置文件,從許可權上來看,根本就不可能改動,非bluetooth用戶連讀的權利都沒有。
/data目錄下存的是所有程序的私有數據,默認情況下android是不允許普通apk訪問/data目錄下內容的,通過data目錄的許可權設置可知,其他用戶沒有讀的許可權。
所以adb普通許可權下在data目錄下敲ls命令,會得到opendir failed, Permission denied的錯誤,通過代碼file.listfiles()也無法獲得data目錄下的內容。
C. Android 如何通過java代碼實現修改指定路徑文件的讀寫許可權。
renameTo(Filedest)方法的來作用是,重新命名此抽象源路徑名表示的文件你用這個只是將該文件換了一個路徑,也就是換了一個位置而已,並不是復制。你要復制的話,貌似只能新建一個文件,該文件的路徑是將原文件復制到的路徑;然後將舊文件的內容讀出來,寫入到新文件中去,這樣就實現了文件的復制
D. 如何在android源碼中給system/etc目錄添加文件並修改其許可權
需要root許可權。
然後Runtime.exec() 調用linux命令。
不過這不是最麻煩的。最麻煩的是,卸載軟體之後。如何恢復原來的
system/etc目錄中的許可權之類的。
E. android的許可權配置文件在哪
首先,這個問題問的有點不太清楚。如果你問是敲代碼的時候配置,那是在AndroidMainfest.xml里邊版寫。
如果權你問的是手機里邊應用配置了許可權的在哪看,這個的話root過後,system/xx/packages.xml這里邊是可以看見所有安裝應用的信息的。中間目錄忘記了,詳情可以網路packages.xml了解。
F. 如何更改Android/date下文件夾的許可權
可以在shell終端下修改/data文件夾的許可權:
命令行執行adb shell 進入shell 。
執行su切換到專root用戶。
chmod 777 /data 使用chmod命令修改屬許可權,注意/data即是需要修改的文件或文件夾。
G. 安卓開發 /system目錄 讀寫 許可權問題
莫非用終端模擬器才能掛載?問題太專業了,皮毛的還能看看。見笑了
H. android系統怎麼設置內部存儲的訪問許可權
Android支持外部存儲(case-insensitive filesystem with immutable POSIX permission classes and modes)。
外部存儲可以通過物理介質提供(如SD卡),也可以通過將內部存儲中的一部分封裝而成,設備可以有多個外部存儲實例。訪問外部存儲的許可權
從Android 1.0開始,寫操作受許可權WRITE_EXTERNAL_STORAGE保護。
從Android 4.1開始,讀操作受許可權READ_EXTERNAL_STORAGE保護。
從Android 4.4開始,應用可以管理在它外部存儲上的特定包名目錄,而不用獲取WRITE_EXTERNAL_STORAGE許可權。
比如,一個包名為com.example.foo的應用,可以自由訪問外存上的Android/data/com.example.foo/目錄。外部存儲對數據提供的保護較少,所以系統不應該存儲敏感數據在外部存儲上。
特別地,配置和log文件應該存儲在內部存儲中,這樣它們可以被有效地保護。對於多用戶的情況,一般每個用戶都會有自己獨立的外部存儲,應用僅對當前用戶的外部存儲有訪問許可權。Environment API的目錄
getDataDirectory():用戶數據目錄。
getDownloadCacheDirectory():下載緩存內容目錄。getExternalStorageDirectory():主要的外部存儲目錄。
但是這個目錄很可能當前不能訪問,比如這個目錄被用戶的PC掛載,或者從設備中移除,或者其他問題發生,你可以通過getExternalStorageState()來獲取當前狀態。
還有多用戶或者多外部存儲的情況,此文不再討論。為了不污染用戶的根命名空間,一般不會直接使用這個外部存儲的根目錄。
任何應用私有的文件的應該被放置在 Context.getExternalFilesDir返回的目錄下,在應用被卸載的時候,系統會清理的就是這個目錄。
另一些共享文件應該被放置在 (String)返回的目錄中。
寫這個路徑需要 WRITE_EXTERNAL_STORAGE許可權,讀需要 READ_EXTERNAL_STORAGE許可權,當然寫許可權默認包含了讀許可權。從KITKAT 即Android 4.4開始,如果你的應用只是需要存儲一些內部數據,可以考慮使用 :
getExternalFilesDir(String)或者getExternalCacheDir(),它們不需要獲取許可權。(String type)這個方法接收一個參數,表明目錄所放的文件的類型,傳入的參數是Environment類中的DIRECTORY_XXX靜態變數,比如DIRECTORY_DCIM等。
注意:傳入的類型參數不能是null,返回的目錄路徑有可能不存在,所以必須在使用之前確認一下,比如使用File.mkdirs創建該路徑。getRootDirectory()得到Android的根目錄。
isExternalStorageEmulated()設備的外存是否是用內存模擬的,是則返回true。(API Level 11)
isExternalStorageRemovable()設備的外存是否是可以拆卸的,比如SD卡,是則返回true。(API Level 9)Context API中的目錄
getExternalFilesDir(String type)是應用在外部存儲上的目錄。
和Environment類的(String type)方法類似,返回包含參數指定的特定類型文件的子目錄。
getExternalCacheDir()是應用的在外部存儲上的緩存目錄。從Android 4.4這兩個方法不需要讀寫許可權,是針對於本應用來說,如果要訪問其他應用的相關目錄,還是需要聲明讀寫許可權。
Android 4.4之前的版本要訪問的話還是要聲明讀寫許可權的,如果沒有在manifest中寫許可權,上面兩個get方法都會返回null。與上面兩個方法形成對比的是下面兩個方法:
getFilesDir()
getCacheDir()
這兩個方法得到的是內存上的目錄。這些目錄都是屬於應用的,當應用被卸載的時候,裡面的內容都會被移除,但是不要依賴於系統的操作。
I. Android 的許可權管理是怎麼實現的
根據用戶的使用過程體驗,可以將 Android 涉及的許可權大致分為如下三類:
(1)Android 手機所有者許可權:自用戶購買 Android 手機後,用戶不需要輸入任何密碼,就具有安裝一般應用軟體、使用應用程序等的許可權;
(2)Android root 許可權:該許可權為 Android 系統的最高許可權,可以對所有系統中文件、數據進行任意操作。出廠時默認沒有該許可權,需要使用 z4Root 等軟體進行獲取,然而,並不鼓勵進行此操作,因為可能由此使用戶失去手機原廠保修的權益。同樣,如果將 Android 手機進行 root 許可權提升,則此後用戶不需要輸入任何密碼,都將能以 Android root 許可權來使用手機。
(3)Android 應用程序許可權:Android 提供了豐富的 SDK(Software development kit),開發人員可以根據其開發 Android 中的應用程序。而應用程序對 Android 系統資源的訪問需要有相應的訪問許可權,這個許可權就稱為 Android 應用程序許可權,它在應用程序設計時設定,在 Android 系統中初次安裝時即生效。值得注意的是:如果應用程序設計的許可權大於 Android 手機所有者許可權,則該應用程序無法運行。如:沒有獲取 Android root 許可權的手機無法運行 Root Explorer,因為運行該應用程序需要 Android root 許可權。
Android 系統許可權定義
Android 系統在 /system/core/private/android_filesystem_config.h 頭文件中對 Android 用戶 / 用戶組作了如下定義,且許可權均基於該用戶 / 用戶組設置。
值得注意的是:每個應用程序在安裝到 Android 系統後,系統都會為其分配一個用戶 ID,如 app_4、app_11 等。以下是 Calendar 和 Terminal 軟體在 Android 系統中進程瀏覽的結果(其中,黑色字體標明的即為應用分配的用戶 ID):
在 Android 系統中,上述用戶 / 用戶組對文件的訪問遵循 Linux 系統的訪問控制原則,即根據長度為 10 個字元的許可權控制符來決定用戶 / 用戶組對文件的訪問許可權。該控制符的格式遵循下列規則:
第 1 個字元:表示一種特殊的文件類型。其中字元可為 d( 表示該文件是一個目錄 )、b( 表示該文件是一個系統設備,使用塊輸入 / 輸出與外界交互,通常為一個磁碟 )、c( 表示該文件是一個系統設備,使用連續的字元輸入 / 輸出與外界交互,如串口和聲音設備 ),「.」表示該文件是一個普通文件,沒有特殊屬性。
2 ~ 4 個字元:用來確定文件的用戶 (user) 許可權;
5 ~ 7 個字元:用來確定文件的組 (group) 許可權;
8 ~ 10 個字元:用來確定文件的其它用戶 (other user,既不是文件所有者,也不是組成員的用戶 ) 的許可權。
第 2、5、8 個字元是用來控制文件的讀許可權的,該位字元為 r 表示允許用戶、組成員或其它人可從該文件中讀取數據。短線「-」則表示不允許該成員讀取數據。
第 3、6、9 位的字元控制文件的寫許可權,該位若為 w 表示允許寫,若為「-」表示不允許寫。
第 4、7、10 位的字元用來控制文件的製造許可權,該位若為 x 表示允許執行,若為「-」表示不允許執行。
舉個例子,「drwxrwxr-- 2 root root 4096 2 月 11 10:36 lu」表示的訪問控制許可權(黑色字體標明)為:因為 lu 的第 1 個位置的字元是 d,所以由此知道 lu 是一個目錄。第 2 至 4 位置上的屬性是 rwx,表示用戶 root 擁有許可權列表顯示 lu 中所有的文件、創建新文件或者刪除 lu 中現有的文件,或者將 lu 作為當前工作目錄。第 5 至 7 個位置上的許可權是 rwx,表示 root 組的成員擁有和 root 一樣的許可權。第 8 至 10 位上的許可權僅是 r--,表示不是 root 的用戶及不屬於 root 組的成員只有對 lu 目錄列表的許可權。這些用戶不能創建或者刪除 lu 中的文件、執行 junk 中的可執行文件,或者將 junk 作為他們的當前工作目錄。
Android 應用程序許可權申請
每個應用程序的 APK 包裡面都包含有一個 AndroidMainifest.xml 文件,該文件除了羅列應用程序運行時庫、運行依賴關系等之外,還會詳細地羅列出該應用程序所需的系統訪問。程序員在進行應用軟體開發時,需要通過設置該文件的 uses-permission 欄位來顯式地向 Android 系統申請訪問許可權。