遷移至 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 系統映像檔。在 SDK Manager 中,它會列在 Android 8.0 下方,名稱為 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 8.0 (API 級別 26) 上接收的更新頻率會比舊版 Android 版本低。具體來說,背景服務每小時只能收到幾次位置更新。不過,當應用程式處於前景時,位置更新的頻率不會改變。 背景位置資訊限制
已停止支援 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 時導入一些行為變更。由於某些行為變更可能需要變更程式碼以避免發生錯誤,因此您應先瞭解變更 targetSdkVersion 時應用程式可能受到的影響,方法是查看所有鎖定 Android 8.0 的應用程式行為變更

注意:如要將應用程式指定為 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) 會強制執行資料不得可執行,且程式碼不得可寫入的規則。 行為變更: Native Libraries
ELF 標頭和區段驗證 動態連結器會檢查 ELF 標頭和區段標頭中的更多值,如果這些值無效,就會失敗。 行為變更: Native Libraries
通知 指定 Android 8.0 (API 級別 26) 版 SDK 的應用程式,必須實作一或多個通知管道,才能向使用者發布通知。 API 總覽:Notifications
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