Android 9 (API 級別 28) 引進了您可以在應用程式中運用的新功能和 API,以及新的行為變更。本文件將概略說明在兩個主要階段將應用程式遷移至 Android 9 的步驟:
- 確保與 Android 9 的基本相容性
確認現有應用程式可在新版平台中正常運作。在這個階段,您不會使用新的 API 或變更應用程式的
targetSdkVersion
,但可能需要進行小幅變更。 - 以新平台為目標、使用 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 平台做出了變更,可能會影響應用程式的行為,或完全破壞應用程式 (即使並未變更 targetSdkVersion
)。因此,請務必查看表 1 中的主要變更,並測試您實作的所有修正方式,以因應異動內容。
變更 | 摘要 |
---|---|
針對非 SDK 介面的限制 |
現在起,系統會封鎖存取特定非 SDK 介面,無論是直接存取、透過 JNI 或透過反射方式存取都一樣。嘗試存取受限制介面時會產生 NoSuchFieldException 和 NoSuchMethodException 等錯誤。詳情請參閱「非 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 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 提供了這些變更清單,並附上詳細資訊連結。
變更 | 摘要 |
---|---|
前景服務權限 | 想要使用前景服務的應用程式,現在必須先要求 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。