遷移至 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 API Intel x86 Atom 系統映像檔

    注意:Android 8.0 系統映像檔可從 Android Studio 3.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

您可以使用最新版本的 Android Studio (建議為 Android Studio 3.0 以上版本),取得 SDK 套件以 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