Android CPU架構及so庫相容問題總結

2021-08-22 04:54:55 字數 2587 閱讀 1306

armeabi

armeabi-v7a(目前大部分機器)

arm64-v8a (高階機型)

x86x86_64

mips

mips64

android手機大部分採用的是arm架構的cpu.

armv5 裝置:只支援armeabi

armv7 裝置:支援 armeabi 和 armeabi-v7a

armv8 裝置:支援 armeabi-v7a、armeabi 和 arm64-v8a

x86 裝置:支援 armeabi(效能有所損耗) 和 x86

x86_64 裝置:支援 x86 和 x86_64

mips 裝置: 支援 mips

mips_64 裝置:支援 mips 和 mips_64

不同cpu架構的android手機載入時會在libs下找自己對應的目錄,從對應的目錄下尋找需要的.so檔案;

如果沒有對應的目錄,就會去armeabi下去尋找,如果已經有對應的目錄,卻沒有找到對應的.so檔案,也不會去armeabi下去尋找了;

以x86裝置為例,x86裝置會在專案中的 libs資料夾尋找是否含有x86資料夾,如果含有x86資料夾,則預設為該專案有x86對應的so可執行檔案,只有x86資料夾而資料夾下沒有so,程式執行也是會出現find library returned null的錯誤的;如果工程本身不含有x86資料夾,則會尋找armeabi或者armeabi-v7a資料夾,相容執行。

以armeabi-v7a裝置為例,該android裝置當然優先尋找libs目錄下的armeabi-v7a資料夾,同樣,如果只有armeabi-v7a資料夾而沒有 so也是會報錯的;如果找不到armeabi-v7a資料夾,則尋找armeabi資料夾,相容執行該資料夾下的so,但是不能相容執行x86的so。所以專案中如果只含有x86的so,在armeabi和armeabi-v7a也是無法執行的。以上就是不同cpu架構執行時載入so的策略。

目前主流的android裝置主要是 armeabi-v7a 架構的,然後是 x86 和 armeabi 了。如果同時包含了 armeabi, armeabi-v7a和x86,所有裝置都可以執行,程式在執行的時候去載入不同平台對應的so,這是較為完美的一種解決方案,但是有時候為了減少apk的大小,不會同時設定 armeabi, armeabi-v7a 和 x86。根據不同的情況,可以進行不同的適配,

3.同時適配 armeabi-v7a 和 armeabi,既能夠支援所有 arm 架構,同時又能具有 armv7 支援硬體浮點運算等特性,例如line等應用。

4.同時適配 x86 和 armeabi,既能支援所有 arm 架構,又能支援x86架構,唯一的缺點就是沒有了armv7 支援硬體浮點運算等一系列特性,例如qq.

5.同時適配 armeabi, armeabi-v7a 和 x86,在效能方面來說是較為完美的方案,只是apk的大小也會隨之的變大。

arm架構屬於risc指令集,指令集精簡、指令等長,雖然這樣的設計可以提高處理效率,但在遇到複雜的指令後,就需要更多的簡單指令來堆砌複雜任務;arm從來只是設計低功耗處理器。其宗旨是設計低功耗處理器,這是他們的強項。

armeabi:arm架構的預設選項,支援基於 arm* v5te 的裝置,支援軟浮點運算,但不支援硬體輔助浮點運算,支援所有的 arm* 裝置。

armeabi-v7a:armeabi-v7a 向下相容,在相容 armeabi 的基礎上,支援基於 arm* v7 的裝置,支援硬體 fpu 指令,支援硬體浮點運算,目前大部分機器都屬於armeabi-v7a。

arm64-v8a:arm64-v8a向下相容 armeabi 和 armeabi-v7a,最主要的區別在於 arm64-v8a 支援64位,在 mips64 架構上增加了 armv7 架構中已經擁有的的trustzone技術、虛擬化技術及neon advanced simd技術等特性(arm收購mips)。架構中包含兩個執行狀態:aarch32(也就是我們常說的armv7)和aarch64(armv8),也就是說64位的arm處理器中同時包含著32位的armv7和64位的armv8兩種架構,直接導致每種架構所擁有的電晶體減半。

x86構架是英特爾推出的一種複雜指令集,用於控制晶元的執行的程式,目前該構架的處理器已經廣泛運用在pc領域,由於x86構架的處理器晶元在效能上比較強勁,善於執行複雜工作,所以當英特爾進軍移動市場領域後(例如聯想k800),就出現了x86的架構。x86構架屬於典型的cisc,指令集豐富,指令不等長,善於執行複雜工作,更強調序列效能,它的整體運算能力要比只為移動而生的arm架構強大,並且在pc領域已經廣泛應用,擁有深厚的技術背景。英特爾設計超高效能的台式電腦和伺服器處理器,並且的確做的不錯。

x86:英特爾推出的32位cpu架構,生成的二進位制**可支援包含基於硬體的浮點運算的 ia-32 指令集,同時,x86機器基本上可以使用 intel 的 libhounini 專案直接在x86機器上執行僅含armeabi的動態庫**,也就會說x86機器對armeabi也能夠相容,不過效能上會有些損耗。

x86_64:英特爾推出的64位cpu架構,向下相容x86。

mips和mips_64:mips是一種高效能的嵌入式cpu構架,其出發點是高效能,主要用於路由器、貓等

總體來說,android手機大部分採用的是arm架構的cpu.

Android CPU架構解析

armeabi armeabi v7a arm64 v8a x86x86 64 mips mips64 arm架構屬於risc指令集,指令集精簡 指令等長,雖然這樣的設計可以提高處理效率,但在遇到複雜的指令後,就需要更多的簡單指令來堆砌複雜任務 arm從來只是設計低功耗處理器。其宗旨是設計低功耗處理...

FFmpeg編譯各個架構的so檔案

前言 說到編譯指令碼,這裡最好需要點指令碼編譯的知識,當然小白可以可以用,只不過遇到問題會一頭懵。指令碼的引用 這裡我直接用某github上的一位大佬的指令碼進行更改 編譯準備 替換ndk的路徑 如果你直接用build.s 件編譯 這個的可以選擇一次性編譯多個,電腦一般的不建議使用 build.sh...

設定apk只打包指定架構的so

問題描述 android 使用多個包含 so 的第三方庫,應用崩潰。日誌顯示找不到 so。問題分析 現在很多第三方庫都是通過aar方式引用的,裡面也包含了 so 庫。這些so會被編譯進apk的lib資料夾下。apk解壓後可能類似下面 手機在使用這些so時,會先根據自身的cpu載入自己優先支援的架構的...