將應用程式遷移至 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 9 系統映像檔,用於 Android Emulator。與 SDK Manager Android API 28 做為 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 起,已移除加密編譯 JCA 供應商。來電次數 目的地:SecureRandom.getInstance("SHA1PRNG", "Crypto") 將會擲回 NoSuchProviderException
更嚴格的 UTF-8 解碼器 在 Android 9 中,Java 語言的 UTF-8 解碼器更加嚴格,並遵循萬國碼標準。
閒置應用程式無法存取相機、麥克風和感應器 應用程式處於閒置狀態時,無法再存取相機、麥克風或 SensorManager 感應器。

如需在 Android 9 上執行的所有應用程式行為變更完整清單, 請參閱行為變更文件。

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

本節說明如何啟用 Android 9 的完整支援 將 targetSdkVersion 更新為 28 並增加 Android 9 的新功能

除了提供新的 API,Android 9 還會在您將 targetSdkVersion 更新至 28 時,引入一些行為變更。因為有些行為 您可能需要變更程式碼才不會中斷 查看指定 Android 9 為目標版本的應用程式行為變更,並變更 targetSdkVersion 會受到影響。

注意:如要將應用程式指定為 Android 9,請先完成上述確保平台相容性的步驟,因此請務必先完成這些步驟。

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

取得 Android 9 SDK

您可以藉由取得 SDK 套件,建構與 Android 9 相容的應用程式 使用 Android Studio 3.1 以上版本。 如果不需要 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(): 要求跳板 城堡供應商會產生 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