安卓 Q | 8大場景全面解析應用儲存沙箱化
為增強使用者隱私與資料安全,加強應用對共享檔案訪問許可權的管理,在Android Q中使用者可通過新的執行時許可權允許應用訪問照片、視訊或音訊等檔案。此外,Android Q規定應用必須通過系統檔案選擇器才能訪問下載檔案,這也就意味著,應用的訪問許可權完全由使用者掌控。
接下來,我們將針對Android Q Beta 1測試版本在隱私和安全保護方面新增的特性和變更進行介紹,手把手教您該如何進行適配。由於文章篇幅限制,本文將重點為大家介紹新增特性以及這些變更所帶來的相容性影響。
儲存空間的限制
Android Q對應用的裝置儲存空間進行了限制,針對外部儲存空間引入了一些新的變更,主要變更點總結如下:
1、儲存沙箱:Android Q為每個應用程式在外部儲存裝置提供了一個獨立的儲存沙箱,應用直接通過檔案路徑儲存的檔案都會儲存在應用的沙箱目錄中,另外應用解除安裝時預設所有應用沙箱目錄會同時被刪除。
2、共享集合:不希望應用解除安裝刪除的檔案,需要應用通過MediaProvider或者SAF的方式儲存在公共共享集合目錄中,公共集合目錄包括:多媒體檔案集合(音訊、視訊和圖片)以及下載檔案集合。
3、許可權變更:應用讀寫自己沙箱和共享集合目錄中應用自己的檔案時是不需要申請任何許可權的,但是如果應用需要讀取其它應用生成的多媒體檔案就需要申請許可權:
■ 讀取其它應用存放在共享集合的圖片和視訊檔案,需要應用分別申請READ_MEDIA_IMAGES和READ_MEDIA_VIDEO許可權,具體要申請哪個許可權取決於應用需要訪問的檔案型別;
■ 讀取其它應用存放在共享集合的音樂型別檔案,需要應用申請READ_MEDIA_AUDIO許可權;
■ 讀取其它應用生成的多媒體檔案,需要通過MediaProvider介面讀取,無法直接通過文件路徑讀取;
■ 系統只提供了多媒體檔案的讀取許可權,沒有提供寫入許可權,應用無法通過申請寫入許可權修改其它應用生成的檔案;
■ 下載目錄的檔案沒有增加對應的許可權,讀取下載目錄的檔案需要通過SAF的方式讀取;
4、寫入 其它應用的多媒體檔案:需要通過申請成為預設系統圖庫和音樂應用,或者讓使用者主動授權的方式實現。
5、需要讀寫指定任意目錄的檔案:只能通過SAF的方式實現。
6、谷歌提供的相容性方案:
■ 許可權相容方案: 應用的TargetSdkVersion<Q,並且申請了老的READ_EXTERNAL_STORAGE/WRITE_EXTERNAL_STORAGE儲存許可權,會自動轉成新增加的三個許可權,動態授權彈框提示的也是新的許可權彈框;
■ Hota升級相容性方案: 該特性只對新安裝的應用生效,對於Android Q之前的手機已經安裝的應用,並且授予了老的儲存許可權,hota升級到Q版本之後,該應用不會受到該特性的影響;
7、目前版本該特性沒有預設開啟,需要開發者通過命令開啟:adb shell sm set-isolated-storage on。
相容性影響
Android Q針對外部儲存空間引入的變更可以說影響很大,只要是涉及到需要讀取其它應用檔案的場景都可能存在問題,應用現在無法通過路徑讀寫其它應用生成的所有檔案,只能通過MediaProvider介面和SAF方式去讀寫其它應用的檔案。
為方便廣大應用廠商重點排查應用可能存在的問題,下面列舉了一些可能出現問題的場景,供開發者進行參考:
場景一:檔案共享
問題1:應用通過其它社交類軟體分享檔案給好友,提示檔案不存在;
問題2:應用使用其它應用開啟檔案,提示檔案不存在;
問題原因分析:
1、分享方使用了file:// URI分享。
從上方日誌可以看出QQ分享檔案使用的是file URI,該檔案儲存在應用的沙箱目錄,其它應用是沒有許可權直接通過檔案路徑訪問其它應用的沙箱目錄下檔案的,所以報錯。
2、在實際測試後發現,接收方不支援Content URI的分享場景,也會導致檔案分享有問題,需要檔案接收方適配支援Content URI。
場景二:讀取應用沙箱外非多媒體檔案
問題1:檔案管理器只能看到應用自己生成的檔案,無法檢視其它應用的檔案;
問題2:社交類應用給好友分享本地檔案出現本地檔案找不到的問題;
問題原因分析:
應用通過路徑只能訪問應用沙箱目錄的檔案,其它沙箱外的任意檔案是無法直接通過檔案路徑的方式訪問。
場景三:讀取應用沙箱外多媒體檔案
問題1:讀本地多媒體檔案為空的問題;
問題2:修改使用者頭像失敗;
問題原因分析:
可能原因1:MediaProvider的“_data”返回值變更導致的問題,Q版本“_data”值不再是多媒體檔案的真實路徑,應用通過該返回值判斷檔案是否存在是有問題的;
可能原因2:SAF使用的方式有問題,我們發現有些應用通過SAF的方式更換使用者頭像失敗的問題,具體原因需要進一步分析;
場景四:修改和刪除其它應用生成的檔案
問題1:一些相簿應用無法刪除其它應用儲存的圖片和視訊檔案。
問題2:手機管家垃圾檔案無法刪除和清理問題。
問題3:檔案管理無法刪除其它應用的檔案問題。
問題原因分析:
老的儲存權READ_EXTERNAL_STORAGE/WRITE_EXTERNAL_STORAGE廢棄,替換成新的儲存許可權android.permission.READ_MEDIA_AUDIO、android.permission.READ_MEDIA_IMAGES和android.permission.READ_MEDIA_VIDEO,並且只提供了多媒體檔案的讀取許可權,未提供寫入許可權,現在應用沒有許可權直接刪除其它應用生成的任何檔案,包括多媒體檔案。
場景五:儲存檔案
問題1:應用儲存檔案到公共集合目錄,路徑變化問題,比如/sdcard/DCIM/。
問題2:應用儲存檔案到沙箱外任意指定目錄,路徑變化問題,比如sdcard根目錄。
使用者通過es檔案瀏覽器在sdcard根目錄新建目錄“測試路徑變化問題”
通過adb檢視檔案建立的真實路徑為:
問題原因分析:
應用通過路徑生成的檔案預設都儲存在應用自己的沙箱目錄。
場景六:應用解除安裝
問題1:應用解除安裝,使用者主動儲存的檔案被刪除問題。
問題原因分析:
目前在實際測試中發現很多應用都會直接通過路徑的方式將不希望解除安裝刪除的檔案儲存在SD卡根目錄下面應用自己建立的目錄;但在Q版本同樣的方式建立的這些檔案都會被儲存在應用的沙箱目錄,這部分檔案在Q之前的版本應用解除安裝的時候是不會刪除,但是在Q版本都會被刪除,這樣就會導致使用者主動儲存的一些檔案全部被刪除。
場景七:Hota升級
問題1:Hota升級到Q版本之後,應用解除安裝重新安裝導致應用資料丟失的問題。
問題原因分析:
儲存空間限制特性只對新安裝的應用生效,對於Android Q之前的手機已經安裝的應用,並且授予了老的儲存許可權,hota升級到Q版本之後,該應用不會受到該特性的影響。如果是hota升級到Q版本的應用,不受影響,應用解除安裝之後,通過路徑的方式儲存在SD卡根目錄的應用的這些檔案不會被刪除,和Q版本之前保持一致。但如果應用重新安裝這個應用,屬於新安裝的應用場景,又會受到該特性的影響,之前解除安裝未刪除的這些檔案,應用無法直接通過路徑訪問。
場景八:許可權申請
TargetSdkVersion>=Q的應用,需要適配增加新的儲存許可權申請,否則會報許可權問題。