遷移至 Android 8.0

Android 8.0 版 (API 級別 26) 導入了行為變更,以及可讓您在應用程式中善用的新功能和 API。本文件概略說明將應用程式遷移至 Android 8.0 的步驟,可分成兩個主要階段:

  1. 確保與 Android 8.0 相容

    確認您的應用程式可在新版平台中完整運作。目前,您並未使用新的 API 或變更應用程式的 targetSdkVersion,但可能需要小幅變更。

  2. 更新目標版本並使用 Android 8.0 功能

    當您準備好利用平台的新功能時,請將 targetSdkVersion 更新為 26,確認應用程式能繼續正常運作,然後開始使用新的 API。

確保與 Android 8.0 相容

我們的目標是確保現有應用程式在 Android 8.0 (API 級別 26) 上正常運作。由於某些平台變更可能會影響應用程式的行為,因此您可能需要調整某些項目,但您不需要使用新的 API 或變更 targetSdkVersion

逐步確保與 Android 8.0 相容

準備搭載 Android 8.0 的裝置

  • 如果您有相容的裝置 (Pixel、Pixel XL、Pixel C、Nexus 5X、Nexus 6P 或 Nexus Player),請按照這篇文章中的操作說明刷新裝置。
  • 或下載 Android Emulator 的 Android 8.0 系統映像檔。它會在 Android 8.0 底下的 SDK Manager 中列為 Google APIs Intel x86 Atom 系統映像檔

    注意:Android Studio 3.0 以上版本下載 Android 8.0 系統映像檔。詳情請參閱下方的取得 Android 8.0 SDK 一節。

執行相容性測試

大多數情況下,Android 8.0 (API 級別 26) 的測試相容性涉及您準備發布應用程式時執行的測試類型。建議您把握機會詳閱《核心應用程式品質指南》和《測試最佳做法》。

不過,測試還另外一個方面:Android 8.0 導入了 Android 平台的變更,可能會影響應用程式的行為或完全破壞應用程式,即使您沒有變更 targetSdkVersion 也一樣。因此,請務必查看表 1 中的重要變更,並測試您根據變更實作的所有修正項目。

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

變更 摘要 進一步參考資料
降低背景位置資訊更新頻率 如果您的應用程式從背景服務接收位置更新,那麼與舊版 Android 相比,應用程式在 Android 8.0 (API 級別 26) 上收到的更新頻率較低。具體來說,背景服務每小時無法接收位置更新超過數次。不過,當應用程式在前景運作時,位置更新率會維持不變。 背景位置資訊限制
不再支援 net.hostname 查詢 net.hostname 系統屬性會產生空值結果。
send(DatagramPacket)新增的例外狀況 如果先前執行的 connect(InetAddress, int) 方法失敗,send(DatagramPacket) 方法會擲回 SocketException 行為變更:網路和 HTTP(S) 連線
來自 AbstractCollection 方法的正確 NullPointerException AbstractCollection.removeAll(null)AbstractCollection.retainAll(null) 現在一律會擲回 NullPointerException;先前,如果集合為空白,並不會擲回 NullPointerException。這項變更讓行為與說明文件一致。 行為變更:收集處理
Currency.getDisplayName(null)提供的正確NullPointerException 呼叫 Currency.getDisplayName(null) 會擲回 NullPointerException 行為變更:語言代碼和國際化

如需 Android 8.0 (API 級別 26) 中行為變更的詳細資訊,另請參閱 Android 8.0 行為變更

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

本節說明如何將 targetSdkVersion 更新為 26,並新增 Android 8.0 中可用的功能,藉此啟用 Android 8.0 (API 級別 26) 的完整支援。

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

注意:如要為應用程式指定 Android 8.0 版本,您必須先完成上述步驟確保平台相容性

更新目標版本並使用 Android 8.0 功能逐步說明

取得 Android 8.0 SDK

您可以取得 SDK 套件,並使用最新版本的 Android Studio (建議使用 Android Studio 3.0 以上版本) 以 Android 8.0 (API 級別 26) 建構應用程式。Android Studio 3.0 以上版本提供多項工具,協助您使用 Android 8.0 功能,例如自動調整圖示可下載的字型。如果您目前還不需要這些功能,可以使用 Android Studio 2.3.3 穩定版,透過 Android 8.0 建構應用程式並使用新的 API。

