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

Android_開發者發表於2019-03-04
Android 9 Pie 相容性常見問題及注意事項

應用不相容的常見原因

使用了系統的 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 版本

點選這裡我們願意更好地傾聽您的聲音

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

相關文章