Android O 8.0 新特性(三) 向Android8.0 遷移應用

Android 8.0 引入了若干新的功能和 API,並加入了即便您未對應用做任何更改仍可能對其行爲產生影響的一些變動。爲幫助您做好準備,本頁面將說明如何執行兼容性測試,以及如何更新應用以便利用 Android 8.0 的新功能:

  1. 確保平臺兼容性

    驗證您的應用能夠在新版本平臺上全功能運行。在此階段,您不需要使用新的 API,也不需要更改應用的 targetSdkVersion,但可能需要進行一些細微的更改。

  2. 使用 Android 8.0 SDK 構建應用

    當您準備好利用平臺的新功能時,將 targetSdkVersion 更新至“O”,驗證應用是否仍可按預期方式運行,然後開始使用新的 API。

確保平臺兼容性


這一步的目標是確保應用在 Android 8.0 上可照常運行。由於一些平臺變化可能影響應用的行爲方式,因此可能需要進行一些調整,但您不需要使用新的 API 或更改 targetSdkVersion

準備一臺運行 Android 8.0 的設備

  • 如果您有一臺兼容設備(Pixel、Pixel XL、Pixel C、Nexus 5X、Nexus 6P 或 Nexus Player),請從下載頁面獲得適合您的設備的 Android 8.0 系統映像,然後按照說明將映像刷入設備
  • 或下載適用於 Android Emulator 的 Android 8.0 系統映像。它列於 SDK 管理器 Android 8.0 Preview 下,顯示爲 Google APIs Intel x86 Atom System Image

    :Android 8.0 系統映像只能通過 Android Studio 3.0 Canary 下載。如需瞭解詳細信息,請參閱下面一節以獲取 Android 8.0 SDK

執行兼容性測試

與 Android 8.0 的兼容性測試多半與您準備發佈應用時執行的測試屬於同一類型。這時有必要回顧一下核心應用質量準則測試最佳做法

不過,測試還有另一個層面:Android 8.0 向 Android 平臺引入了一些變化,即便不對 targetSdkVersion 做任何變動,仍可能影響應用的行爲或令其根本無法運行。因此,您必須回顧表 1 中的關鍵變化,並對任何爲適應這些變化而實現的修復進行測試。

表 1. 對運行在 Android 8.0 設備上的所有應用都有影響的關鍵變化。

變化摘要其他參考資料
後臺位置更新頻率下降如果應用接收來自後臺服務的位置更新,則其在 Android 8.0 上接收更新的頻率要比舊版本 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 行爲變更列表,另請參閱 Android 8.0 行爲變更

構建具有 Android 8.0 功能的應用


如表 2 所述,除了提供新的 API 外,Android 8.0 還會在您更新 targetSdkVersion 時引發其他行爲變更。本節說明如何將開發環境設置爲以新平臺爲目標,以及如何着手構建和測試 Android 8.0 API 帶來的變化和新功能。

:上述旨在確保平臺兼容性的步驟是面向 Android 8.0 構建應用的先決條件,因此請您務必先完成這些步驟。

獲取 Android 8.0 SDK

  1. 安裝 Android Studio 3.0 Canary

    只有 Android Studio 3.0 包含對 Android 8.0 提供的所有新開發者功能的支持。因此您需要獲得 Android Studio 3.0 Canary 版本,以便開始使用 Android 8.0 SDK。但您仍可保留已安裝的 Android Studio 穩定版。

  2. 啓動 Android Studio 3.0,然後點擊 Tools > Android > SDK Manager 打開 SDK 管理器。
  3.  SDK Platforms 標籤中,選中 Show Package Details。在 Android 8.0 Preview 下選中下列項:
    • Android SDK Platform O
    • Google APIs Intel x86 Atom System Image(只需在使用模擬器時選中)
  4. 切換到 SDK Tools 標籤,選中所有已提供更新的項(點擊每個顯示破折號  的複選框)。這應該包括下列必需項:
    • Android SDK Build-Tools 26.0.0(rc2 或更高版本)
    • Android SDK Platform-Tools 26.0.0(rc2 或更高版本)
    • Android Emulator 26.0.0
    • Support Repository
  5. 點擊 OK 安裝所有選定的 SDK 軟件包。

現在您就可以開始使用 Android 8.0 進行開發了。

更新構建配置

 compileSdkVersionbuildToolsVersiontargetSdkVersion 和 Support Library 版本更新爲下列版本:

android {
  compileSdkVersion 'android-O'
  buildToolsVersion '26.0.0-rc2'

  defaultConfig {
    targetSdkVersion 'O'
  }
  ...
}

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

// REQUIRED: Google's new Maven repo is required for the latest
// support library that is compatible with Android 8.0
repositories {
    maven {
        url 'https://maven.google.com'
    }
}

您不能在此配置下發布應用。“O”版本是一個臨時 API 級別,只能用於 Android 8.0 期間的開發和測試。您必須等到最終 API 級別發佈時再發布 Android 8.0 變更,屆時再次更新配置。

從清單文件中移除廣播接收器

由於 Android 8.0 引入了新的廣播接收器限制,因此您應該移除所有爲隱式廣播 Intent 註冊的廣播接收器。將它們留在原位並不會在構建時或運行時令應用失效,但當應用運行在 Android 8.0 上時它們不起任何作用。

顯式廣播 Intent(只有您的應用可以響應的 Intent)在 Android 8.0 上仍以相同方式工作。

這個新增限制有一些例外情況。如需查看在以 Android 8.0 爲目標平臺的應用中仍然有效的隱式廣播的列表,請參閱隱式廣播例外

測試 Android 8.0 應用

完成以上準備工作後,您就可以構建應用,然後對其做進一步測試,以確保 Android 8.0 爲目標平臺時它能正常工作。這時有必要回顧一下核心應用質量準則測試最佳做法

如果您構建應用時設置了適用於 Android 8.0 的 targetSdkVersion,應該注意特定的平臺變化。即便您不實現 Android 8.0 中的新功能,其中的一些變化仍可能嚴重影響應用的行爲或令其根本無法運行。

表 2 列出了這些變化以及可獲得更多信息的鏈接。

表 2. targetSdkVersion 設置爲“O”時影響應用的關鍵變化。

變化摘要其他參考資料
隱私性Android 8.0 不支持使用 net.dns1、net.dns2、net.dns3 或 net.dns4 系統屬性。行爲變更:隱私性
實行了可寫且可執行的代碼段對於原生庫,Android 8.0 實行的規則是:數據不應可執行,代碼不應可寫。行爲變更:原生庫
ELF 標頭和節驗證動態鏈接器對 ELF 標頭和節頭中的更多值進行檢查,如果值無效則失敗。行爲變更:原生庫
通知以 SDK 的 Android 8.0 版本爲目標平臺的應用必須實現一個或多個通知渠道,以便向用戶發佈通知。API 概覽:通知
List.sort() 方法該方法的實現不得再調用 Collections.sort(),否則應用將因堆棧溢出而引發異常。行爲變更:集合的處理
Collections.sort() 方法在列表實現中,Collections.sort() 現在會引發 ConcurrentModificationException行爲變更:集合的處理

如需查看更詳盡的 Android 8.0 行爲變更列表,請參閱 Android 8.0 行爲變更

要想探究 Android 8.0 提供的新功能和新 API,請參閱 Android 8.0 功能和 API

官網:https://developer.android.com/about/versions/oreo/android-8.0-migration.html


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章