1. 程式人生 > >Android P應用適配指南

Android P應用適配指南

AndroidP相容性變化

1 對非 SDK 介面的限制

1.1 介紹

非sdk的介面存在著穩定性問題,隨著android版本的變化隨時都有可能被移除,AndroidP開始,為了更好的提升app的相容性,正對隱藏的非sdk介面進行限制,通過名單控制進行使用限制,具體規則限制如下:

在這裡插入圖片描述

1.2 影響範圍

所有執行在AndroidP系統上的應用

1.3 如何適配

(1)對於黑名單及深灰名單中的介面,應用及時調整新的方案進行適配;

(2)黑名單及灰名單是在原始碼構建的時候生成的,在此提供一份,檔案下載連結:【黑名單】點此下載 | 【灰名單】點此下載

(3)應用可以直接adb logcat命令中過濾”Accessing hidden”檢視當前應用使用非sdk的情況

2 劉海屏適配指導(cutout)

2.1 介紹

隨著各種劉海屏相繼出現,但沒有一致的介面,AndroidP開始提供規範化的介面,應用可以使用標準介面,獲取當前是否有劉海,控制應用在劉海屏上的佈局顯示區域。AndroidP的裝置支援模擬劉海效果,持有P的裝置的可以開啟“開發者選項”,找到“模擬巨有凹口的顯示屏”進行模擬除錯。

2.2 影響範圍

所有執行在AndroidP系統上的應用,不分targetsdkversion

2.3 如何適配

■ 怎麼判斷是否劉海支援與否?

View.getRootWindowInsets().getDisplayCutout()

返回DisplayCutout物件,為劉海的描述資訊,不支援則返回空

■ 怎麼獲取劉海資訊?

DisplayCutout.getSafeInsets() 返回安全區域Rect

DisplayCutout.getBounds() 返回劉海的區域的Region

■ 如何控制應用的佈局顯示?

通過控制窗口布局的layoutInDisplayCutoutMode屬性可以達到控制應用在劉海屏下佈局區域,具體可以設定以下值

LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT

沒有設定的情況下預設此標記,只有狀態列區域可見的情況下,才意味著加了FLAG_FULLSCREEN or SYSTEM_UI_FLAG_FULLSCREEN標記的應用視窗都會被切邊放在劉海以下

LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES

此flag下不進行應用視窗的限制,視窗可以顯示到劉海區域

LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER

此flag下應用視窗一直被限制在劉海區域以下

應用也可以通過theme來達到同樣的效果

<item name="android:windowLayoutInDisplayCutoutMode">default</item>

對應LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT

<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>

對應LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES

<item name="android:windowLayoutInDisplayCutoutMode">never</item>

對應LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER

應用遇到視窗顯示被限制在劉海以下區域的可以調整

layoutInDisplayCutoutMode 設定為

LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES,再通過獲取

DisplayCutout 關於劉海區域資訊,調整UI達到更好的滿屏體驗。

3 應用待機分組策略

3.1 介紹

應用待機分組為AndroidP上新的電源管理功能,它將應用歸為五類,沒有采用不同的限制策略,來控制應用的訪問資源的能力。
具體分以下五類:
在這裡插入圖片描述

3.2 影響範圍

所有執行在AndroidP系統上的應用,不分targetsdkversion,受此影響為主要為應用的後臺行為受限制,特別如鬧鐘,地圖導航,後臺下載,健康類應用。

3.3 如何適配

■ 應用根據Android的限制策略,點檢應用的後臺行為是否被限制。

■ 如何確認是否因為應用待機分組導致的後臺行為限制?

(1)先確認應用的待機分組

        adb shell am get-standby-bucket [packagename]  //查下當前應用的分組情況;

(2)如果不在活躍組(active)

        adb shell am set-standby-bucket packagename active  //強制切換應用到活躍分組;

確認在此情況下使用者的行為是否依然受限制,如果是的話,才確認為待機分組策略導致的後臺行為限制。

■ 應用可以通過

        adb shell am set-standby-bucket packagename active|working_set|frequent|rare 
        在不同分組見強制進行切換,除錯自身應用。

4 Crypto JCA 提供程式已被移除,棄用 Bouncy Castle 加密

