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 開始,該程式庫會從開機磁碟路徑中移除,且預設不適用於應用程式。
如要繼續使用 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 顏色。
自 Chrome 52 版起,便已支援 CSS 色彩模組第 4 級,但 WebView 目前會停用此功能,因為現有 Android 應用程式含有 Android 排序 (ARGB) 的 32 位元十六進位色彩,可能會導致算繪錯誤。
舉例來說,針對目標 API 級別 27 以下的應用程式,顏色 #80ff8080
目前在 WebView 中算繪為不透明的淺紅色 (#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 類型將是純文字。
舉例來說,即使檔案包含 HTML 資料,file:///sdcard/test.html
這類 URI 也會算繪為 HTML,但 file:///sdcard/test
之類的 URI 則會以純文字顯示。
文件捲動元素
Android 9 會妥善處理文件根元素是捲動元素的情況。在舊版中,主體元素上設定了捲動位置,根元素有零捲動值。Android 9 會啟用符合標準的行為,亦即捲動元素「是」根元素。
此外,直接存取 document.body.scrollTop
、document.body.scrollLeft
、document.documentElement.scrollTop
或 document.documentElement.scrollLeft
的行為會根據目標 SDK 而有不同。如要存取可視區域捲動值,請使用 document.scrollingElement
(如果有的話)。
停權應用程式的通知
在 Android 9 以下版本中,已停權應用程式的通知已取消。 從 Android 9 開始,系統會隱藏已停權應用程式的通知,直到應用程式重新啟用為止。