關於安卓so的兼容性的簡單說明

armeabi、armeabi-v7a、mips、x86 、arm64-v8a如何理解?java

ABI:指應用基於哪一種指令集來進行編譯,ABI之前總共有四種,分別是armeabi、armeabi-v7a、mips、x86,它們都是表示cpu的類型,如今又有了arm64-v8a。spa

(注意:如下全部討論不包括mips)orm

先說之前對於so的平臺兼容處理方式吧。進程

之前安卓都是32位系統,運行的進程都是32位,理論上armeabi的so能夠被全平臺兼容,因此,理論上咱們能夠只提供一個armeabi的so就能在全部cpu平臺運行了。也就是說若是咱們引入了A和B兩個庫,其中A提供了全平臺的armeabi、armeabi-v7a、x86三個so,而B只有一個armeabi的so,那麼咱們能夠把B的這個so複製到其餘兩個文件夾就能夠被兼容了。ip

同時由於如今armeabi的設備比armeabi-v7的要少不少,因此有些應用直接提供了armeabi-v7的so。v8

如今有了arm64-v8a的CPU以及安卓64位系統,上面的方法就有點例外了。it

在安卓64位系統上,同時運行着32位和64位的進程(這點和Windows很像,在64位Windows上也是能同時運行32位和63位的進程的)。編譯

如下討論是基於64位安卓系統上:方法

  1. 若是一個純粹的java寫的應用,沒有使用任何的so,那麼默認就應該以64位模式來運行;cpu

  2. 若是一個應用中只提供了32位的so,那麼這個應用會運行在32位模式,咱們以前的拷貝so到其餘文件夾的方式依然是可行的。

  3. 若是一個應用引入了兩個庫分別是A和B,其中A提供了armeabi,armeabi-v7,arm64-v8a,x86四個so,而B只提供了armeabi一個so,這樣的話,由於應用啓動時會檢測到arm64-v8a的存在,因此就會以64位模式來運行了,這時須要用到的so必須爲64位的,就不能使用armeabi的so來兼容了,也就是說一個進程中一旦使用了64位的so,那麼就不能使用32位的so了,這點也和Windows很像。要解決這個問題,要麼就是找到B的其餘平臺的so,要麼就是去掉A的64位so,以32位模式來運行。

相關文章
相關標籤/搜索