android多cpu架構適配開篇

來源:互聯網
上載者:User

標籤:相容   so   android   ndk   armeabi   

簡介:做項目的時候經常會使用到so檔案。例如使用高德地圖,其SDK中就包含了armeabi、armeabi-v7a、arm64-v8a、x86等其他檔案夾,裡面通常放著同樣名稱、同樣數量的so檔案。實際使用過程中,關於這些so檔案引發的問題確實不少,也不好解決。寫下此文,希望以後遇到相關的問題,能有個大概的思路。


名詞解析:

    NDK:Native Development Kit

    JNI:Java Native Interface

    ABI: Application Binary Interface 應用二進位介面


Android Studio使用so庫

1、使用和eclipse一樣在libs目錄下建立armeabi目錄的方式

需要在build.gradle中添加指定jni庫目錄的語句

sourceSets {

   main.jniLibs.srcDirs = [‘libs‘]//指定libs為jni的存放目錄

}

2、使用AS預設的位置:src/main/jniLibs

直接在src/main/下建立jniLibs目錄,將armeabi等目錄放到該目錄下即可

備忘:AS可以直接右鍵建立同目錄下的jniLibs目錄,但該目錄不是編譯好的庫檔案目錄,而是未編譯的本地代碼檔案的目錄(這裡指的是與java同級的jni目錄,放置cpp代碼的)


android支援的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 少接觸


安裝時的相容性檢查:

   安裝到系統中後,so檔案會被提取在:data/app/com.xxxxxxxx.app-x/lib/目錄下(5.0版本)、/data/app-lib/目錄下(4.2版本),其中armeabi和armeabi-v7a會產生arm目錄,arm64-v8a會產生arm64目錄。

   安裝app的時候,如果app使用了so檔案,而不存在適合本機cpu架構的so檔案,會報如下錯誤:

Installation failed with message INSTALL_FAILED_NO_MATCHING_ABIS.

例如:在x86模擬器上就必須有x86版本的so檔案夾。不然無法安裝成功。


運行時的相容性檢查:

1、檢查目標目錄下是否存在的so庫檔案

2、檢查存在的so檔案是否符合當前cpu架構。

   對於情況一,一般規避的做法是:保證jnilibs目錄下x86、x84_64、armeabi、armeabi-v7a、arm64-v8a等目錄下的檔案名稱數量是一致的。

   例如:項目中使用了A、B、C三個第三方庫。其中A、B提供了armebi以及arm64-v8a版本的庫檔案,而C只提供了armebi、armebi-v7a版本的庫檔案。這時候只能夠刪除原有的arm64-v8a目錄,保留armeabi目錄,一般arm64的手機都能相容使用armeabi版本的庫。或者複製一份armeabi的so檔案到缺少的目錄中(推薦)。


產生so檔案:

   NDK交叉編譯時間選定APP_ABI := armeabi x86 ...可以產生支援相應晶片的so檔案。APP_ABI := all產生支援所有晶片指令集(目前七種)so檔案。


Android載入so檔案規則:

   當你只提供了armeabi目錄時,armeabi-v7a、arm64-v8a架構的程式都會去armeabi裡尋找,而當你同時也提供了armeabi-v7a、armeabi-v8a目錄,而裡面又不存在對應的so庫時,系統就不會再去armeabi裡面尋找了,直接找不到報錯。其他平台也是如此。這裡我踩了不少的坑,切記。

   一般來說,一些比較有名的第三方庫都會提供armeabi、armeabi-v7a、x86這三種類型的so檔案,同時擁有這三種版本的app可以在所有機型上運行。另外,越來越多的SDK會同時提供arm64-v8a版本。只包含armeabi的項目也可以在所有裝置上運行。


現實案例:

   我的項目中使用了armeabi、arm64-v8a兩種類型,而當我需要使用某語音第三方庫的時候,發現只提供了armeabi、armeabi-v7a兩種類型的so檔案,而My Phone是arm64-v8a的。所以只會使用arm64-v8a裡面的so檔案,當使用到該語音庫時找不到對應的so庫,就會報錯。理論上有以下兩種解決方案:

一、刪除所有arm64-v8a,只保留armeabi,全部使用相容性最高的版本,但也運行速度最慢。

二、將該語音庫的armeabi版本的so複製到arm64-v8a中。單一so檔案使用armeabi相容版本。


總結:

  1. 當你使用到so檔案時,保證每個子檔案夾中檔案名稱數量都是一致的。

  2. 對於只提供armeabi的第三方庫,複製一份armeabi的so檔案到缺失的其他目錄中;或者只保留armeabi目錄(不推薦)


參考文檔:

   與 .so 有關的一個長年大坑

   Android 關於arm64-v8a、armeabi-v7a、armeabi、x86下的so檔案相容問題

   關於Android的.so檔案你所需要知道的


本文出自 “一劍圍城” 部落格,請務必保留此出處http://weijiancheng.blog.51cto.com/10190955/1893473

android多cpu架構適配開篇

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.