從 2018 年 8 月起,全部向 Google Play 提交的新應用都必須針對 Android 8.0 (API 等級 26) 開發。2018 年 11 月起,全部 Google Play 的現有應用更新一樣必須針對 Android 8.0。html
Android 每次版本更新都會做出變動,顯著提高應用安全性以及性能並改善總體用戶體驗。其中部分變動僅適用於那些經過 manifest 文件中的 targetSdkVersion 屬性 (即目標 API 等級) 明確指出支持新版 API 行爲的應用。android
請將您的應用目標 API 等級設置爲最新版本並確保用戶可以享用這些改進項目,同時容許應用在低版本 Android 仍舊能夠運行。適配新目標等級後,應用能夠利用 Android 平臺最新功能 (latest features) 給用戶創造更美好的體驗。安全
本文重點說明了開發者在更新目標 API 中應該注意的幾個事項,從而知足 Google Play 的要求。在進行下一步前,請根據您的 app 現有 API 等級閱覽:網絡
早於 Android 5.0 (API 等級 21)app
早於 Android 6.0 (API 等級 23)ide
早於 Android 7.0 (API 等級 24)函數
早於 Android 8.0 (API 等級 26)性能
注意:若是您的 gradle 文件包含 manifest 條目,您可確認或者更改文件中 targetSdkVersion 的當下值,詳情請閱覽《如何配置您的構建》(Configure Your Build)。或者說,您也能夠使用 manifest 文件中的 android:targetSdkVersion 配置項,具體操做請閱覽 <uses-sdk> manifest 屬性的相關文檔。測試
早於 Android 5.0 (API 等級 21)gradle
請根據 API 版本閱覽相應的《行爲變動》頁面,確保您的應用可以順利應對各個版本發佈:
Android 5.0 (API 等級 21)
Android 4.4 (API 等級 19)
Android 4.1 x (API 等級 16)
早於 Android 6.0 (API 等級 23)
下文列舉內容適用於針對 Android 6.0 或更高版本平臺開發的應用:
在運行時請求權限
- 危險權限只能夠在運行時被授予。應用的 UI 流必須提供相應可供性向用戶請求這些權限;
- 但凡可能,您的應用要準備好應對權限請求被拒的狀況。譬如說,若是某個用戶拒絕您的應用訪問設備 GPS,應用須經過其它方法繼續運行。
要了解 Android 6.0 (API 等級 23) 的詳細變動,請閱覽該版本的《行爲變動》(Behavior Changes) 文檔。
早於Android 7.0 (API 等級 24)
下文列舉內容適用於針對 Android 7.0 或更高版本平臺開發的應用:
Doze 以及應用待機模式:
請根據《Doze 以及應用待機模式優化》一文中的相關描述設計您的 app,文章涵蓋適用幾個 Android 版本的逐步變動。
當設備進入 Doze 或者待機模式時,會產生下述系統行爲:
- 網絡訪問限制;
- 推遲應用的 alarms、syncs 和 jobs;
- GPS 以及 Wi-Fi 掃描限制;
- 普通優先級 Firebase Cloud Messaging 消息限制;
權限變動
- 系統將限制訪問應用私有目錄;
- 在應用外公開 file://URI會致使 FileUriExposedException。開發者能夠使用 FileProvider 在應用間進行文件共享;
系統阻止應用連接非 NDK 庫。
要了解 Android 7.0 (API 等級 24) 的詳細變動,請閱覽該版本的《行爲變動》(Behavior Changes) 文檔。
早於 Android 8.0 (API 等級 26)
下文列舉內容適用於針對 Android 8.0 或更高版本平臺開發的應用:
後臺執行限制 (Background Execution Limits)
- 若您的應用不運行在前臺,系統將會限制服務:
·· 當應用試圖調用 startService() 而 startService 又被禁止時,startService() 會拋出異常;
·· startForegroundService() 應用必須使用 startForeground()和 startForegroundService() 函數啓動前臺服務;
·· 請前往 Android 8.0 (API 等級 26) 《行爲變動》頁面,仔細閱讀關於 JobScheduler API 的變動;
·· Firebase Cloud Messaging 要求 10.2.1 或更高版本的 Google Play 服務 SDK;
·· Firebase Cloud Messaging documentation 在使用 Firebase Cloud Messaging 時,消息投遞受限於後臺執行限制。若消息接收須要必要後臺工做,如後臺數據同步,您的應用需要經過 Firebase Job Dispatcher 或者 JobIntentService 調度任務。詳情請閱覽《Firebase Cloud Messaging 文檔》。
- 隱式廣播限制:
·· 系統會限制隱式廣播。有關處理後臺事件詳情,請閱讀JobSechduler API 文檔;
·· 後臺位置限制;
·· 後臺運行的應用訪問位置數據受限;
支持 Google Play 服務的設備能夠經過 fused location provider 按期獲取位置更新。
通知渠道
- 您應該爲每一個渠道分別定義通知中斷設特性:
·· 您必須將通知分配到某一渠道 (channel),以便通知顯示;
·· 該版本 Android 平臺支持 NotificationCompat.Builder;
隱私
- ANDROID_ID 會根據每一個應用簽署密鑰肯定做用域。
要了解 Android 8.0 (API 等級 26) 的詳細變動,請閱覽該版本的《行爲變動》(Behavior Changes) 文檔。
當您在更新應用目標 API 等級時,請考慮應用平臺近期發佈的新功能,讓您的應用更爲現代化併爲用戶帶去更好的體驗。
請將您的 app 從 Google Cloud Messaging (GCM) 遷移至 Firebase Cloud Messaging 最新版本;
使用高級窗口管理:
- Declare Restricted Screen Support 支持更大寬屏比率 (大於 16:9),讓應用可以利用最新的硬件技術。確保您的應用調整大小後能填充可用的屏幕空間。萬不得已狀況下,能夠聲明最大屏幕寬高比。更多有關最大屏幕寬高比信息,請閱覽《聲明受限屏幕支持》;
- multiple displays 添加多窗口支持,提高 app 效率並管理多屏幕適配;
- 若是最小化應用可以幫助您改善用戶體驗,您可添加畫中畫支持;
- 針對凹口屏幕設備的優化:
·· 不要假定狀態欄高度,而是使用 WindowInsets 以及View.OnApplyWindowInsetsListener;
·· 不要假定應用是全屏顯示的,而是經過調用View.getLocationInWindow() (注意:不是View.getLocationOnScreen()) 來肯定應用屏幕位置;
·· 在處理 MotionEvent 時,調用 MotionEvent.getX() 和MotionEvent.getY();而非 MotionEvent.getRawX() 或MotionEvent.getRawY();
使用現代攝像頭支持:
- 使用 Camera2 API 最大化攝像頭利用率;
- Pixel 2 devices 在 Pixel 2 設備上啓用 Pixel Visual Core 加速 HDR+ 處理。
請確保您使用的三方 SDK 依賴項支持 API 26:部分 ADK 供應商會在發佈說明中寫明是否支持;其它供應商則需要進一步調查。若是您使用的 SDK 不支持 API 26,請儘快與 SDK 供應商合做解決該問題。
此外,請注意您的應用或者遊戲中的 targetSdkVersion 可能會限制訪問私有 Android 平臺庫,請閱覽《將 NDK 應用連接至平臺庫》獲取進一步信息。
您還需要驗證您正在使用的 Android 支持庫可能存在的任何限制。和以往同樣,您必須確保應用中的 compileSdkVersion 與 Android 支持庫主要版本可以順利兼容。
咱們推薦您選擇小於或等於 Support Library 主要版本的 targetSdkVersion ,並建議您升級到近期發佈的兼容 Support Library,從而可以使用到最新版本的兼容性特性和錯誤修正功能。
在更新完應用的 API 等級和功能後,您需要測試一些核心用例。下文列舉的幾條建議並無涵蓋全部狀況,但但願能給您提供指導做用。咱們建議進行如下幾個方面的測試:
測試應用兼容 API 26, 不產生錯誤和警告;
您的應用應該有相應策略來妥善應對用戶拒絕訪問權限的狀況,並提示用戶授予權限。爲了達到該效果,您需要:
- 前往應用的信息頁面,而後拒絕每一個權限;
- 開啓應用,確保沒有崩潰;
- 進行核心用例測試,並確保全部必須權限請求再被顯示;
妥善應對 Doze 模式,達到預期效果且不致使錯誤:
- 在應用運行時,使用 adb 讓您的測試設備進入 Doze 模式:
·· 測試任何觸發 Firebase Cloud Messaging 消息的用例;
·· 測試任何須要使用鬧鐘或者任務用例;
·· 消除全部後臺服務依賴;
- 設置您的應用進入待機模式:
·· 測試任何觸發 Firebase Cloud Messaging 消息的用例;
·· 測試任何須要使用鬧鐘的用例;
處理新拍攝的照片以及視頻:
- 檢查您的應用是否妥善處理 ACTION_NEW_PICTURE 以及 ACTION_NEW_VIDEO 廣播限制 (即移動至 JobScheduler 任務);
- 確保任何依賴此類事件的重要用例都能順利運行;
應用間分享文件:
- 請測試全部涉及到應用間分享文件數據的案例 (即便是同一開發者開發的應用);
- 請測試其它應用是否可以成功顯示內容,並且不引起崩潰。