一.行爲變更:以 API 級別 28+ 爲目標的應用
Android 9(API 級別 28)向 Android 系統引入了多項變更。 以下行爲變更僅影響以 API 28 或更高級別爲目標的應用。 將 targetSdkVersion
設爲 API 28 或更高級別的應用必須進行修改,以便正確支持這些行爲(如果適用)。
1.前臺服務
針對 Android 9 或更高版本並使用前臺服務的應用必須請求 FOREGROUND_SERVICE
權限。 這是普通權限,因此,系統會自動爲請求權限的應用授予此權限。
如果針對 Android 9 或更高版本的應用嘗試創建一個前臺服務且未請求 FOREGROUND_SERVICE
,則系統會引發 SecurityException
。
2.隱私權變更
如果您的應用以 Android 9 爲目標平臺,您應牢記以下行爲變更。 對設備序列信息和 DNS 信息進行的這些更新可增強用戶隱私保護。
2.1.構建序列號棄用
在 Android 9 中,Build.SERIAL
始終設置爲 "UNKNOWN"
以保護用戶的隱私。
如果您的應用需要訪問設備的硬件序列號,您應改爲請求 READ_PHONE_STATE
權限,然後調用 getSerial()
。
2.2.DNS 隱私
以 Android 9 爲目標平臺的應用應採用私有 DNS API。 具體而言,當系統解析程序正在執行 DNS-over-TLS 時,應用應確保任何內置 DNS 客戶端均使用加密的 DNS 查找與系統相同的主機名,或停用它而改用系統解析程序。
3.框架安全性變更
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
的給定實例。 該函數會將每個進程的網絡數據放入其在應用數據目錄內自己的目錄中。
注:即使您使用 setDataDirectorySuffix()
,系統也不會跨應用的進程界限共享 Cookie 以及其他網絡數據。 如果應用中的多個進程需要訪問同一網絡數據,您需要自行在這些進程之間複製數據。 例如,您可以調用 getCookie()
和 setCookie()
,在不同進程之間手動傳輸 Cookie 數據。
以應用爲單位的 SELinux 域名
以 Android 9 或更高版本爲目標平臺的應用無法利用可全球訪問的 Unix 權限與其他應用共享數據。 此變更可改善 Android 應用沙盒的完整性, 具體地講,就是要求應用的私有數據只能由該應用訪問。
要與其他應用共享文件,請使用 content provider。
4.連接變更
4.1.連接數據計數和多路徑
在以 Android 9 或更高版本爲目標平臺的應用中,系統計算並非當前默認網絡的網絡流量,例如,當設備連接 WLAN 時的蜂窩流量,並在 NetworkStatsManager
類中提供函數以查詢該流量。
具體而言,getMultipathPreference()
現在將返回一個基於上述網絡流量的值。 從 Android 9 開始,此函數針對蜂窩數據返回 true
,但當超過一天內累積的特定流量時,它將開始返回 false
。 在 Android 9 上運行的應用必須調用此函數並採用此提示。
ConnectivityManager.NetworkCallback
類現在將有關 VPN 的信息發送到應用。 此變更讓應用偵聽連接事件變得更容易,而無需混用同步和異步調用,也無需使用有限的 API。 此外,它還意味着將設備同時連接至多個 WLAN 網絡或多個蜂窩網絡時,信息傳輸可按預期工作。
4.2.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"/>
注:擁有最低 SDK 版本 23 或更低版本的應用需要 android:required="false"
屬性,因爲在 API 級別低於 24 的設備上,org.apache.http.legacy
庫不可用。 (在這些設備上,Apache HTTP 類在 bootclasspath 中提供。)
作爲使用運行時 Apache 庫的替代,應用可以在其 APK 中綁定自己的 org.apache.http
庫版本。 如果進行此操作,您必須將該庫重新打包(使用一個類似 Jar Jar 的實用程序)以避免運行時中提供的類存在類兼容性問題。
5.界面變更
5.1.視圖焦點
0 面積的視圖(即寬度或高度爲 0)再也不能被聚焦。
此外,Activity 不再隱式分配觸摸模式下的初始焦點。 而是由您顯式請求初始焦點(如若需要的話)。
5.2.CSS RGBA 十六進制值處理
以 Android 9 或更高版本爲目標的應用必須支持草案版 CSS 顏色模塊級別 4 的行爲,用於處理 4 和 8 個十六進制數字 CSS 顏色。
Chrome 自版本 52 以來便一直支持 CSS 顏色模塊級別 4,但 WebView 目前停用此功能,因爲現有 Android 應用被發現包含 Android ordering (ARGB) 中的 32 位十六進制顏色,這會導致渲染錯誤。
例如,對於以 API 級別 27 或更低版本爲目標平臺的應用,顏色 #80ff8080
目前在 WebView 中被渲染爲不透明淺紅色 (#ff8080
)。 先導部分(Android 會將其解讀爲 Alpha 部分)目前被忽略。 如果某個應用以 API 級別 28 或更高版本爲目標,則 #80ff8080
將被解讀爲 50% 透明淺綠 (#80ff80
)。
5.3.文檔滾動標籤
Android 9 可正確處理文檔的根標籤是滾動標籤的案例。 在之前的版本中,滾動位置在 body 標籤上設置,根標籤的滾動值爲零。 Android 9 支持符合標準的行爲,在這種行爲中,滾動標籤是根標籤。
此外,直接訪問 document.body.scrollTop
、document.body.scrollLeft
、document.documentElement.scrollTop
或 document.documentElement.scrollLeft
會因目標 SDK 的不同而具有不同的行爲。 要訪問視口滾動值,請使用 document.scrollingElement
(若有)。
5.4.來自已暫停應用的通知
在 Android 9 之前,暫停的應用發出的通知會被取消。 從 Android 9 開始,暫停的應用發出的通知將被隱藏,直至應用繼續運行。