Android 關於 so 文件的總結

咱們在項目的開發過程當中,避免不了的是引入一些第三方的應用,若是是開源的三方,那麼風險仍是比較好把控的,如果一些商用的 SDK 那麼就要當心了,不免會遇到說在其餘的手機上運行沒有問題,可是在華爲 Mate 8 上運行卻有問題的狀況。大概狀況以下描述:android

問題及解決方案

描述

  • 第一個項目 libs 文件中有 arm64-v8a、armeabi、armeabi-v7a
  • 第二項項目 libs 文件中有 armeabi、armeabi-v7a、x86
  • 第二個項目依賴第一個項目
  • 小米 4 手機手機運行 APP 沒 bug,而華爲 Mate 8 手機運行 APP 出現閃退 bug
    image

解決方案

因爲第一個項目是個第三方,所以須要到第三方官網中去下載 x86 的相關 so 文件,放在 x86 目錄下,把 arm64-v8a 目錄刪除。將全部關於 so 文件的都要保持一致,即:若是你要添加一個 armeabi-v8a 目錄,下面放第三方的 armeabi-v8a 相關的so文件,那麼你其餘的 so 文件都要有相應想 armeabi-v8a 版本,否則就會報錯。web

image

應用程序二進制接口(ABI:Application Binary Interface)

  • 定義了二進制文件(如:.so 文件)如何運行在相應的系統平臺上,從使用的指令集,內存對齊到可用的系統函數庫。在 Android 系統上,每個 CPU 架構對應一個 ABI:armeabi,armeabi-v7a,x86,arm64-v8a,x86_64

CPU 類型

指令集 廠商 位數 描述
arm64-v8a ARM 64 第 8 代,64 位 ARM 處理器,不多設備,如:三星 Galaxy S六、華爲 Mate 8
armeabiv-v7a ARM 32 第 7 代及以上的 ARM 處理器。2011 年之後,大部分的生產的 Android 設備都使用它(目前主流)
armeabiv ARM 32 第 五、6 代的 ARM 處理器,早期的手機使用的比較多
x86 Intel 32 平板、模擬器(x86設備也支持armeabi-v7a和armeabi)
x86_64 Intel 64 64 位的平板
  • Intel 64 指令集在 x86基礎上擴展的
  • armabi 是針對舊的或者普通的ARM v5 CPU
  • armabi-v7a 是針對ARM v7 CPU
  • arm64-v8a 是針對最新的 ARM v8a CPU的。

.so 文件的重要性

若是項目中使用到了 NDK,它將會生成 .so 文件,所以顯然你已經在關注它了。若是隻是使用 Java 語言進行編碼,你可能在想不須要關注 .so 文件了吧,由於 Java 是跨平臺的。但事實上,即便你在項目中只是使用 Java 語言,不少狀況下,你可能並無意識到項目中依賴的函數庫或者引擎庫裏面已經嵌入了 .so 文件,並依賴於不一樣的ABI。 例如,項目中使用 RenderScript 支持庫,OpenCV,Unity,android-gif-drawable,SQLCipher 等,你都已經在生成的APK文件中包含.so文件了,而你須要關注.so文件。 Android 應用支持的ABI取決於APK中位於lib/ABI目錄中的.so文件,其中ABI多是上面說過的幾個 ABI 中的一種。架構

兼容問題

arm64-v8a 是能夠向下兼容的,但前提是咱們項目裏面是沒有 arm64-v8a 文件的。app

  • 問題:假若有兩個文件夾 arm64-v8a 和 armeabi,armeabi 文件夾裏面有兩個文件 a.so 和 b.so,而 arm64-v8a 中只有 a.so 文件,那麼 arm64-v8a 的手機在用到 b.so 文件的時候,發現 arm64-v8a 文件夾裏面沒有該文件,那麼就會報錯。
  • 解決方法:
    • 刪除掉 arm64-v8a 文件夾;當 arm64-v8a 類型的手機發現沒有 arm64-v8a 文件夾的時候就會去 armeabi 文件夾中去找 b.so 文件。
    • armeabi 裏面有的 so 庫,arm64-v8a 裏面也必須有,兩個文件夾裏面的文件保持一致

注意點

  • 全部的x86/x86_64/armeabi-v7a/arm64-v8a設備都支持armeabi架構的.so文件
  • 只保留 armeabi-v7a 中的 so 文件,而移除其餘的 ABI 的 so 文件,能夠減少 apk 體積,但會影響到函數庫的性能和兼容性。如:64位設備(arm64-v8a, x86_64, mips64)可以運行32位的函數庫,可是以32位模式運行,在64位平臺上運行32位版本的 ART 和 Android 組件,將丟失專爲 64 位優化過的性能(ART,webview,media等等)。
  • 對只提供 armeabi 版本的第三方 .so,原樣複製一份到 armeabi-v7a 文件夾

做者介紹

  • 陳堅潤:廣州蘆葦科技 APP 團隊 Android 開發工程師

內推信息

  • 咱們正在招募小夥伴,有興趣的小夥伴能夠把簡歷發到 app@talkmoney.cn,備註:來自掘金社區
  • 詳情能夠戳這裏--> 廣州蘆葦信息科技
相關文章
相關標籤/搜索