1. 程式人生 > >Android 開發者 | 應用相容性注意事項

Android 開發者 | 應用相容性注意事項

0?wx_fmt=gif&wxfrom=5&wx_lazy=1

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1

由於國內 Android 開發環境的特殊性,相容性一直是很多開發者極為關注的問題。為此,我們特意請來了負責 Android 在中國相容性問題的 Google 工程師為大家對一些常見問題做出解答,來看看我的工程師提到了哪些要點吧!

"大家好,我是谷歌的開發技術推廣工程師,主要負責 Android 在中國的相容性問題。我們發現,每次有 Android 新版本釋出時,國內有很多應用由於沒有遵循最佳開發實踐,或使用了依賴於底層非公開 API 的 “黑科技”,而無法直接在新版本上執行,必須做出相當的程式碼修改來進行相容。在這篇文章中,我們總結了關於應用開發在相容性方面的注意事項,希望大家在開發過程中多加註意。"

不要使用私有 API

私有 API 是指 Android 系統內部使用、並未提供公開介面的 API,開發者可能通過 Java 反射等技術來呼叫這些私有 API。但是,這麼做是很危險的:私有 API 沒有任何公開文件,必須檢視原始碼才能理解其行為邏輯。

私有 API 的介面資訊、函式簽名(包括引數列表和返回值)、行為邏輯都有可能在下個 Android 版本中被大幅修改,甚至 API 本身也可能被刪除。這會導致使用私有 API 的應用在新的 Android 版本中無法執行,或執行時產生不符合預期的行為,開發者必須投入相當的研發資源保持其在未來每個 Android 新版本中的適配。

直接使用底層的私有 API 有可能會繞過一些 Android 對使用者的安全性和隱私性方面的保護,不但影響使用者體驗、妨害使用者隱私,也很可能會被 Google Play Protect 判定為惡意軟體而提示使用者解除安裝應用。

所以,我們強烈建議開發者只使用 Android 公開的 API 進行應用開發。公開 API 有詳細的技術文件和支援渠道,未來的 Android 新版本也會保證公開 API 的相容性(即使有改動,也會在文件中詳細闡明)。

如果您有合理的理由,必須使用某個私有 API,請告訴我們!我們很樂意聆聽和討論,並會在充分評估必要性和可行性後,在 Android 系統或 Support Library 中提供方案來滿足合理的功能需求。

不要直接呼叫 dex2oat

從一開始,dex2oat  就被設計為系統內部使用的編譯部署工具,Android 從來都未支援過開發者直接呼叫 dex2oat 的場景。我們會持續而不定期地對這個工具進行優化,而很多時候其行為變更(如:生成的檔案及其格式)都是與之前不相容的。在大多數情況下,標準的類載入器(BaseDexClassLoader / DexClassLoader / PathClassLoader)無法找到或使用由直接呼叫 dex2oat 生成的檔案。

如果您需要從記憶體中載入 dex 檔案,而不願在儲存中留下痕跡,請使用 Android O 中新增的載入器 InMemoryDexClassLoader。

不要注入或篡改 Android Studio 生成的 dex 和 so 檔案

0?wx_fmt=png

Android Studio 生成的 dex 檔案雖然有公開的佈局格式,但具體內容還是會在執行時被系統在後臺進行編譯優化。如果您在 dex 檔案中寫入自定義的內容,很可能這些自定義的寫入操作與系統優化發生衝突,以致自定義的內容被擦除或覆蓋,甚至導致優化後的 dex 在執行時直接崩潰。

Android Studio 生成的 so 檔案包含一些元資料(如 ELF headers 和 section headers),以備動態連結器進行完整性檢查。篡改 so 檔案並不會帶來安全性的提升(很多工具可以重新生成元資料),反而可能導致應用無法在未來的 Android 版本中無法啟動(由於動態連結器可能執行更嚴格的檢查)。更多關於 so 檔案的要求,請檢視以下連結中的文件(會有不定期更新)

https://android.googlesource.com/platform/bionic/+/master/android-changes-for-ndk-developers.md

不要干擾或篡改系統內部載入 dex 的邏輯

Android 系統內部載入 dex 的邏輯比較複雜,會考慮很多因素(如安全性、隱私性等),其具體行為邏輯也可能會在新版本中加以修改。如果您干擾或篡改了 dex 的載入邏輯,不但會增加安全性方面的風險,也很可能在新的系統更新後不再工作,甚至導致應用無法執行。

不要使用 DexFile 類

DexFile 類已經在 Android O 中被廢棄。DexFile 在應用開發中的使用暴露了很多問題,導致應用崩潰或錯誤結果。

比如,當多個類載入器試圖使用同一個 DexFile 物件來定義某個類時,Android 系統會丟擲 InternalError,其錯誤資訊為 “Attempt to register dex file <filename> with multiple class loaders”。這是因為執行環境將 DexFile 與一些附加的內部狀態資訊進行關聯,而這些內部狀態資訊不能在類載入器之間進行共享。

所以,請不要在應用程式碼中再使用 DexFile 型別。

及時升級第三方 SDK

在中國的 Android 生態中,應用經常依賴的第三方 SDK(特別是加固和熱修復框架)會有很多直接的 dex 操作,而導致應用在 Android 版本升級時無法正常執行。我們也開始與一些常見的 SDK 提供商合作(並計劃覆蓋更多),在 Android 新的預覽版本中儘早解決相容性問題。對於應用開發者來說,只需要經常檢查第三方 SDK 的升級公告,及時升級至其最新版本,就能解決大部分與其相關的相容性問題。

0?wx_fmt=png

看了工程師劃的重點,不知您是否有種豁然開朗的感覺呢?面對複雜的中國 Android 開發生態,很多朋友都會遇到一些特殊的問題,為了更好地服務於國內的 Android 開發者,我們會在收集到一定量特定領域的諮詢後,為大家帶來 Google 工程師的解決建議及規避方法。

您還有哪些難以解決的開發問題呢?歡迎在我們的公眾平臺留言!

0?wx_fmt=jpeg

推薦閱讀:

0?wx_fmt=gif