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的相...