我們在 Android 10 中首次引入了 "分區存儲" 的概念,旨在保護應用和用戶數據并減少文件混亂。自此之後我們收到了開發者們的寶貴建議,這些建議有助于我們對該功能的持續優化,非常感謝大家!基于反饋,我們在 Android 11 上做了一些值得注意的改進。例如,我們啟用了對媒體文件的 直接文件路徑訪問功能,用于改善現有代碼和程序庫的兼容性。我們理解許多應用在采取分區存儲方案前需要有周密的方案,以便持續支撐現有用戶的訪問,确保符合當前存儲方案的最佳實踐以及向後兼容性。
基于與開發者們的探讨和在開發者論壇上的活躍讨論,我們準備了這份有關存儲的常見問題和解答,以幫助您更好地了解分區存儲的各種能力、行為變化和一些限制等。我們在過去的文章推送裡發布過關于 Android 存儲方案的最佳實踐,您可以先回顧一下最佳實踐的這篇 文章。
分區存儲允許應用通過 File API 使用文件路徑訪問文件嗎?我們意識到某些應用會通過代碼或程序庫直接訪問媒體文件路徑。因此,在 Android 11 上,擁有可讀取外部存儲權限的應用,均可在分區存儲環境中通過文件路徑訪問文件。在 Android 10 的設備上,除非在 manifest 中通過主動聲明 requestLegacyExternalStorage 屬性來選擇停用分區存儲,否則上述方法是無效的。
為了确保不同 Android 版本間的連續性,如果您應用的目标版本是 Android 10 或者是更高版本,您應該選擇不啟用。更多詳細信息,請參閱文末相關閱讀 Android 存儲方案的最佳實踐上下篇。
與媒體存儲 API 相比,文件路徑訪問的性能表現如何?性能表現非常依賴具體應用場景。對于像視頻播放這樣的擁有順序讀取的操作,文件路徑訪問的性能表現與媒體存儲相差無幾。但是在随機讀寫的情境下,采取文件路徑的方法最多可慢一倍。為了最快、最穩定的讀寫,我們推薦您使用 Media Store API。
我的應用需要廣泛地訪問共享存儲,存儲訪問框架是我唯一的選擇嗎?存儲訪問框架 (簡稱 "SAF") 用于用戶授予對目錄和文件的訪問權限,但是需要您注意的是,SAF 對某些目錄的授權仍存在限制,例如根目錄和 Android/data 目錄。雖說大多數應用在存儲訪問時都可以通過我們最佳實踐的方式去實現,例如使用 SAF 或媒體存儲 API,但在某些應用場景下可能會需要更廣泛地訪問共享存儲,亦或是無法通過最佳實踐來有效地訪問。針對上述情況,我們增加了 MANAGE_EXTERNAL_STORAGE 權限,允許程序訪問外部存儲上的所有文件 (除了 Android/data 和 Android/obb 目錄)。我們在 7 月發布了一個 Google Play 政策更新,提到了關于存儲的相關内容,請點擊 這篇微信文章 查看。
哪些類别的應用應該申請 MANAGE_EXTERNAL_STORAGE 權限?MANAGE_EXTERNAL_STORAGE 權限适用于核心應用場景需要廣泛地訪問設備上的文件的情況,但使用分區存儲的最佳實踐無法高效地實現此功能的那些應用。當然,列出所有可能的應用場景是不切實際的,但其包括了文件管理器、備份和還原、反病毒程序或生産力文件編輯器等使用場景。
使用 Storage Access Framework (存儲訪問框架),是否需要 Google Play 的政策批準?Storage Access Framework (存儲訪問框架,簡稱 SAF) 從 Android 4.4 開始就已經存在。通過 SAF 訪問文件時,會讓用戶參與文件選擇,從而使用戶可以更好地控制文件的訪問。Google Play 上沒有與之相關的政策。
與 Android 10 相比,在 Android 11 上使用 SAF 會有其他限制嗎?目标版本為 Android 11 (API 級别為 30) 并使用 SAF 的應用,将不會被授予某些目錄訪問權限,例如 SD 卡上的根目錄和下載目錄。無論是哪個目标 SDK,都無法在 Android 11 上通過存儲訪問框架訪問 Android/data 和 Android/obb 目錄。訪問 官方文檔 了解關于這些限制和測試相關行為的方法。
應用該如何測試分區存儲的變化?通過這些 兼容性标志,應用可以測試與直接文件路徑訪問或媒體存儲 API 相關的分區存儲行為。還有另一個 兼容性标志,也可用來測試使用存儲訪問框架訪問某些路徑時的限制。
分區存儲中的應用,是否僅限于将文件寫入其應用 data 目錄上?在分區存儲中,應用可以将 媒體項添加 到媒體存儲集合。媒體存儲會根據文件類型,将文件放置于組織有序的文件夾中,例如 DCIM、Movies 和 Download 等。對于所有此類文件,應用可以繼續通過文件 API 來訪問。得益于系統為每個媒體存儲文件賦予了應用屬性,應用不需要有存儲權限也可以讀寫到它們最初提供給媒體存儲的文件。
Data Column 棄用之後,有沒有對此功能的其他使用建議?在 Android 10 上,位于分區存儲環境中的應用無法通過文件路徑訪問文件。為了與這一設計保持一緻,我們随後廢棄了 DATA column。根據大家的反饋,即需要使用已有的 native 代碼或程序庫,Android 11 現已支持在分區存儲中的應用訪問文件路徑的功能。相應地,DATA Column 實際上在某些情況下其實是有用的。為了在媒體存儲中插入和更新,使用分區存儲的應用應使用 DISPLAY_NAME 和 RELATIVE_PATH Column,它們不再需要使用 DATA Column 來完成此功能。當讀取磁盤中文件的媒體存儲實例時,DATA Column 将具備有效的文件路徑,該路徑可被文件 API 或 NDK 文件程序庫使用。但應用要準備處理任何關于此類操作帶來的 I/O 錯誤,而且不應該假設文件始終是可用的。
對于選擇退出分區存儲的應用,它們何時開始必須兼容分區存儲?在運行 Android 11 或更高版本的設備上。當目标版本被設置為 Android 11 或更高版本時,應用便會被放入到分區存儲中。
建議使用什麼方法來遷移分區存儲之外的數據?preserveLegacyExternalStorage 标記允許應用在升級系統時保留原有存儲權限,即使是升級至 Android 11。需要注意的是,在 Android 11 上這個标記對新安裝的應用起不到任何作用。将目标版本設為 Android 11 之前,請修改代碼以适配分區存儲。請參閱文末相關閱讀 Android 存儲方案的最佳實踐上下篇,來獲取數據遷移最佳實踐的相關信息吧。
針對某些軟件包安裝程序 (例如應用商店) 需要訪問 Android/obb 目錄,是否有任何例外情況?持有 REQUEST_INSTALL_PACKAGES 權限的應用可以訪問其他應用的 Android/obb 目錄。請注意,此權限享有簽名級别的保護。
我們希望您計劃适配分區存儲時這份 FAQ 能為您提供一些幫助。請點擊閱讀原文或查看文末相關閱讀文章,了解我們的最佳實踐文檔。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!