行為變更:指定 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,僅有一個 上傳資料集之後,您可以運用 AutoML 自動完成部分資料準備工作舉例來說,您將 使用 WebViewActivity 物件 在同一個程序中您可以更嚴格地執行「僅限一項處理程序」規則 撥號 disableWebView() 英吋 應用程式的其他程序。這項呼叫會防止 WebView 初始化 即便是來自依附元件呼叫 資源庫。

如果您的應用程式必須使用 多項程序中的 WebView 您必須為每個程序指派不重複的資料目錄後置字串, WebView.setDataDirectorySuffix()。 方法,接著在該程序中使用指定 WebView 的執行個體。這個方法 將每個程序的網頁資料放在應用程式資料的專屬目錄中 目錄。

個別應用程式的 SELinux 網域

以 Android 9 以上版本為目標的應用程式無法與其他使用 Android 系統的應用程式共用資料 全球可存取的 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 位元的十六進位顏色 一般而言,會導致轉譯錯誤。

舉例來說,顏色 #80ff8080 目前算繪於 WebView 不透明 淺紅色 (#ff8080) 適用於目標 API 級別 27 以下的應用程式。領先 元件 (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 會算繪為 但 file:///sdcard/test 等 URI 會呈現純文字 (即使檔案包含 HTML 資料)

文件捲動元素

Android 9 會妥善處理文件根層級案件 元素是捲動元素 在較舊版本的 body 元素上設定捲動位置 根元素的捲動值為零Android 9 可讓您 符合標準模式的行為,其中捲動元素「是」根元素 元素。

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

已暫停應用程式的通知

在 Android 9 以下版本,系統會取消已暫停應用程式的通知。 從 Android 9 開始,系統會隱藏已暫停應用程式的通知,直到 應用程式就會恢復運作