我遇到一個小問題: device supports armeabi-V7a but apk only supports armeabi
Android 的 so 庫和 ABI 配置我原先也是沒有什么概念的,直到上個周,在我嘗試跑一個程序的時候,真機運行沒問題,但是用偉大的模擬機的時候,遇到了這么一個錯誤:

模擬機的下面顯示:
Device supports x86,but APK only supports armeabi-v7a,armeabi,x86_64;
模擬機的設備是 x86,但是運行的這個程序的 apk 卻只支持 armeabi-v7a,armeabi 和 x86_64 三種。
這個問題不僅僅是一個問題,它是很多個問題
是的,那么問題來了
- x86,armeabi-v7a,armeabi,x86_64 到底是什么玩意?
- 我們的代碼是在哪里設置apk對它們支持的?
- 怎么查看和設置模擬機的支持類型?
- 為什么我連接的真機大華為 HUAWEI PE-TL20 沒有顯示這樣的錯誤?
寶寶發現了真相,快來誇我
為了弄明白上面的幾個疑問,我 google 了很多相關方面的內容,終於召喚真相~~下面一個個來解釋~
1.x86,armeabi-v7a,armeabi,x86_64 到底是什么玩意?
這四個玩意都是 CPU 架構類型的名稱。
目前 Android 支持的 CPU 架構有有以下幾種:
| CPU架構 | 描述 |
|---|---|
| armeabi | 第5代 ARM v5TE,使用軟件浮點運算,兼容所有ARM設備,通用性強,速度慢 |
| armeabi-v7a | 第7代 ARM v7,使用硬件浮點運算,具有高級擴展功能 |
| arm64-v8a | 第8代,64位,包含AArch32、AArch64兩個執行狀態對應32、64bit |
| x86 | intel 32位,一般用於平板 |
| x86_64 | intel 64位,一般用於平板 |
| mips | 少接觸 |
| mips64 | 少接觸 |
2.我們的代碼是在哪里設置apk對它們支持的?
如果你和我用的開發工具都是 Android Studio 的話,那么在程序的主module 的 build.gradle中你會發現有這么個代碼:
defaultConfig {
ndk {
abiFilters "armeabi", "armeabi-v7a", "x86_64" } }
- 1
- 2
- 3
- 4
- 5
就是這里設置了支持的 CPU 的類型, 和剛才提示的 apk 支持的 CPU的類型是一模一樣的. 但是,在這里,我也發現了一個不認識的標簽屬性 abiFiliter 硬翻過來是 abi 過濾器, abi 是什么?
ABI, (application binary interface,縮寫為ABI),應用二進制接口。在計算機中,ABI 描述了應用程序(或者其他類型)和操作系統之間或其他應用程序的低級接口
3.怎么查看和設置模擬機的支持類型?
這個問題非常簡單,我們在創建一個模擬機的時候,就有 ABI 的選擇,因為粗心,之前一直都沒有發現,看下圖:

4.為什么我連接的真機大華為 HUAWEI PE-TL20 沒有顯示這樣的錯誤?
問題解決到這里,我們幾乎都猜到了答案,就是大華為 HUAWEI PE-TL20 這個設備支持的CPU 架構 ,肯定是 代碼中支持的 armeabi-v7a,armeabi,x86_64 中的一種。
到底是其中的哪一個呢?我們可以通過adb命令行的方式查看。
具體步驟:
1.連接手機到電腦上
2.打開 cmd 命令窗口,輸入命令 adb shell
3.然后輸入命令 cat /proc/cpuinfo
如果你使用adb的過程中,出現了adb錯誤“'adb' 不是內部或外部命令,也不是可運行的程序或批處理文件,不要慌,這是因為沒有配置 adb 的環境變量,配置一下,就好了。具體配置步驟,可以移步這里 adb錯誤“’adb’ 不是內部或外部命令,也不是可運行的程序或批處理文件
大華為 HUAWEI PE-TL20 的結果如下:

顯示是ARMv7, 對應的應該是armeabi-v7a,看來我們的猜測果然是對的。
學習永遠都沒有結束
其實,這都是關於這個問題的一些小疑惑,我也只是遇到了這個問題,才發現了 ABI 這方面的大欠缺,ABI 到底怎么使用,和 so庫 怎么配合使用,接下來的工作中可能暫時涉及不到,但是私下有時間還是要繼續了解的,希望會有下篇關於我對 ABI 知識 總結的博客誕生。
晚安,世界。
