背景:之前的項(xiàng)目targetSDK的版本是23坦辟,今年所有應(yīng)用需要按照《移動(dòng)應(yīng)用軟件高API等級(jí)預(yù)置與分發(fā)自律公約》的約定树姨,應(yīng)用應(yīng)基于Android O開發(fā)茧痒,否則無法通過應(yīng)用商店的上架雇庙。所以我們的targetSDK版本需要升級(jí)到26鱼鼓,下面是公司的架構(gòu)師總結(jié)的升級(jí)sdk26需要注意的問題哪怔,以及從哪些方面去解決宣蔚,分享給大家參考。
目前大部分互聯(lián)網(wǎng)客戶端基于Android M(API等級(jí)23)開發(fā)
達(dá)到基于API等級(jí)26的目標(biāo)需要包括下列所有適配內(nèi)容:
Android M/23 -> Android N/24 -> Android N/25 -> Android O/26
適配內(nèi)容僅包括 “必須” 適配的部分认境,不包括 “可選” 內(nèi)容胚委。“必須”即如果不完成適配叉信,應(yīng)用可能無法按預(yù)期工作亩冬,或短期內(nèi)可能無法按預(yù)期工作; “可選” 例如采用操作系統(tǒng)新增功能改進(jìn)用戶體驗(yàn)硼身,或改尚未廢棄的老接口為新接口 硅急。
適配方法:
- 調(diào)查Android版本間比較顯著的行為變化,即確認(rèn)之前的框架或機(jī)制能否繼續(xù)按預(yù)期工作佳遂,不能工作的尋找替代方案
- 切換編譯環(huán)境及目標(biāo)API版本营袜,修復(fù)因API接口變化導(dǎo)致的編譯錯(cuò)誤
- 尋找廢棄接口,換用替代方案
- 處理好老版本兼容性
- 對(duì)應(yīng)用進(jìn)行全功能測(cè)試丑罪,排查遺漏的問題并修復(fù)
可能存在問題需要排查的點(diǎn):
- 應(yīng)用自啟動(dòng)限制
- 23 -> 24/25
應(yīng)用未運(yùn)行時(shí)無法收到網(wǎng)絡(luò)變化通知CONNECTIVITY_ACTION荚板;
應(yīng)用不再能發(fā)送、接收ACTION_NEW_PICTURE和ACTION_NEW_VIDEO巍糯;
建議采用更加可靠的方式registerNetworkCallback()來監(jiān)聽網(wǎng)絡(luò)改變 - 25 -> 26
應(yīng)用不再能夠靜態(tài)注冊(cè)接收隱式廣播(例如ACTION_PACKAGE_REPLACED)啸驯,但仍可以靜態(tài)注冊(cè)接收顯式廣播;
應(yīng)用可以動(dòng)態(tài)注冊(cè)接收任意廣播祟峦,無論顯式或隱式罚斗;
需要簽名級(jí)權(quán)限的廣播可以繼續(xù)采用靜態(tài)注冊(cè)接收;
存在一些例外: ACTION_BOOT_COMPLETED宅楞、 ACTION_LOCALE_CHANGED针姿、 ACTION_MEDIA_MOUNTED等可以繼續(xù)靜態(tài)注冊(cè)接收
- 后臺(tái)應(yīng)用運(yùn)行時(shí)間限制
- 23 -> 24/25:Doze
Android 6.0引入Doze,在手機(jī)熄屏厌衙、未充電距淫、靜置不動(dòng)時(shí)進(jìn)入偶爾短暫?jiǎn)拘训男菝吣J剑珹ndroid 7.0不再要求靜置不動(dòng)婶希;
在手機(jī)休眠期間榕暇,系統(tǒng)對(duì)應(yīng)用的網(wǎng)絡(luò)、CPU、GPS彤枢、WiFI等資源和活動(dòng)性進(jìn)行限制 - 25 -> 26:后臺(tái)服務(wù)限制
應(yīng)用剛進(jìn)入后臺(tái)時(shí)狰晚,有幾分鐘的窗口時(shí)間內(nèi)可以使用后臺(tái)服務(wù),過了窗口期缴啡,服務(wù)將被強(qiáng)行停止壁晒,且不允許啟動(dòng)后臺(tái)服務(wù)(拒絕執(zhí)行啟動(dòng),并拋出異常)业栅;
使用Context.startForegroundService()啟動(dòng)前臺(tái)服務(wù)時(shí)秒咐,必須在規(guī)定時(shí)間內(nèi)調(diào)用startForeground();
當(dāng)應(yīng)用執(zhí)行接收SMS/MMS碘裕、執(zhí)行來自通知欄的PendingIntent等用戶可見任務(wù)時(shí)携取,將有幾分鐘的時(shí)間允許使用后臺(tái)服務(wù)
- 后臺(tái)能力限制
- 25 -> 26:定位限制
后臺(tái)應(yīng)用每小時(shí)只能收到幾次位置更新;
電子圍欄事件每?jī)扇昼娛盏揭淮危?br> 無法收到GNSS消息娘汞;
WiFi掃描每小時(shí)只會(huì)執(zhí)行幾次
- 隱私
- 25 -> 26:設(shè)備識(shí)別
應(yīng)用獲得的ANDROID_ID將和特定手機(jī)用戶歹茶、應(yīng)用的簽名相關(guān),不同應(yīng)用獲得的ANDROID_ID不同你弦;
未恢復(fù)出廠設(shè)置的前提下惊豺,同一應(yīng)用重新安裝后將獲得相同的ANDROID_ID;
恢復(fù)出廠設(shè)置后禽作,ANDROID_ID將發(fā)生改變尸昧;
手機(jī)從老版本升級(jí)到Android O時(shí),之前的ANDROID_ID將保留旷偿,但是刪除/重新安裝后將發(fā)生改變烹俗;
Build.SERIAL廢棄(在P上功能移除),需要改用Build.getSerial()萍程,而后者需要READ_PHONE_STATE動(dòng)態(tài)權(quán)限
- 安全性
- 23 -> 24/25:
TLS/SSL中RC4算法禁用幢妄;
TLS/SSL中CHACHA20-POLY1305算法啟用;
Crypto JCA provider廢棄茫负;
應(yīng)用之間無法直接訪問私有文件蕉鸳,不能直接傳遞file://形式的文件路徑,應(yīng)用之間分享文件內(nèi)容需要通過FileProvider進(jìn)行忍法;
應(yīng)用不能再通過COLUMN_LOCAL_FILENAME路徑訪問DownloadManager存儲(chǔ)的文件
- 接口標(biāo)準(zhǔn)化
- 23 -> 24/25:只能使用標(biāo)準(zhǔn)NDK API
應(yīng)用只能使用標(biāo)準(zhǔn)的NDK API潮尝,不能再使用未公開的系統(tǒng)so;
違反結(jié)果:在新版本手機(jī)上無法工作饿序,crash
- 能力變化
- 25 -> 26:創(chuàng)建桌面圖標(biāo)勉失、系統(tǒng)彈出窗口
之前版本創(chuàng)建桌面圖標(biāo)的接口com.android.launcher.action.INSTALL_SHORTCUT不再工作,需要使用新的接口原探;
持有SYSTEM_ALERT_WINDOW權(quán)限的應(yīng)用乱凿,必須使用TYPE_APPLICATION_OVERLAY類型彈出系統(tǒng)窗口顽素,不再能夠使用TYPE_PHONE、TYPE_PRIORITY_PHONE告匠、TYPE_SYSTEM_ALERT戈抄、TYPE_SYSTEM_OVERLAY、TYPE_SYSTEM_ERROR等類型
- 權(quán)限
- 25 -> 26:
需要使用ACTION_INSTALL_PACKAGE的應(yīng)用后专,需要持有REQUEST_INSTALL_PACKAGES權(quán)限(簽名級(jí)+用戶可設(shè)置)
- 其他變化
- API接口行為調(diào)整(例如Notification默認(rèn)設(shè)置)
- API新接口、接口修改输莺、廢棄
- 新功能及功能改進(jìn)(例如多窗口戚哎、Data Saver、畫中畫嫂用、富狀態(tài)欄等)
總結(jié):
以上列出了很多版本變化需要關(guān)注的點(diǎn)型凳,其中最主要是靜態(tài)廣播的注冊(cè)、后臺(tái)服務(wù)的限制以及應(yīng)用間文件訪問方式的變更嘱函。廣播盡可能的采用動(dòng)態(tài)注冊(cè)的方式甘畅,服務(wù)可以選擇前臺(tái)服務(wù)和JobService兩種方式,根據(jù)實(shí)際的業(yè)務(wù)需求來選擇往弓。如果及時(shí)性要求比較高并且能夠接受前臺(tái)服務(wù)通知欄就可以使用前臺(tái)服務(wù)的方式來工作疏唾,如果實(shí)時(shí)性要求不是很高可以使用JobService來交給系統(tǒng)分發(fā),系統(tǒng)一次最多可以執(zhí)行6個(gè)JobService,每個(gè)可以執(zhí)行的時(shí)間大概是10分鐘函似,10分鐘后就會(huì)執(zhí)行其他job槐脏,還可以通過設(shè)置JobService的優(yōu)先級(jí)來保證系統(tǒng)優(yōu)先調(diào)度。
當(dāng)然了撇寞,這些只是比較重要的部分顿天,更多細(xì)節(jié)變化的適配需要通過編譯、測(cè)試驗(yàn)證蔑担,再結(jié)合自己的實(shí)際需求來調(diào)整牌废。