讓您的應用兼容 Android Oreo

   不知不覺Android Oreo已經發布幾個月時間了,你的應用開始使用最新平臺了嗎?在應用遷移過程當中是否遇到了一些棘手問題?你的Android應用兼容Oreo如何呢?android

    咱們應該都知道,每一次重大升級,在兼容性這一塊總會出現或多或少的問題,今天就來一塊兒探討應用的兼容性。安全

    不知道你們是否還記得,從Android 7.0更新後兼容性測試數據結果得知,Top1000主流應用中不兼容應用數量達到166個,致使整體兼容率僅爲83%,相比以前Android 6.0 的更新所致使的應用不兼容問題更加突出。微信

    對於本次Android 8.0升級以後的兼容性,各大應用廠商也很是關注。從本次Google 開發者大會上也能看出谷歌的用心,專門作了一個《讓您的應用兼容 Android Oreo》的主題分享,這裏也簡單整理出來分享給你們,但願對你們將應用遷移到Android 8.0 時有一些幫助。框架

    做爲開發者,咱們的應用應該保持與最新的Android版本兼容性,主要從兩個方面來分享:Android 應用兼容的一些最佳實踐經驗和Android Oreo 中的一些改變地方。函數

    在3月中旬發佈第一個Android Oreo 預覽版本的時候,發現中國的應用只有60%兼容,後來投入了很大的資源,也作了不少工做。工具

    在8月25日正式發佈後,中國Top1000主流應用中有993個兼容,目前在中國應用兼容比率達到96%。性能

    1.非公開的API測試

    有一些經驗就是不要在開發中使用一些非公開的API,由於那些非公開的API在後期更新中可能隨時會去改變函數簽名或函數列表,甚至可能會被刪除掉或改變它的行爲。優化

    若是有強烈願望想要使用能夠告知谷歌,會盡可能蒐集並提供一些公開的API提供給開發者,好比在Android Oreo 中開放了InMemoryDexClassLoader直接從內存裏面加載dex,不要直接調用DexClassLoader,不然會對產生的文件形成必定影響。設計

    2.dex / so文件

    不要直接操做或篡改dex / so文件,最好使用Android Studio 或其餘編譯工具直接生成的dex / so文件。在apk方面也添加了更多的檢查,動態鏈接器再向用戶申請權限的時候,如可寫權限和可執行權限,若是修改了so文件就可能會出錯。

    3.升級第三方SDK

    在不少應用中有一些比較常見的第三方SDK,其中一些加固和熱修復框架用了不少dex操做和私有API,這會致使當新的Android版本出現的時候,使用了這些SDK的應用會崩潰。

    因此須要常常去看這些SDK是否更新,基本都會和這些SDK提供商有緊密的合做,當升級後就會盡可能更新到最新版本。

    4.Janus漏洞

    從Android 5.0版本之後,若是應用僅僅採用SDK安卓的jarsigner簽名機制,就會有一個Janus漏洞,該漏洞會利用ART來執行一個附加在APK以前的一個惡意dex文件。

    目前已在12月發佈的版本中修復,用戶能夠更新補丁,建議開發者使用V1+V2簽名機制。

    5.隱私

    爲了用戶的安全性和隱私性,Settings.secure.ANDROID_ID將根據簽名密鑰和用戶我的資料,每次爲每一個應用返回不一樣的值,也就是說一個應用不可能會知道其餘應用的ANDROID_ID,對一些廣告應用查詢ID後能夠被用戶重置。

    查詢net.hostname系統屬性會返回空值,若是須要訪問用戶帳號的話,GET_ACCOUNTS權限再也不充分,須要使用AccountChooserActivity來彈出一個選擇框來讓用戶進行選擇。

    6.警報

    對於警報方面,設計了一個新的浮動層,在全部應用之上,可是會在系統和關鍵窗口之下。若是在Android Oreo 中繼續使用SYSTEM_OVERLAY,會自動替換爲APPLICATION_OVERLAY。在Android Oreo 中設置使用TYPE_APPLICATION_OVERLAY更加直觀,用戶也能夠更加方便來進行管理行爲和設置。

    7.通知

    在Android Oreo 中對於全部通知都必須使用通知渠道。

    8.多應用窗口顯示

    多窗口顯示也是Android Oreo 中的一個新特性,能夠用一個FLAG_ACTIVITY_LAUNCH_ADJACENT來告訴系統須要使用多窗口。固然須要注意的是,只有在活躍的屏幕裏面的Activity纔會認爲是Activity Task,而不要假設暫停的Activity。多窗口模式的切換與轉屏事件是相同的,標準UI模塊在這方面應該沒什麼問題,若是不能支持多窗口能夠經過android:resizeableActivity="fasle" 來設置。

    9.特長屏幕支持

    Android Oreo 也支持特長屏幕,目前不少廠商都在發佈特長屏幕的手機,對於不少應用來講對屏幕縱橫比有一個錯誤的假設,不然會有上下黑色邊框,或UI模塊和觸摸點沒有對齊,或一些角落UI會被遮擋等。

    若是場景不適合特長屏幕,須要應用經過如下方式設置最大縱橫比:API 25或如下使用android:max_aspect meta data,API 26或以上使用android:MaxAspectRatio。

    接下來着重介紹一下後臺檢查和位置限制,首先並非爲了給開發者添麻煩,而是爲了安卓用戶得到更好的系統健康和電池性能的體驗,而且開發者能夠開發出用戶須要的功能。總而言之,一共有三個方面:

    1.後臺沒辦法再啓動服務了,前臺啓動服務仍然是沒有問題的;

    2.不支持在manifest中註冊的隱式廣播;

    對於這兩個主要是Target SDK爲Android Oreo 纔會受影響,可是不幸的是用戶如今就能夠對應用啓用此限制。

    3.後臺應用會獲得更嚴格的限制來獲取位置。是全部運行在Android Oreo 上的應用都會受到影響,須要馬上解決這方面的問題。

    1.服務

    最重要的原則就是用戶可見。若是應用正在進行耗費資源的工做時,用戶是應該知曉的,從後臺啓動服務會失敗,會拋出一個IllegalStateException給啓動該Service的調用者。

    開發者在調用startService時須要斷定是否位於前臺,注意IntentService也是一種後臺服務,可使用新加的一個類JobIntentService,能夠在不少個地方使用來替換IntentService。大多數服務沒有長時間的交互,可使用JobScheduler或者Firebase Cloud來工做,使得系統更有效的來調度工做。

    2.廣播

    不能經過在manifest中聲明接收器來接收更多的隱式廣播,隱式廣播是指沒有明確的目標組件。如不能經過ACTION_PACKAGE_REPLACED來監視廣播,可是可使用ACTION_MY_PACKAGE_REPLACED來監視顯示廣播。在不少使用廣播的狀況下,可使用JobScheduler來代替。

    3.位置信息限制

    定位很是消耗電池,當有不少應用來定位的時候,電池會消耗的很快,會致使用戶體驗變差,甚至有些功能會失效,所以加入了一些後臺定位的限制。若是應用在前臺,其位置收集策略是不變的,若是用在後臺就會受到一些限制。

    具體說來就是每小時只能接收到幾回位置信息,並且位置信息是基於整個設備的,只要在Android Oreo 上運行都會受到限制。使用批處理會形成必定時間的延遲,可是能夠得到更多的數據位置信息點,也是一個不錯的選擇。

    Android Oreo 裏面作了一些優化,GPS很精確可是很是耗電,WIFI會好一點兒但仍是比較耗電,優化的是當設備保持鏈接在相同的靜態WIFI接入點就表示用戶沒有從原來的位置移動太多,系統就不會進行新的位置計算。

    另外還能夠更好的檢測在不一樣的WIFI之間切換,如在家和工做的時候使用安卓設備,只有在切換WIFI的時候纔會更新位置,平時待在家和待在工做地方的時間段裏就不會更新位置信息。

    一樣的策略對地理圍欄也作了相似的修改,目前關於地理圍欄的信息會從幾十秒增長到2分鐘左右,其功耗只有十分之一。

    在Android Oreo 裏面不可使用PengdingIntent.getService()來獲取後臺更新,雖然能夠繼續使用,但其只在前臺工做。而應該使用PengdingIntent.getBroadcast(),同時在manifest中定義一個接收器,定義爲顯示廣播。

    4.位置信息策略

    若是須要在後臺密集的收集位置信息應該怎麼辦?這裏有一些辦法,能夠定義一些地理圍欄功能,在地理圍欄發生變化時能夠得到確切位置,能夠經過這些位置信息來知道未來如何使用Firebase Cloud來進行更新。而後使用批處理來收集更多的數據點一塊兒返回,雖然每小時只會接收幾回信息,可是能夠獲取更多的數據,對於不少程序來講足夠了,只是不能提供實時性的位置數據。可使用setInterval來設置更新時間,使用setMaxWaitTime來設置批處理的最大時間間隔,使用setFastestInterval來設置被動獲取位置信息。

    以上就是本次主題分享的大體內容,除了以上這些在開發和遷移中,還會碰見一些其餘兼容性問題,會在下一篇分享中整理出來。若是你在遷移應用到Android Oreo 中也碰見了一些問題,也歡迎留言一塊兒來探討。

    此文章版權爲微信公衆號分享達人秀(ShareExpert)——鑫鱻全部,若需轉載請聯繫做者受權,特此聲明!

相關文章
相關標籤/搜索