4.1 介紹

Crypto JCA 提供程式已被移除。呼叫 SecureRandom.getInstance(“SHA1PRNG”,“Crypto”) 將會引發 NoSuchProviderException,呼叫Bouncy Castle 提供程式的 getInstance(),會生成 NoSuchAlgorithmException 錯誤。

4.2 影響範圍

(1)Crypto JCA 提供程式已被移除,此影響所有執行AndriodP系統的所有應用;

(2)Bouncy Castle 提供程式異常的問題,影響所有targetsdkversion>=28的應用;

4.3 如何適配

模組應該在getInstance()的時候不指派提供程式,採用預設實現即可

5 FLAG_ACTIVITY_NEW_TASK被強制要求

AndroidP上,從非 Activity 環境中啟動 Activity,除非傳遞 Intent 標誌 FLAG_ACTIVITY_NEW_TASK。 如果嘗試在不傳遞此標誌的情況下啟動 Activity,則該 Activity 不會啟動,此限制對所有執行AndroidP的應用生效。

6 禁止空閒應用訪問相機、麥克風和感測器

Android 9 限制後臺應用訪問使用者輸入和感測器資料的能力。 如果您的應用在執行 Android 9 裝置的後臺執行,系統將對您的應用採取以下限制:

(1)應用不能訪問麥克風或攝像頭。

(2)使用連續報告模式的感測器(例如加速度計和陀螺儀)不會接收事件。

(3)使用變化或一次性報告模式的感測器不會接收事件。

7 前臺服務的應用必須請求 FOREGROUND_SERVICE 許可權

targetsdkversion>=28的應用在使用前臺服務的都需要進行必須請求 FOREGROUND_SERVICE 許可權。 這是普通許可權,因此,系統會自動為請求許可權的應用授予此許可權。

<uses-permission ndroid:name="android.permission.FOREGROUND_SERVICE"/>

8 預設情況下啟用網路傳輸層安全協議

AndroidP上,對應targetsdkversion>=28的應用需要為特定域名啟用明文,必須在應用的網路安全性配置中針對這些域名將 cleartextTrafficPermitted 顯式設定為 true,預設情況下明文傳輸會直接丟擲“java.io.IOException: Cleartext HTTP traffic to xxx.com not permitted”異常。

9 Apache HTTP 客戶端棄用,bootclasspath 中已移除

AndroidP開始org.apache.http.legacy.jar這個包不在打包進bootclasspath,對於targetsdkversion>=28的,繼續引用此包的應用將直接出現NoClassDefFoundError,對於targetsdkversion低於28的,系統會將此包載入到應用的classloader中,如果應用採用系統的classloader載入應用,將同樣會出現NoClassDefFoundError,建議模組使用 HttpURLConnection 類,更加高效。

10 移除對 Build.serial 的直接訪問

Build.SERIAL欄位已經被廢棄,AndroidP上值一直為“UNKNOWN”, 如果您的應用需要訪問裝置的硬體序列號,您應請求 READ_PHONE_STATE 許可權,然後呼叫 getSerial()。

11 不允許共享 WebView 資料目錄

targetsdkversion>=28的應用不允許在不同程序之間共享一個 WebView 資料目錄。如果應用有多個程序使用 WebView、CookieManager 或 android.webkit 軟體包中的任何其他 API,則在第二個程序呼叫 WebView 函式時,應用將會崩潰。

12 應用禁止訪問xt_qtagui目錄的檔案

AndroidP後,不再允許應用直接讀取 /proc/net/xt_qtaguid 資料夾中的檔案。 這樣做是為了確保與某些根本不提供這些檔案的裝置保持一致。應用應該採用標準 API TrafficStats 和 NetworkStatsManager 進行訪問,此限制對所有執行AndroidP系統上的應用生效。

13 SELinux 禁止訪問應用的資料目錄

對於targetsdkversion>=28的應用,系統強制每個應用的 SELinux 沙盒對每個應用的私有資料目錄強制執行逐個應用的 SELinux 限制。現在,不允許直接通過路徑訪問其他應用的資料目錄。應用可以繼續使用程序間通訊 (IPC) 機制(包括通過傳遞 FD)共享資料,例如可以採用FileProvider。

參考連結