行為變更:指定 API 級別 28 以上的應用程式

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 套件中的類別,例如 WebViewCookieManager。舉例來說,您應該將所有使用 WebViewActivity 物件移到相同程序。您可以在應用程式的其他程序中呼叫 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 起,該程式庫會從 Bootclass 路徑中移除,且預設不會提供給應用程式使用。

如要繼續使用 Apache HTTP 用戶端,指定 Android 9 以上版本的應用程式可以在 AndroidManifest.xml 中加入以下內容:

<uses-library android:name="org.apache.http.legacy" android:required="false"/>

除了使用執行階段 Apache 程式庫之外,應用程式也可以將自己的 org.apache.http 程式庫版本加入自己的 APK 中。如果這麼做,您必須重新封裝程式庫 (使用 Jar Jar 等公用程式),避免與執行階段中提供的類別發生類別相容性問題。

使用者介面變更

查看重點

具有 0 區域 (寬度或高度為 0) 的檢視畫面已無法聚焦。

此外,活動不會再在觸控模式下間接指派初始焦點。如有需要,您可以明確要求初始焦點。

CSS RGBA 十六進位值處理

如果應用程式指定 Android 9 以上版本為目標,就必須啟用 CSS 色彩模組層級 4 草稿行為,來處理 4 和 8 十六進位的 CSS 顏色。

Chrome 自第 52 版起已支援 CSS 色彩模組層級 4,但 WebView 目前停用此功能,因為現有 Android 應用程式的 Android 排序 (ARGB) 中包含 32 位元十六進位顏色,這會造成算繪錯誤。

舉例來說,對於指定 API 級別 27 以下為目標的應用程式,WebView 目前會將 #80ff8080 顏色算繪為不透明淺紅色 (#ff8080)。目前會忽略主要元件 (Android 會解讀為 Alpha 元件)。如果應用程式指定 API 級別 28 以上,#80ff8080 會解讀為 50% 的透明淺綠色 (#80ff80)。

針對檔案進行 MIME 類型探查:URI

Android 9 以下版本的 Android 版本可以從檔案內容推斷 MIME 類型。從 Android 9 (API 級別 28) 開始,應用程式在 WebView 中載入 file: URI 時,必須使用正確的副檔名。

使用檔案內容來推斷 MIME 類型可能是安全性錯誤的來源,新式瀏覽器通常不允許這種做法。

如果檔案具有可辨識的副檔名 (例如 .html.txt.js.css),則副檔名取決於 MIME 類型。如果檔案沒有副檔名或無法識別的副檔名,MIME 類型將為純文字。

舉例來說,file:///sdcard/test.html 這類 URI 會顯示為 HTML,但 file:///sdcard/test 之類的 URI 則會算繪為純文字,即使檔案包含 HTML 資料也一樣。

文件捲動元素

當文件的根元素是捲動元素時,Android 9 會妥善處理這種狀況。在較舊的版本中,主體元素上設定捲動位置,根元素則沒有任何捲動值。Android 9 可啟用符合標準的行為,其中捲動元素「是」根元素。

此外,直接存取 document.body.scrollTopdocument.body.scrollLeftdocument.documentElement.scrollTopdocument.documentElement.scrollLeft 的行為會因目標 SDK 而異。如要存取可視區域捲動值,請使用 document.scrollingElement (如有)。

停權應用程式的通知

在 Android 9 之前,已停權應用程式的通知已取消。 從 Android 9 開始,已暫停應用程式的通知會隱藏,直到應用程式重新啟用為止。