#安卓11沙盒機制


來源連接:https://sspai.com/post/61168

還存儲空間一片清朗:Android 的「沙盒」機制何時到來?

2020年07月01日
新的媒體控制中心、針對聊天消息的「對話泡」、包含智能家居控制中心和移動支付卡包的電源鍵菜單……盡管疫情打亂了幾乎所有發布活動的節奏,不久前公布的 Android 11 測試版本還是為我們帶來了不少新看點。

關聯閱讀:Android 11 的新功能確定就是它們了!

在我們能夠直接感知到的視覺變化和功能改進之下,一些更加底層、但又與每位 Android 用戶的最終體驗息息相關的改動也不容小視,這當中最令開發者和用戶關注的,莫過於曾在 Android 10 開發者預覽版中短暫亮相、后來因為兼容性問題而不得不推遲的「沙盒」機制——即分區存儲(scoped storage)特性了。

隨着 Android 11 測試版在一加、小米、OPPO 等 OEM 機型中相繼落地,分區存儲特性距離我們其實也已經越來越近了。在這篇文章中,我們將對 Android 存儲機制的原理、現狀、存在的問題以及分區存儲特性如何解決這些問題進行解釋和說明。

你想要的「沙盒」究竟還有多遠?Android 11 是非常關鍵的一個版本。

內置存儲亂象從何而來

打開系統自帶的文件瀏覽器,順便再打開「顯示隱藏文件」之類的開關——如果沒有用存儲空間隔離(以前也叫 存儲重定向)進行過處理,存儲空間中所包含的文件和文件夾就絕對不只有 標准文件目錄。

在這樣的外部存儲空間中找個文件好比大海撈針,但「看着很亂」並非當前 Android 存儲機制帶來的唯一問題。

在 A 應用被授予存儲空間讀寫權限1的同時,這個應用也獲得了讀取存儲空間中所有公共目錄和公共文件的權限;恰好 B 應用獲取到的設備標識符、用戶畫像等隱私數據並未按照規范進行存儲,我們的隱私數據就這樣成為了散落在存儲空間中不受絲毫保護的、在「毒瘤應用」之間公開交換的廉價產品。

關聯閱讀:隱私保護更嚴格的 Android 10 之后,國產應用這樣對你進行廣告追蹤

現階段,一個應用能夠讀寫的文件夾分為兩種:一種是位於 ​sdcard/Android/data​ 的私有目錄,其他第三方應用不能讀寫,對於一個應用來說屬於內部目錄;另一種是請求了文件權限之后的內置存儲空間,也就是你打開文件管理器后看到的那個亂糟糟的界面,對於一個應用來說這屬於外部目錄。

在外部目錄中應用如何創建文件夾、創建文件夾用來干嘛、可以創建多少文件與文件夾……現階段 Android 系統並不能通過細致的讀寫權限進行強制干涉,授予了一個應用存儲空間讀寫權限,幾乎等同於給了它一張可以在外部存儲空間中隨意穿梭的通行證。因此也就有了上面提到的外部存儲空間亂象。

所以 Android 系統的開放文件系統在為用戶進行文件管理交互助力的同時,也在眾多不規范應用的濫用之下成為了妨害用戶實際體驗和隱私數據的鑰匙。

從這個角度來說,Google 什么時候強制推行「沙箱存儲」特性其實都不算晚。

分區存儲如何解決上述問題

分區存儲是 Google 在 Android 10 中引入的新特性,在 Android 10 的測試過程中,由於用戶遇到的兼容性問題和開發者社區的反饋,這個原本將在 Android 10 正式版中生效的機制最終推遲。

但 Google 不可能就此放棄分區存儲,相反,Android 11 還進一步對這一機制進行了完善。根據 Google 的 設想,采用分區存儲特性后的存儲空間主要會帶來這樣幾個變化:

系統能知道每個文件夾的來歷,方便用戶管理
卸載應用時能夠一並移除應用相關文件夾
應用寫入外部存儲的文件對其他應用來說不可見
用戶下載的文件對大多數應用不可見
為了實現這樣的目標,Google 在 Android 11 中采用了下列方法來對存儲空間的使用規范進行梳理:

寫入不再隨心所欲

相比以往應用申請外部存儲讀寫權限就能隨意讀取、寫入外部存儲空間目錄和文件的做法,以 Android 11 為目標平台進行開發和適配的應用所能夠申請到的外部存儲訪問權限變更為只讀權限。

如需寫入,應用還需要單獨申請「所有文件訪問權限」,該權限在 Play 應用商店后續的指南和 規范 中進一步被明確為面向文件管理器、文件備份工具等特殊應用才能申請的權限。

這一改動從根源上斷絕了應用隨意讀取外部存儲空間目錄、文件甚至其他應用文件的可能性。

一個應用一個「沙箱」

在上述前提下,應用在外部存儲空間中能夠寫入的文件自然也從我們在本文第一部分中提到的公開的、宛如「自由貿易市場」的外部目錄變成了應用專屬的外部目錄(app-specific files)。

