將應用程式遷移至 Android 9

Android 9 (API 級別 28) 引進了您可以在應用程式中運用的新功能和 API,以及新的行為變更。本文件將概略說明在兩個主要階段將應用程式遷移至 Android 9 的步驟:

  1. 確保與 Android 9 的基本相容性

    確認現有應用程式可在新版平台中正常運作。在這個階段,您不會使用新的 API 或變更應用程式的 targetSdkVersion,但可能需要進行小幅變更。

  2. 以新平台為目標、使用 Android 9 SDK 進行編譯,並使用 Android 9 功能進行建構

    準備好使用平台的新功能時,請將 targetSdkVersion 更新為 28、驗證應用程式繼續正常運作,然後開始使用新的 API。

準備搭載 Android 9 的裝置

如果您有相容裝置,請向製造商取得裝置的 Android 9 系統映像檔;按一下這裡,取得 Pixel 裝置的原廠映像檔。刷新系統映像檔的一般操作說明請參閱這篇文章

您也可以下載 Android Emulator 的 Android 9 系統映像檔。這會在 Android API 28 下的 SDK Manager 中列為 Google API Intel x86 Atom 系統映像檔

注意:您可以在 Android Studio 3.1 以上版本中下載 Android 9 模擬器系統映像檔;Android Studio 3.2 提供最大相容性。詳情請參閱取得 Android 9 SDK

確保與 Android 9 相容

這裡的目標是確保現有應用程式可在 Android 9 上正常運作。由於某些平台變更可能會影響應用程式的行為,因此可能需要進行部分調整,但您不需要使用新的 API 或變更 targetSdkVersion

逐步確保與 Android 9 相容

執行相容性測試

大部分情況下,針對 Android 9 的測試相容性,您需要在準備發布應用程式時執行的相同測試類型。建議您把握這個機會,參閱核心應用程式品質指南測試最佳做法

不過,還有另一個要測試的方法:Android 9 對 Android 平台做出了變更,可能會影響應用程式的行為,或完全破壞應用程式 (即使並未變更 targetSdkVersion)。因此,請務必查看表 1 中的主要變更,並測試您實作的所有修正方式,以因應異動內容。

表 1. 影響所有在 Android 9 裝置上執行的應用程式的重要變更。

變更 摘要
針對非 SDK 介面的限制 現在起,系統會封鎖存取特定非 SDK 介面,無論是直接存取、透過 JNI 或透過反射方式存取都一樣。嘗試存取受限制介面時會產生 NoSuchFieldExceptionNoSuchMethodException 等錯誤。詳情請參閱「非 SDK 介面的限制」。
移除加密編譯提供者 從 Android 9 開始,已移除 Crypto JCA 供應商。呼叫 SecureRandom.getInstance("SHA1PRNG", "Crypto") 會擲回 NoSuchProviderException
更嚴格的 UTF-8 解碼器 在 Android 9 中,Java 語言的 UTF-8 解碼器更加嚴格,並符合萬國碼 (Unicode) 標準。
禁止閒置應用程式存取相機、麥克風和感應器 應用程式處於閒置狀態時,將無法再存取相機、麥克風或 SensorManager 感應器。

如需更詳盡的 Android 9 所有應用程式行為變更清單,請參閱「行為變更」說明文件。

更新目標版本並使用 Android P 功能

本節說明如何將 targetSdkVersion 更新至 28,並新增 Android 9 中可用的新功能,藉此啟用 Android 9 的完整支援。

除了提供新的 API 外,在將 targetSdkVersion 更新為 28 時,Android 9 也會導入一些行為變更。由於部分行為變更可能需要變更程式碼,以免發生服務中斷,因此請先查看指定 Android 9 為目標版本應用程式的所有行為變更,瞭解變更 targetSdkVersion 時應用程式可能受到哪些影響。

注意:如要指定搭載 Android 9 的應用程式,就必須遵守上述確保平台相容性的步驟操作,因此請務必先完成這些步驟。

逐步更新目標版本並使用 Android 9 功能

取得 Android 9 SDK

您可以在 Android Studio 3.1 以上版本中取得 SDK 套件,藉此使用 Android 9 建構應用程式。如果暫時不需要 Android 9 的新功能,且只想在該平台版本進行編譯,可以使用 Android Studio 3.1 版Android Studio 3.2 提供完整的 Android 9 功能支援。

測試 Android 9 應用程式

完成上述準備後,您可以建構應用程式並進一步進行測試,確保應用程式在以 Android 9 (API 級別 28) 為目標時能正常運作。建議您不妨趁現在另外參考《核心應用程式品質指南》和《測試最佳做法》。

targetSdkVersion 設為 P 建構應用程式時,請留意特定的平台變更。其中有些變更可能會對應用程式行為造成重大影響,甚至完全破壞應用程式,即使您沒有在 Android 9 中實作新功能也一樣。

表 2 提供了這些變更清單,並附上詳細資訊連結。

表 2.targetSdkVersion 設為 28 時,會影響應用程式的主要變更。

變更 摘要
前景服務權限 想要使用前景服務的應用程式,現在必須先要求 FOREGROUND_SERVICE 權限。這是一般權限,因此系統會自動將權限授予提出要求的應用程式。在沒有權限的情況下啟動前景服務,系統會擲回 SecurityException。
淘汰 Bouncy Castle 加密作業 Android 9 淘汰了 Bouncy Castle 供應商提供的數種加密程序,並改用 Conscrypt 供應商提供的加密套件。要求 Bouncy Castle 供應商產生的 getInstance() 呼叫會產生 NoSuchAlgorithmException 錯誤。如要解決錯誤,請勿在 getInstance() 中指定提供者 (也就是要求預設實作)。
移除「Build.serial」的直接存取權 需要 Build.serial ID 的應用程式現在必須要求 READ_PHONE_STATE 權限,然後使用 Android 9 中新增的 Build.getSerial() 方法。
不允許共用 WebView 資料目錄 應用程式無法再跨程序共用單一 WebView 資料目錄。如果應用程式使用 WebView、CookieManager 或其他 android.webkit 套件中的其他 API 執行多個程序,當第二個程序呼叫 WebView 方法時,您的應用程式就會當機。
存取遭 SELinux 封鎖的應用程式資料目錄 系統會對每個應用程式的私人資料目錄,強制執行每個應用程式的 SELinux 沙箱限制。現在,不允許透過路徑直接存取其他應用程式的資料目錄。應用程式可以繼續透過傳遞 FD 等處理序間通訊 (IPC) 機制共用資料。

如需更詳盡的指定 Android 9 應用程式行為變更清單,請參閱行為變更說明文件。

如要探索適用於 Android 9 的新功能和 API,請參閱 Android 9 功能與 API