Android 9 (API 級別 28) 為 Android 系統推出了多項變更。
以下行為變更僅適用於指定 API 級別 28 以上版本的應用程式。如果應用程式將 targetSdkVersion
設為 API 級別 28 以上,則必須視情況修改應用程式,以便正確支援這些行為。
如要瞭解會影響在 Android 9 上執行的所有應用程式 (無論其指定的 API 級別為何) 的變更,請參閱「行為變更:所有應用程式」。
前景服務
以 Android 9 以上版本為目標版本的應用程式,如果使用前景服務,就必須要求 FOREGROUND_SERVICE
權限。這是一般權限。
因此系統會自動將權限授予提出要求的應用程式
如果指定 Android 9 以上版本的應用程式嘗試在沒有人要求的情況下建立前景服務
請求 FOREGROUND_SERVICE
,
系統會擲回 SecurityException
。
隱私權變更
如果您的應用程式指定 Android 9 為目標版本,請務必遵循以下規定 您就會意識到必須做出的改變這些裝置序號和 DNS 資訊更新可強化使用者隱私權。
版本序號淘汰
在 Android 9 中,Build.SERIAL
是
一律設為 "UNKNOWN"
,以保護隱私權。
如果應用程式需要存取裝置的硬體序號,請改為要求 READ_PHONE_STATE
權限,然後呼叫 getSerial()
。
DNS 隱私權
鎖定 Android 9 的應用程式應支援私人 DNS API。特別是,如果系統解析器執行 DNS-over-TLS,應用程式應確保任何內建 DNS 用戶端都會使用加密 DNS 來處理與系統相同的主機名稱,或是停用系統解析器。
架構安全性異動
Android 9 包含多項可提升應用程式安全性的行為變更,但這些變更僅會在應用程式指定 API 級別 28 以上版本時生效。
預設啟用網路 TLS
如果您的應用程式指定 Android 9 以上版本,
isCleartextTrafficPermitted()
根據預設,方法會傳回 false
。如果應用程式需要為特定網域啟用明文,您必須在應用程式的網路安全性設定中,明確將這些網域的 cleartextTrafficPermitted
設為 true
。
以網路為基礎的資料目錄,以程序區隔
為了改善 Android 9 中的應用程式穩定性和資料完整性,應用程式無法在多個程序中共用單一 WebView
資料目錄。一般而言,
這類資料目錄儲存 Cookie、HTTP 快取以及其他永久性
與網路瀏覽相關的暫存空間。
在大多數情況下,應用程式應只在一個程序中使用 android.webkit
套件中的類別,例如 WebView
和 CookieManager
。舉例來說,您應將所有使用 WebView
的 Activity
物件移至相同程序。您可以在應用程式的其他程序中呼叫 disableWebView()
,以更嚴格的方式強制執行「僅限一個程序」規則。這個呼叫可避免 WebView
在其他程序中誤觸初始化,即使是從依附程式庫呼叫也一樣。
如果您的應用程式必須在多個程序中使用 WebView
例項,您必須使用 WebView.setDataDirectorySuffix()
方法,為每個程序指派專屬的資料目錄後置字串,然後才能在該程序中使用特定的 WebView
例項。這個方法會將每個程序的網站資料,放置在應用程式資料目錄中的專屬目錄中。
個別應用程式 SELinux 網域
指定 Android 9 以上版本的應用程式無法使用可供全球存取的 Unix 權限,與其他應用程式共用資料。這項變更能提高 Android 應用程式沙箱, 尤其是針對應用程式本身 可存取私人資料 僅由該應用程式使用
如要與其他應用程式分享檔案,請使用內容 供應商。
連線變更
連線資料計數和多路徑
在指定 Android 9 以上版本的應用程式中,系統會計算這些數據
網路流量
這不是目前的預設設定,例如裝置開機時的儲存格流量
Wi-Fi),同時在
NetworkStatsManager
類別,針對該流量查詢。
具體來說,getMultipathPreference()
現在會根據上述網路流量傳回值。從 Android 9 開始,此方法會針對單元資料傳回 true
,但如果一天內累積的流量超過一定數量,就會開始傳回 false
。在 Android 9 上執行的應用程式必須呼叫此方法並遵循這項提示。
ConnectivityManager.NetworkCallback
類別現在會將 VPN 相關資訊傳送至應用程式。這項異動讓開發人員
可讓應用程式監聽連線事件,而不必混合使用同步和
非同步呼叫及使用受限制的 API此外,這也表示當裝置同時連線至多個 Wi-Fi 網路或多個行動網路時,資訊傳輸功能會正常運作。
Apache HTTP 用戶端淘汰
在 Android 6.0 中,我們已移除對 Apache HTTP 用戶端的支援。自 Android 9 起,系統會從 bootclasspath 中移除該程式庫,且預設情況下不會提供給應用程式使用。
如要繼續使用 Apache HTTP 用戶端,指定 Android 9 以上版本的應用程式可以在 AndroidManifest.xml
中加入下列內容:
<uses-library android:name="org.apache.http.legacy" android:required="false"/>
除了使用執行階段 Apache 程式庫之外,應用程式也可以將
在 APK 中取得 org.apache.http
程式庫的版本。如果這麼做
您必須重新封裝程式庫 (使用以下公用程式:
Jar Jar),避免發生類別相容性問題
執行階段所提供的類別
使用者介面變更
查看重點
面積為 0 的檢視區塊 (寬度或高度為 0) 不再可聚焦。
此外,活動不會再間接指派初始焦點 觸控模式。相反地,如有需要,您可以明確要求起始焦點。
CSS RGBA 十六進位值處理
指定 Android 9 以上版本的應用程式必須啟用草稿 CSS 顏色模組層級 4 處理 4 位數和 8 十六進位數字 CSS 顏色的行為。
CSS 顏色模組層級 4 「瀏覽器」自 52 版開始支援 WebView 目前停用此功能 因為我們發現現有的 Android 應用程式含有 32 位元的十六進位顏色 一般而言,會導致轉譯錯誤。
舉例來說,對於以 API 級別 27 以下為目標的應用程式,目前在 WebView 中顯示的顏色 #80ff8080
為不透明淺紅色 (#ff8080
)。領先
元件 (Android 會解讀為 Alpha 元件)
目前遭到忽略。如果應用程式指定的 API 級別為 28 以上,#80ff8080
會解讀為 50% 透明淺綠色 (#80ff80
)。
檔案 MIME 類型嗅探:URI
Android 9 以下版本的 Android 可能會從檔案推論 MIME 類型
內容。從 Android 9 (API 級別 28) 開始,應用程式必須使用
正確的副檔名,file:
WebView。
使用檔案內容來推斷 MIME 類型可能會是安全性錯誤的原因之一。 而新式瀏覽器通常不允許此做法。
如果檔案具有可辨識的副檔名 (例如 .html
),
.txt
、.js
或 .css
MIME 類型將由副檔名決定。
如果檔案沒有副檔名或無法辨識的副檔名,MIME 類型就會是純文字。
舉例來說,file:///sdcard/test.html
這類 URI 會轉譯為 HTML,但 file:///sdcard/test
這類 URI 會轉譯為純文字,即使檔案包含 HTML 資料也一樣。
文件捲動元素
Android 9 會妥善處理文件根層級案件 元素是捲動元素 在較舊版本的 body 元素上設定捲動位置 根元素的捲動值為零Android 9 可啟用符合標準的行為,其中捲動元素「是」根元素。
此外,直接存取 document.body.scrollTop
、document.body.scrollLeft
、
document.documentElement.scrollTop
或document.documentElement.scrollLeft
行為會因目標 SDK 而異如要存取可視區域,捲動畫面
值,請使用 document.scrollingElement
(如果有的話)。
來自已停權應用程式的通知
在 Android 9 之前,系統會取消已暫停應用程式發出的通知。從 Android 9 開始,系統會隱藏已暫停應用程式的通知,直到應用程式重新啟動為止。