遷移至 Android 8.0

Android 8.0 (API 級別 26) 導入了行為變更,以及 並運用在自己的應用程式中本文件會概略說明遷移步驟 將您的應用程式推送到 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) 播放器),請按照 操作說明 刷新裝置
  • 或下載 Android Emulator 的 Android 8.0 系統映像檔。與 SDK Manager Android 8.0 做為 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. 影響所有應用程式的重要異動 在 Android 8.0 裝置上執行

變更 摘要 更多參考資料
降低背景位置資訊更新頻率 如果應用程式透過背景服務接收位置更新通知,存取頻率會降低 Android 8.0 (API 級別 26) 的更新項目,與舊版 Android 相比。具體來說 服務在每小時無法接收位置更新資訊超過數次。不過, 應用程式位於前景,位置更新的頻率維持不變。 背景位置資訊限制
已停止支援「net.hostname 查詢 net.hostname 系統屬性會產生空值結果。
send(DatagramPacket)」新增了例外狀況 send(DatagramPacket) 方法會擲回 SocketException (如果先前執行的 connect(InetAddress, int) 方法失敗)。 行為變更:網路與 HTTP(S) 連線
正確的NullPointerException,來源: AbstractCollection 種方式 AbstractCollection.removeAll(null)」和 AbstractCollection.retainAll(null) 現在一律會擲回 NullPointerException; 先前並未在集合空白時擲回 NullPointerException。 這項變更讓行為與說明文件一致。 行為變更:收集處理
正確的NullPointerException,來源: Currency.getDisplayName(null) 正在撥打 Currency.getDisplayName(null) 擲回 NullPointerException 行為變更:語言代碼和國際化

查看 Android 8.0 行為變更的完整清單 (API 級別 26),也能使用 請參閱 Android 8.0 行為變更

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

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

除了為您提供新的 API 之外,Android 8.0 還推出了一些行為。 當您將 targetSdkVersion 更新為 26 時會發生什麼變化。因為有些行為 您可能需要變更程式碼才不會中斷 查看指定 Android 8.0 版本為目標版本的應用程式行為變更,並變更 targetSdkVersion 會受到影響。

注意:上述步驟 確保平台相容性是必要條件 將應用程式指定到 Android 8.0 版本,請務必先完成這些步驟。

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

取得 Android 8.0 SDK

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

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

  1. 啟動 Android Studio,按一下 工具 >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 建構應用程式了。

更新建構設定

更新「compileSdkVersion」: 為 targetSdkVersion,且支援資料庫已更新至最新版本 可用的修訂版本,例如:

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 的情況下建構應用程式, 請留意特定的平台異動部分 這些變更可能會對應用程式行為造成大幅影響,甚至 即使您並未 這些功能。

表 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