如要使用任一版本的 Android Studio,請按照下列步驟操作:

  1. 啟動 Android Studio,然後依序點選「Tools」>「SDK Manager」開啟 SDK Manager。
  2. 在「SDK Platforms」分頁中,勾選「Show Package Details」。在 Android 8.0 預先發布版下方,檢查下列事項:
    • Android SDK 平台 26
    • Google API Intel x86 Atom 系統映像檔 (只有模擬器需要)
  3. 切換至「SDK Tools」分頁,檢查所有有可用更新的項目 (逐一點選顯示破折號 的核取方塊)。其中應包含下列必要項目的最新版本:
    • Android SDK Build-Tools 26.0.0
    • Android SDK Platform-Tools 26.0.0 版
    • Android Emulator 26.0.0 版
  4. 按一下「OK」,安裝所有選取的 SDK 套件。

您現在可以開始使用 Android 8.0 建構應用程式了。

更新建構設定

compileSdkVersiontargetSdkVersion 和支援資料庫版本更新為最新的可用修訂版本,例如:

android {
  compileSdkVersion 26

  defaultConfig {
    targetSdkVersion 26
  }
  ...
}

dependencies {
  compile 'com.android.support:appcompat-v7:26.0.0'
}

// REQUIRED: Google's new Maven repo is required for the latest
// support library that is compatible with Android 8.0
repositories {
    google()

    // If you're using a version of Gradle lower than 4.1, you must instead use:
    // maven {
    //     url 'https://maven.google.com'
    // }
}

從資訊清單檔案中移除廣播接收器

由於 Android 8.0 (API 級別 26) 加入了新的廣播接收器限制,因此您應移除已註冊用於隱含廣播意圖的所有廣播接收器。保持原位並不會導致應用程式在建構時間或執行階段中斷,但如果應用程式在 Android 8.0 上執行,這些元件不會產生任何作用。

只有應用程式可以回應的廣播訊息 (具體來說是傳送至應用程式套件名稱的廣播意圖和廣播訊息) 在 Android 8.0 上保持不變。

這項新限制有例外狀況。如要瞭解哪些隱式廣播適用於指定 Android 8.0 版本的應用程式,請參閱「隱式廣播例外狀況」。

測試 Android 8.0 應用程式

完成上述準備作業後,您就可以建構應用程式並進一步進行測試,確保指定 Android 8.0 (API 級別 26) 時能正常運作。趁這個機會詳閱核心應用程式品質指南測試最佳做法

使用 targetSdkVersion 設為 26 建構應用程式時,請注意特定的平台異動。其中部分變更可能會大幅影響應用程式的行為,甚至完全破壞應用程式,即使您沒有在 Android 8.0 中實作新功能也一樣。

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

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

變更 摘要 進一步參考
隱私權 Android 8.0 (API 級別 26) 不支援 net.dns1、net.dns2、net.dns3 或 net.dns4 系統屬性。 行為變更:隱私權
已強制執行可寫入及可執行區隔 針對原生程式庫,Android 8.0 (API 級別 26) 會強制執行不得執行資料的規則,且程式碼不應寫入。 行為變更:原生程式庫
ELF 標頭和區段驗證 動態連結器會檢查 ELF 標頭和區段標頭中的更多值,如果無效,就會失敗。 行為變更:原生程式庫
通知 指定 Android 8.0 (API 級別 26) 版本的 SDK 的應用程式必須實作一或多個通知管道,才能向使用者發布通知。 API 總覽:通知
List.sort() 方法 此方法的實作可能無法呼叫 Collections.sort(),或應用程式會因堆疊溢位而擲回例外狀況。 行為變更:收集處理
Collections.sort() 方法 在清單實作中,Collections.sort() 現在會擲回 ConcurrentModificationException 行為變更:收集處理

如需 Android 8.0 (API 級別 26) 的行為變更詳細清單,請參閱「Android 8.0 行為變更」。

如要探索 Android 8.0 (API 級別 26) 提供的新功能和 API,請參閱 Android 8.0 功能與 API