Android 9 Pie 兼容性常見問題及注意事項

應用不兼容的常見緣由

使用了系統的 ClassLoader 加載 org.apache.http.* 的庫apache

Android M 就已經開始移除對 Apache HTTP client 的支持。而 Android P 的系統 ClassLoader 已經不支持加載 org.apache.http.*包 (拋出 NoClassDefFoundError),應用必須用自定義的 ClassLoader 來加載,同時確保 org.apache.http.* 的路徑包含在應用 classpath 上。安全

應用不該該再使用 org.apache.http.legacy 庫,若是實在必須,能夠將它打包進本身的 APK,同時更名以防止與運行時的版本衝突。函數

沒有使用兼容 Android 9 的加固服務工具

部分加固服務可能還沒有兼容 Android 9。開發者應該使用兼容 Android 9 的加固服務。性能

直接調用 dex2oatgoogle

從一開始,dex2oat 就被設計爲系統內部使用的編譯部署工具,Android 歷來都未支持過開發者直接調用 dex2oat 的場景。編碼

若是您須要從內存中加載 dex 文件,而不肯在存儲中留下痕跡,請使用 Android O 中新增的加載器 InMemoryDexClassLoader。spa

相關的 dex / so 文件亦不該直接操做或篡改,干擾或篡改系統內部加載 dex 的邏輯極可能會致使兼容性問題。設計

使用了非 SDK 接口3d

非 SDK 接口在每次版本更新中都有可能被改動,開發者應只使用 SDK 接口。

使用了不兼容的第三方的庫

若是您使用的第三方庫尚不支持 Android P 版本,請報告給其提供商,幫助推進它解決兼容性問題。

非 SDK 接口的限制名單

  • 白名單

    Android SDK 自己

    沒有任何限制

  • 黑名單

    只能被 Android 系統及系統應用使用

    不管 targetSdkVersion 都禁止使用

    對應用開發者來講,至關於沒有這些接口

  • 深灰名單

    沒有發現應用在使用,但咱們以爲有潛在的可能性

    當 targetSdkVersion < P 時容許使用

    當 targetSdkVersion >= P 時禁止使用 (至關於黑名單)

  • 淺灰名單

    已有應用在使用的非 SDK 接口,仍然能夠繼續使用

    未來會考慮提供相應的 SDK 接口

    當 targetSdkVersion >= P 時系統提示警告

凹口屏幕 Display Cutout

  • 不要硬編碼狀態欄的高度,請使用 WindowInsetsCompat 獲取狀態列的高度。
  • 注意屏幕大小與顯示範圍的差別,請使用 View.getLocationInWindow(),而不是 View.getLocationOnScreen()。處理 MotionEvent 時,使用 getX() / getY() ,而不是 getRawX() / getRawY() 。
  • 凹口能夠置中或靠邊,只會在屏幕短邊出現,兩條短邊皆可有缺口。

屏幕旋轉鎖定

在 Android P 上,不管是自動旋轉或旋轉鎖定 (rotation lock),應用界面皆能夠爲縱向或橫向,這取決於最上層可見 Activity 的 screenOrientation 設置。請不要再假設設備在旋轉鎖定時一定爲縱向。

Inline 函數調用檢查

在 Android P 中,若是調用某個 inline 方法的類與 inline 方法所在的類由不一樣的 ClassLoader 加載, 就會主動發起 abort (inline 不容許跨 dex 文件),致使應用 crash。請儘可能避免用不一樣的 ClassLoader 來加載相關的 (有互相調用可能) 類,由於被調用類的方法可能已經被 inline 了。

空閒應用沒法訪問麥克風、攝像頭和傳感器

爲了更好地保證隱私,Android P 限制全部處於空閒狀態的應用對麥克風、攝像頭和全部 SensorManager 傳感器的訪問。當一個應用的 UID 空閒時,麥克風將會報告系統 「無音頻信號」,傳感器將會中止報告事件。應用使用的攝像頭也會斷開鏈接,若是應用嘗試使用它們,則會生成錯誤。在大多數狀況下,這些限制不會爲現有應用帶來新的問題,但咱們仍然建議您從應用中移除此類傳感器請求。

前臺服務權限

應用 target 到 P 版本後,在使用前臺服務時必須申請 FOREGROUND_SERVICE 權限。這是一個通常性權限,應用只需在 manifest 中聲明,系統會自動授予而無需詢問用戶。但若無此權限即運行前臺服務,系統會拋出 SecurityException。

後臺服務限制

自 Oreo 起,Target SDK >= 26 的應用若沒有在前臺顯示,它的後臺服務將受到系統限制。需長期運行的服務應遷移至前臺服務,並讓使用者注意到服務正在運行;或改用排程做業,例如 WorkManager 或 JobScheduler。

Google Play targetSdkVersion 政策

爲了推進應用得到 Android 新版本提供的安全和性能提高,Google Play 應用市場要求其上的應用必須:

  • 從 2018 年 8 月起,新發布的應用必須將 targetSdkVersion 設置爲 26 或更高
  • 從 2018 年 11 月起,現有應用的升級必須將 targetSdkVersion 設置爲 26 或更高
  • 2019 年以後,新發布或升級應用必須將 targetSdkVersion 設置爲一年內發佈的 Android 版本

點擊這裏 "咱們願意更好地傾聽您的聲音 "

相關文章
相關標籤/搜索