將應用程式遷移至 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 APIs 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,Android 9 會在您將 targetSdkVersion 更新為 28 時做出一些行為變更。由於部分行為變更可能需要變更程式碼才能避免服務中斷,因此請先查看指定 Android 9 做為目標版本的應用程式行為變更,瞭解變更 targetSdkVersion 時應用程式可能受到哪些影響。

注意:應用程式指定 Android 9 為目標的先決條件是確保平台相容性,因此請務必先完成這些步驟。

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

取得 Android 9 SDK

您可以取得 SDK 套件,透過 Android Studio 3.1 以上版本以 Android 9 建構應用程式。如果您不需要 Android 9 的新功能,且只想在該平台版本進行編譯,則可以使用 Android Studio 3.1Android 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 供應商提供的加密方式。如果呼叫 getInstance() 要求 Bouncy Castle 供應商,會產生 NoSuchAlgorithmException 錯誤。如要解決錯誤,請勿在 getInstance() 中指定提供者 (也就是要求預設實作)。
移除「Build.serial」的直接存取權 需要 Build.serial ID 的應用程式現在必須要求 READ_PHONE_STATE 權限,然後使用 Android 9 中新增的新 Build.getSerial() 方法。
不允許共用 WebView 資料目錄 應用程式無法再跨程序共用單一 WebView 資料目錄。如果您的應用程式使用 WebView、CookieManager 或任何其他 android.webkit 套件中的 API 執行多項程序,則第二個程序呼叫 WebView 方法時,應用程式就會當機。
存取 SELinux 封鎖的應用程式資料目錄 系統會針對各應用程式的 SELinux 沙箱,對各個應用程式的私人資料目錄強制執行 SELinux 限制。系統現在不允許透過路徑直接存取其他應用程式的資料目錄。應用程式可以繼續透過 IPC 機制共用資料,包括透過傳送 FD。

如需更完整的指定 Android 9 應用程式行為變更清單,請參閱「行為變更」文件。

如要探索 Android 9 提供的新功能和 API,請參閱「Android 9 功能和 API」。