專屬,意味着這個目錄對除了這個應用本身以外的其他應用而言是絕對不可見的,這也就是我們俗稱的隔離或應用「沙盒」。

以大家所熟知的「全家桶」應用 A 和應用 B 為例,在以往的外部存儲空間機制作用下,應用 A 可以直接向外部存儲空間寫入 5 個垃圾文件夾並在其中一個文件夾里放上我們的隱私數據,擁有同樣訪問權限的應用 B 不僅可以參考應用 A 的做法創建 15 個垃圾文件,同時還能順便讀取一下應用 A 獲取到的隱私數據。

分區存儲機制雙向切斷了這種讀寫路徑,在分區存儲機制下,應用 A 和應用 B 只能把撿來的垃圾和死纏爛打要來的小秘密放在各自的小盒子里;同時小盒子和小盒子之間也不互通,應用 A 和應用 B 不再擁有交互數據的機會。

因此對這類應用而言,如何將自己包裝成為「文件管理工具」並騙過 Google Play 的審核機制也許才是今后的唯一出路了。

借規范接口良性互通

不過這樣一來又會產生新的問題:

微信要怎么發送瀏覽器下載的圖片呢?2

對於這些需要在應用間共享的多媒體(圖片、音頻、視頻)和文檔(如 PDF、電子書等等)文件,Google 提供了一個 API 來方便應用將多媒體和文檔文件存儲至標准的公用目錄,如根目錄下的 ​/Pictures​。如果要讀取多媒體文件,在用戶授予了存儲權限后,應用可以通過 MediaStore​ 這個 API 來讀取這些標准公用目錄中的文件。

如果需要讀寫非多媒體類的其他下載文件,則需要通過支持 存儲訪問框架(Storage Access Framework)的文件選取器進行,所以在分區存儲機制下如果微信想要發送文件給其他人,還必須舍棄掉當前自己采用的那套並不規范的文件選取器。

采用標准 SAF 框架的文件選取器(左)和微信「自主研發」的文件選取器

最后,針對諸如 Solid Explorer 這種第三方文件管理器和鈦備份、Swift Backup 這類備份工具,就像我們上面所提到的那樣,Google 引入一個特殊的權限​來賦予其讀寫所有共享存儲空間文件(包括非多媒體文件)的權限,但這個權限的作用范圍依然不包括應用專屬目錄(內部和外部目錄)。

注:Swift Backup 開發者已經通過 Google 官方提供的途徑提交了適配 Android 11 和分區存儲特性的新版本。

總體來說,分區存儲機制下,應用對於外置存儲的讀寫將被隔離至獨立的沙盒文件夾中而非真正的根目錄,以此避免了污染存儲空間的問題;需要在多個應用間傳遞的文件數據的行為也將更多地借助規范 API 和系統組件來進行。

對 Android 平台而言,直接讀寫原始文件的「蠻荒時代」即將過去。

第三方應用何時適配

眾所周知,一些開發者擅長利用「拖字訣」逃避 Google 的規范要求,好在 Google 也意識到了這一點。近年來 Google 對 Play 商店上架的應用提出了一個又一個看似嚴格的強制要求,無形之中推動着 Android 應用生態一點點向好。此前強制要求 64 位架構分發就是個例子,這個規定直接促成了微信這類「優秀產品」針對 64 位架構設備進行了適配。

針對分區存儲,Google 考慮到兼容問題為應用開發者留出了充足的時間來進行適配工作,但同時也規定了「應用的 SDK 不能比當前主要 Android 版本低一個版本以上」,這個有點繞的規定用更直白的方式來解釋即是 2021 年上架 Play 商店應用的 SDK 版本不能低於 Android 11(SDK 30)。

大家不妨這樣理解:如果某個應用想要用上新的功能和接口,適配的 API 和系統版本肯定要跟上;而每個 SDK 對應了一個系統版本,比如 SDK 30 對應的就是 Android 11。因此上面的規定自然就可以理解為,2021 年年底之前,至少所有在 Google Play 上架的應用都必須適配即將於今年第三季度推出正式版本的 Android 11。

大家翹首以盼的分區存儲特性,屆時自然也會作為一項默認規范全面鋪開。

而就目前來說,已知適配了分區存儲特性的國產應用不多,QQ 在不久前調整了下載文件的存儲機制,但總體而言文件結構依然不符合規范;百度系 App 此前也公布過類似的 適配計划,目前未見實裝。對國內應用而言適配「沙箱」特性所剩下的時間並不算多。

更重要的是,在我們已經談論了近 20 年「全球化」話題的今天,部分國產應用依然可以依靠不在海外運營、規避 Play 商店上架、提供第三方下載和安裝方式等方法來避過這一機制,Android 的存儲空間能否真正迎來天朗氣清,其實還需要屏幕前的你、我,國內手機廠商和應用開發者的共同督促。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM