行為變更:指定 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 起,系統會從 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.scrollTopdocument.body.scrollLeftdocument.documentElement.scrollTopdocument.documentElement.scrollLeft 行為會因目標 SDK 而異如要存取可視區域,捲動畫面 值,請使用 document.scrollingElement (如果有的話)。

來自已停權應用程式的通知

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