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

image.png
因爲國內 Android 開發環境的特殊性,兼容性一直是不少開發者極爲關注的問題。爲此,咱們特地請來了負責 Android 在中國兼容性問題的 Google 工程師爲你們對一些常見問題作出解答,來看看個人工程師提到了哪些要點吧!

"你們好,我是谷歌的開發技術推廣工程師,主要負責 Android 在中國的兼容性問題。咱們發現,每次有 Android 新版本發佈時,國內有不少應用因爲沒有遵循最佳開發實踐,或使用了依賴於底層非公開 API 的 「黑科技」,而沒法直接在新版本上運行,必須作出至關的代碼修改來進行兼容。在這篇文章中,咱們總結了關於應用開發在兼容性方面的注意事項,但願你們在開發過程當中多加註意。"android

不要使用私有 API

私有 API 是指 Android 系統內部使用、並未提供公開接口的 API,開發者可能經過 Java 反射等技術來調用這些私有 API。可是,這麼作是很危險的:私有 API 沒有任何公開文檔,必須查看源代碼才能理解其行爲邏輯。安全

私有 API 的接口信息、函數簽名(包括參數列表和返回值)、行爲邏輯都有可能在下個 Android 版本中被大幅修改,甚至 API 自己也可能被刪除。這會致使使用私有 API 的應用在新的 Android 版本中沒法運行,或運行時產生不符合預期的行爲,開發者必須投入至關的研發資源保持其在將來每一個 Android 新版本中的適配。框架

直接使用底層的私有 API 有可能會繞過一些 Android 對用戶的安全性和隱私性方面的保護,不但影響用戶體驗、妨害用戶隱私,也極可能會被 Google Play Protect 斷定爲惡意軟件而提示用戶卸載應用。ionic

因此,咱們強烈建議開發者只使用 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 文件

image

Android Studio 生成的 dex 文件雖然有公開的佈局格式,但具體內容仍是會在運行時被系統在後臺進行編譯優化。若是您在 dex 文件中寫入自定義的內容,極可能這些自定義的寫入操做與系統優化發生衝突,以至自定義的內容被擦除或覆蓋,甚至致使優化後的 dex 在執行時直接崩潰。google

Android Studio 生成的 so 文件包含一些元數據(如 ELF headers 和 section headers),以備動態連接器進行完整性檢查。篡改 so 文件並不會帶來安全性的提高(不少工具能夠從新生成元數據),反而可能致使應用沒法在將來的 Android 版本中沒法啓動(因爲動態連接器可能執行更嚴格的檢查)。更多關於 so 文件的要求,請查看如下連接中的文檔(會有不按期更新):設計

android.googlesource.com/platform/bi…

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

Android 系統內部加載 dex 的邏輯比較複雜,會考慮不少因素(如安全性、隱私性等),其具體行爲邏輯也可能會在新版本中加以修改。若是您干擾或篡改了 dex 的加載邏輯,不但會增長安全性方面的風險,也極可能在新的系統更新後再也不工做,甚至致使應用沒法運行。

不要使用 DexFile 類

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

好比,當多個類加載器試圖使用同一個 DexFile 對象來定義某個類時,Android 系統會拋出 InternalError,其錯誤信息爲 「Attempt to register dex file with multiple class loaders」。這是由於運行環境將 DexFile 與一些附加的內部狀態信息進行關聯,而這些內部狀態信息不能在類加載器之間進行共享。

因此,請不要在應用代碼中再使用 DexFile 類型。

及時升級第三方 SDK

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

image

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

您還有哪些難以解決的開發問題呢?歡迎留言!

image
相關文章
相關標籤/搜索