應用不兼容的常見原因
使用了系統的 ClassLoader 加載 org.apache.http.* 的庫
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 的加固服務。
直接調用 dex2oat
從一開始,dex2oat 就被設計為系統內部使用的編譯部署工具,Android 從來都未支持過開發者直接調用 dex2oat 的場景。
如果您需要從內存中加載 dex 文件,而不願在存儲中留下痕跡,請使用 Android O 中新增的加載器 InMemoryDexClassLoader。
相關的 dex / so 文件亦不應直接操作或篡改,干擾或篡改系統內部加載 dex 的邏輯很可能會導致兼容性問題。
使用了非 SDK 接口
非 SDK 接口在每次版本更新中都有可能被改動,開發者應只使用 SDK 接口。
使用了不兼容的第三方的庫
如果您使用的第三方庫尚不支持 Android P 版本,請報告給其提供商,幫助推動它解決兼容性問題。
非 SDK 接口的限制名單
凹口屏幕 Display Cutout
屏幕旋轉鎖定
在 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 應用市場要求其上的應用必須:
?點擊屏末?|?閱讀原文?|?"我們願意更好地傾聽您的聲音 "
推薦閱讀
·?Android 安全更新的發展與沿革
·?Android Jetpack: Room | 中文教學視頻
·?Google Play Console 新增獲客分析功能,幫您深入洞察用戶行為
文章來源:https://blog.csdn.net/jILRvRTrc/article/details/82598481