應用不相容的常見原因
使用了系統的 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 介面的限制名單
-
白名單
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 版本
點選這裡 “我們願意更好地傾聽您的聲音 ”