1. 程式人生 > >應用targetSdkVersion升級指導(一)

應用targetSdkVersion升級指導(一)

電信終端產業協會(TAF)釋出的《移動應用軟體高 API 等級預置與分發自律公約》要求,截止到2019年5月1日所有新發布的應用 API 必須為26或更高,2019年8月1日現有應用 API 必須升級為26或更高。

本文由華為專家季昀對Android8.0系統、Android9.0系統在targetSdkVersion方面的變更進行介紹。我們將於下週四(12月27日)推出targetSdkVersion升級指導系列(二),敬請關注。

*應用 targetSdkVersion 升級流程

 

image

 

測試機準備

1.使用最新支援 Android 9.0 的手機測試:所有 EMUI 9.0 華為手機

2.Pixel刷機:developers.google.com/android/ima…

3.使用綠盟遠端真機:deveco.huawei.com/

4.使用模擬器

targetSdkVersion 相關變更介紹

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屬性)

 

image

 

4.其他變更

 

image

 

Android9.0 變更

1.非 SDK 管控

 

image

 

使用谷歌提供的非 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。

 

image

 

相容性影響

對使用外掛和熱修復的應用有很大影響,需要重點測試。

測試方法

• 啟動應用,構造熱修復場景,在 app 側觸發熱修復

• adb shell cmd package compile -m speed -f my-package 應用包名 (inline編譯)

• 重啟應用,檢查是否會出現閃退問題

適配建議

• 儘量避免使用不同的 classloader 載入相關的類。

• 如果一定要這樣做的話,需要避免內聯,比如在函式裡面加 try catch, 這樣 compiler就不會將這個函式 inline。

4.其他變更

 

image

 

其他的變更和非 TargetSdkVersion 相關的變更以及新特性,可以在谷歌開發者網站查閱:

developer.android.google.cn/distribute/…

developer.android.google.cn/about/versi…