1. 程式人生 > >Android 9 行為變更:以 API 級別 28+ 為目標的應用

Android 9 行為變更:以 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 軟體包中的類,例如 WebView 和 CookieManager。 例如,您應該將所有使用 WebView 的 Activity 物件移入同一程序。 您可以通過在應用的其他程序中呼叫 disableWebView(),更嚴格地執行“僅限一個程序”規則。 該呼叫可防止 WebView 在這些其他程序中被錯誤地初始化,即使是從依賴內容庫進行的呼叫也能防止。

如果您的應用必須在多個程序中使用 WebView 的例項,則必須先利用 WebView.setDataDirectorySuffix() 函式為每個程序指定唯一的資料目錄字尾,然後再在該程序中使用 WebView 的給定例項。 該函式會將每個程序的網路資料放入其在應用資料目錄內自己的目錄中。

注:即使您使用 setDataDirectorySuffix(),系統也不會跨應用的程序界限共享 Cookie 以及其他網路資料。 如果應用中的多個程序需要訪問同一網路資料,您需要自行在這些程序之間複製資料。 例如,您可以呼叫 getCookie() 和 setCookie(),在不同程序之間手動傳輸 Cookie 資料。

以應用為單位的 SELinux 域名

以 Android 9 或更高版本為目標平臺的應用無法利用可全球訪問的 Unix 許可權與其他應用共享資料。 此變更可改善 Android 應用沙盒的完整性, 具體地講,就是要求應用的私有資料只能由該應用訪問。

要與其他應用共享檔案,請使用 content provider

連線變更

連線資料計數和多路徑

在以 Android 9 或更高版本為目標平臺的應用中,系統計算並非當前預設網路的網路流量,例如,當裝置連線 WLAN 時的蜂窩流量,並在 NetworkStatsManager 類中提供函式以查詢該流量。

具體而言,getMultipathPreference() 現在將返回一個基於上述網路流量的值。 從 Android 9 開始,此函式針對蜂窩資料返回 true,但當超過一天內累積的特定流量時,它將開始返回 false。 在 Android 9 上執行的應用必須呼叫此函式並採用此提示。

ConnectivityManager.NetworkCallback 類現在將有關 VPN 的資訊傳送到應用。 此變更讓應用偵聽連線事件變得更容易,而無需混用同步和非同步呼叫,也無需使用有限的 API。 此外,它還意味著將裝置同時連線至多個 WLAN 網路或多個蜂窩網路時,資訊傳輸可按預期工作。

Apache HTTP 客戶端棄用

在 Android 6.0 中,我們取消了對 Apache HTTP 客戶端的支援。 從 Android 9 開始,預設情況下該內容庫已從 bootclasspath 中移除且不可用於應用。

要繼續使用 Apache HTTP 客戶端,以 Android 9 及更高版本為目標的應用可以向其 AndroidManifest.xml   

application節點下邊新增以下內容:
<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 的實用程式)以避免執行時中提供的類存在類相容性問題。

介面變更

檢視焦點

0 面積的檢視(即寬度或高度為 0)再也不能被聚焦。

此外,Activity 不再隱式分配觸控模式下的初始焦點。 而是由您顯式請求初始焦點(如若需要的話)。

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)。

文件滾動標籤

Android 9 可正確處理文件的根標籤是滾動標籤的案例。 在之前的版本中,滾動位置在 body 標籤上設定,根標籤的滾動值為零。 Android 9 支援符合標準的行為,在這種行為中,滾動標籤根標籤。

此外,直接訪問 document.body.scrollTopdocument.body.scrollLeftdocument.documentElement.scrollTop 或 document.documentElement.scrollLeft 會因目標 SDK 的不同而具有不同的行為。 要訪問視口滾動值,請使用 document.scrollingElement(若有)。

來自已暫停應用的通知

在 Android 9 之前,暫停的應用發出的通知會被取消。 從 Android 9 開始,暫停的應用發出的通知將被隱藏,直至應用繼續執行。