Android So庫適配簡單總結

2021-10-23 15:20:46 字數 2061 閱讀 3409

mips, mips64, x86, x86–64, arm64-v8a, armeabi, armeabi-v7a
cpu架構

描述市場占有

arm64-v8a

第8代arm,64位

目前主流版本

armeabi-v7a

第7代arm,32位

一些老舊手機

armeabi

第5代arm,32位,ndk r17不再支援

極少,可忽略

x86_64/x86

intel,64位/32位,可相容arm的so庫

1%以下

mips64/mips

ndk r17不再支援

極少用於手機,可以忽略

x86_64/x86:架構的手機都會包含由intel提供的稱為houdini的指令集動態轉碼工具實現對arm.so的相容,再考慮x86 1%以下的市場占有率,x86 相關的兩個 .so 也是可以忽略的。

cpu

arm64-v8a

支付寶armeabi

qqarmeabi

手機**

armeabi-v7a

答案是不會的。

因為armeabi-v7a和arm64-v8a會向下相容:

只適配armeabi-v7a可以執行在armeabi-v7a和arm64-v8a

只適配arm64-v8a 可以執行在arm64-v8a上

當然這會損失一些效能。見下圖,你就明白了:

綜合上面市場占有及大廠適配方案來看,我們只需要適配arm架構即可,即armeabi,armewabi-v7a,arm64-v8三選一。

1.方案一:只適配armeabi

優點:基本上適配了全部cpu架構(除了淘汰的mips和mips_64)

缺點:效能低,相當於在絕大多數手機上都是需要輔助abi或動態轉碼來相容

2.方案二:只適配armeabi-v7a
同理方案一,只是又篩掉了一部分老舊裝置,在效能和相容二者中比較平衡
3.方案三: 只適配arm64-v8
優點: 效能最佳

缺點:只能執行在arm64-v8上,要放棄部分老舊裝置使用者

如果我們既不想放棄舊裝置使用者,也要保證效能,就只能犧牲apk的體積為代價:

ndk
那麼不同cpu架構的手機便只會載入對應的so庫不再向下相容。

比如a.so存在armeabi中,不存在arm64-v8a中。那麼arm64-v8a手機載入a.so庫時,便會崩潰。

因此需要每個so庫同時新增到每種架構中。

armeabi-v7a與armeabi都適用於32位cpu架構,因此理論上他們的so庫時完全通用的,

即如果你的專案只適配了armeabi架構,但是第三方框架只提供了armeabi-v7a的so庫,也是可以直接用的。

但是arm64-v8a是64位的,所以無法通用。

一些沒人維護的第三方庫,年久失修,可能沒有arm64-v8a架構的so庫。

我們這個時候就要考慮是否適配arm64-v8a架構,或者使用其他庫代替。

除了適配所有全部cpu架構外,就特麼不能效能和相容同時兼得嗎?其實google早有考慮。

可以實現的那就是 abi split,分包,實現也很簡單,在gradle 中新增如下配置:

android 

}}

就能為每個cpu架構單獨打乙個apk,該apk中就只包含乙個架構。

這樣,又能保證效能,又能不額外增加apk的大小,同時又又很完美的相容,因為可以為所有架構都單獨打乙個包,一舉多得。

但是,很遺憾,國內的應用商店目前還不支援!因此看看就好 23333

Android SO 檔案的相容和適配

出自 這樣一來,雖然可以相容所有機型,但你的專案體積也會變得非常龐大。是否一定需要帶入這麼多 so 檔案去相容呢?答案是否定的。對於 cpu 來說,不同的架構並不意味著一定互不相容,根據目前 android 共支援七種不同型別的 cpu 架構,其相容特點可總結如下 根據以上的相容總結,我們還可以得到...

Android SO檔案的相容和適配

這樣一來,雖然可以相容所有機型,但你的專案體積也會變得非常龐大。是否一定需要帶入這麼多so檔案去相容呢?答案是否定的。對於cpu來說,不同的架構並不意味著一定互不相容,根據目前android共支援七種不同型別的cpu架構,其相容特點可總結如下 根據以上的相容總結,我們還可以得到一些規律 關於so的相...

Android SO檔案的相容和適配

這樣一來,雖然可以相容所有機型,但你的專案體積也會變得非常龐大。是否一定需要帶入這麼多so檔案去相容呢?答案是否定的。對於cpu來說,不同的架構並不意味著一定互不相容,根據目前android共支援七種不同型別的cpu架構,其相容特點可總結如下 根據以上的相容總結,我們還可以得到一些規律 關於so的相...