1. 程式人生 > >讓您的應用兼容 Android Oreo

讓您的應用兼容 Android Oreo

上下 secure roi ctr 耗電 系統屬性 stat -i count

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

技術分享圖片

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

不知道大家是否還記得,從Andriod 7.0更新後兼容性測試數據結果得知,Top1000主流應用中不兼容應用數量達到166個,導致總體兼容率僅為83%,相比之前Andriod 6.0 的更新所導致的應用不兼容問題更加突出。

技術分享圖片

對於本次Andriod 8.0升級之後的兼容性,各大應用廠商也非常關註。從本次Google 開發者大會上也能看出谷歌的用心,專門做了一個《讓您的應用兼容 Android Oreo》的主題分享,這裏也簡單整理出來分享給大家,希望對大家將應用遷移到Andriod 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)——鑫鱻所有,若需轉載請聯系作者授權,特此聲明!

技術分享圖片

技術分享圖片

讓您的應用兼容 Android Oreo