電信終端產業協會(TAF)發佈的《移動應用軟件高 API 等級預置與分發自律公約》要求,截止到2019年5月1日全部新發布的應用 API 必須爲26或更高,2019年8月1日現有應用 API 必須升級爲26或更高。android
本文由華爲專家季昀對Android8.0系統、Android9.0系統在targetSdkVersion方面的變動進行介紹。咱們將於下週四(12月27日)推出targetSdkVersion升級指導系列(二),敬請關注。web
*應用 targetSdkVersion 升級流程shell
測試機準備apache
1.使用最新支持 Android 9.0 的手機測試:全部 EMUI 9.0 華爲手機網絡
2.Pixel刷機:developers.google.com/android/ima…app
3.使用綠盟遠程真機:deveco.huawei.com/ide
4.使用模擬器函數
Android8.0 變動工具
1.後臺服務限制測試
①哪些應用會受到後臺服務限制?
• TargetSDK>=26的應用
• TargetSDK<26且被用戶主動設置爲限制後臺活動的應用(華爲EMUI8.x未提供配置)
注意:Doze 白名單中的應用不受限制(用戶能夠設置,手機管家配置有默認值白名單)
②前臺如何定義?
• 前臺有可見 Activity
• 前臺服務能夠後臺播放
• 綁定服務的狀況
③後臺服務限制,限制了哪些行爲?
• 應用進入 uidldle 後,會被調用 Service.stopself()
• 應用進入 uidldle 後,不容許經過 startService啓動服務
• 應用進程仍然存在,JobScheduler、Alarm、廣播等均能觸發
•廣播接收線程處理短暫業務,沒法拉起後臺服務
• 非安卓組件線程 CPU 超標時,谷歌原生機制會強制kill進程
④臨時白名單機制
系統調用應用時,少許場景會將應用添加到臨時白名單(有效時間30秒~300秒):
• 處理高優先級 FCM 消息
• 接收短信彩信
• 用戶點擊通知欄,執行 PendingIntent
⑤用戶設置限制後臺活動以後的影響(Android P優化)
• 應用退後臺,1分鐘就會被中止 Service(包括正在執行的前臺任務)
• 限制訪問網絡
• 限制 Alarm 觸發
• 限制 JobScheduler 執行
2.廣播限制
Android 8.0 的應用沒法繼續在其清單中爲隱式廣播註冊廣播接收器,但也存在例外狀況:
• 應用能夠繼續在清單中註冊顯式廣播
• 應用能夠在運行時使用 Context.registerReceiver() 爲任意廣播(無論是隱式仍是顯式)注 冊接收器
• 須要簽名權限的廣播不受此限制所限,由於這些廣播只會發送到使用相同證書籤名的應用 ,而不會發送至設備上的全部應用
•白名單豁免隱式廣播的列表:developer.android.com/guide/compo…
後臺執行限制的適配建議
• 使用 JobScheduler 代替
• 增長前臺服務
•加 Doze 白名單(不推薦)
3.最大屏幕縱橫比
以 Android 7.1(API 級別 25)或更低版本爲目標平臺中應用默認的最大屏幕縱橫比爲1.86。針對 Android 8.0 或更高版本的應用沒有默認的最大縱橫比,如需設置請在應用 androidmanifest 文件定義 maxAspectRatio 屬性(注意:若是應用沒有顯示申明不支持 resizeableActivity,系統將會忽略應用設置的 maxAspectRatio屬性)
4.其餘變動
Android9.0 變動
1.非 SDK 管控
使用谷歌提供的非 SDK 掃描工具查看應用使用的深灰名單和黑名單非 SDK 接口: android.googlesource.com/platform/pr… master/appcompat/
2. Apache HTTP 客戶端棄用
默認狀況下該內容庫已從 bootclasspath 中移除且不可用於應用,應用不能使用系統的 classloader 加載 org.apache.http.* 庫,不然會拋 NoClassDefFoundError。
適配建議
• 方法一:若是要繼續使用 Apache HTTP 客戶端,以 Android 9.0及更高版本爲目標的應用能夠向其 AndroidManifest.xml 添加如下內容:
• 方法二:若是必需要繼續使用 Apache HTTP 客戶端,開發者能夠將 org.apache.http.legacy庫打包進本身的apk。
• 推薦方法:使用 HttpURLConnection 類替代 apache-http
3.內聯方法不容許跨dex
Google 在 Android P 新增檢測:若是調用某個 inline 方法的類與 inline 方法所在的類由不一樣的 classloader 加載,就會主動發起 abort(inline不容許跨dex文件)致使應用 crash。
兼容性影響
對使用插件和熱修復的應用有很大影響,須要重點測試。
測試方法
• 啓動應用,構造熱修復場景,在 app 側觸發熱修復
• adb shell cmd package compile -m speed -f my-package 應用包名 (inline編譯)
• 重啓應用,檢查是否會出現閃退問題
適配建議
• 儘可能避免使用不一樣的 classloader 加載相關的類。
• 若是必定要這樣作的話,須要避免內聯,好比在函數裏面加 try catch, 這樣 compiler就不會將這個函數 inline。
4.其餘變動
其餘的變動和非 TargetSdkVersion 相關的變動以及新特性,能夠在谷歌開發者網站查閱: