1. 程式人生 > >android libs資料夾下armeabi armeabi-v7a x86 arm64-v8a

android libs資料夾下armeabi armeabi-v7a x86 arm64-v8a

     在我們androidAPK的根目錄有一個 libs資料夾,此資料夾下包含了armeabi和armeabi-v7a兩個資料夾,我們的c程式碼編譯成的本地庫(各種.so)就會放在這兩個資料夾其中的一個。那armeabi-v7a與 armeabi有什麼區別,都是什麼意思呢?

   armeabi和armeabi-v7a是表示cpu的型別,我們知道一般的手機或平板都是用arm的cpu(mips的就悲催的被忽視了),不同的cpu的特性不一樣,armeabi就是針對普通的或舊的armv5 cpu,armeabi-v7a是針對有浮點運算或高階擴充套件功能的arm v7 cpu。

     在android.mk裡可配置以下巨集:

TARGET_CPU_API := armeabi

APP_ABI := armeabi

當你編譯時出現一些連結動態庫的undefine錯誤,或你的apk執行時出現裝載.so動態庫錯誤時,不妨看一下這個cpu型別的配置是否有誤。

========================================================================================================

現在還有x86的了,其實armeabi、armeabi-v7a 和x86是編譯 NDK 庫時,可以使用三種支援的應用二進位制介面(ABI):

  1. ‘armeabi’ – 預設選項,將建立以基於 ARM* v5TE 的裝置為目標的庫。具有這種目標的浮點運算使用軟體浮點運算。 使用此 ABI 建立的二進位制程式碼將可以在所有 ARM* 裝置上執行。
  2. ‘armeabi-v7a’ – 建立支援基於 ARM* v7 的裝置的庫,並將使用硬體 FPU 指令。
  3. ‘x86’ – 生成的二進位制程式碼可支援包含基於硬體的浮點運算的 IA-32 指令集。

==========================================================================================================

什麼是NEON?

NEON* 是一種 ARM*技術,主要用於多媒體(智慧手機和高清電視等)應用。 ARM* 表示其基於 128 位 SIMD 引擎的技術 – ARM*Cortex*(一種序列擴充套件)—可提供比 ARM* v5 架構至少高 3 倍的效能,以及比 ARM* v6 至少高 2 倍的效能。如欲瞭解有關此技術的詳細資訊,以深入瞭解 NEON及其它效能考慮,請訪問以下網址: 

http://www.arm.com/products/processors/technologies/neon.php

此處的關鍵理念為,各暫存器被“堆積”成一個向量,其中每一個暫存器均為一個元素,並與其它元素的資料型別相匹配。在此基礎之上,運算在管道內執行,因而這一方法被稱作 Packed SIMD。

SSE: 英特爾推出的類似 NEON的工具

SSE 指面向英特爾架構(IA)的SIMD 流指令擴充套件。目前,英特爾® 凌動™ 最高支援 SSSE3(補充 SIMD 流指令擴充套件 3)。 凌動™ 暫不支援 SSE4.x。後者也是一個 128位引擎,用於打包浮點資料。 這一執行模式開始於 MMX 技術。SSx 是較新的技術,取代了 MMX。。如欲瞭解詳細資訊,請參閱英特爾《IA-32 和 IA-64 軟體開發人員手冊》中的“第一卷:基礎架構”部分。網址為: http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html。目前,SSE 概述部分在 5.5 節。 它提供 SSE、SSE2、SSE3 和 SSSE3的操作碼。注意,資料運算通常會涉及到處理基於精度的打包浮點數值;並且需要在 XMM 暫存器之間,或在這些暫存器與記憶體之間批量傳輸資料。XMM 暫存器主要用於取代 MMX 暫存器。


在ANE中如果SDK呼叫了so庫,則需要把so庫放到ANE下Android-ARM/lib/armeabi (除錯模式)或者 armeabi-v7a(發行模式)下。

可以貼個ADT程式碼說明問題:

//m_configType.equals("apk") 是否是發行模式
//(hasCaptiveRuntime() 是否帶執行時
 if ((m_configType.equals("apk")) || (hasCaptiveRuntime()))
    {
      destApkDirectory = "lib/armeabi-v7a/";
    }
    else
    {
      destApkDirectory = "lib/armeabi/";
    }

而這個armeabi和armeabi-v7a究竟是什麼意思?

有什麼深意麼?

為什麼除錯模式和發行模式adobe會選擇不同的資料夾?

我在這篇記錄下我對於這個小問題的理解。

  • armeabi與armeabi-v7a表示支援不同的CPU型別

armeabi是指的該so庫用於ARM的通用CPU,而v7a的CPU支援硬體浮點運算。因此armeabi通用性強,但速度慢,而v7a能充分發揮v7a CPU的能力,在AIR打包APK除錯模式adobe選擇的是通用性強的armeabi模式。

  • android支援不同CPU的深層含義

首先從硬體支援方便來看,我們的adnroid裝置目前為止大部分都是支援ARM晶片,(當然市面上此刻最新的android機器還支援intel等另外的幾個晶片,例如intel最新的凌動專案晶片,就獲得了android4.1的青睞)。從android版本與支援ARM硬體編碼的程度來看:

起初android1.6:只支援armv4與armv5te指令集。

到了android2.0:增加了支援arm-vfp,armv6,armv6t2指令集。

到了android2.2:增加支援armv7-a指令集。

所以armeabi-v7a 應該是與AIR限定支援android2.2以上的條件有關。android2.2以上能讓硬體發揮更大的作用。

  • 我專案中使用armeabi還是armeabi-v7a

對於AIR專案來說效能問題是最大的瓶頸,能優化一點就一點,所以如果接平臺方SDK或者寫ANE的時候使用到SO庫,個人推薦全部放到armeabi-v7a下,而不要為了相容放到armeabi。

-EOF-

在我們android APK的根目錄有一個 libs資料夾,此資料夾下包含了armeabi 和armeabi-v7a兩個資料夾,我們的c程式碼編譯成的本地庫(各種.so)就會放在這兩個資料夾其中的一個。那armeabi-v7a 與 armeabi有什麼區別,都是什麼意思呢?

    armeabi和armeabi-v7a是表示cpu的型別,我們知道一般的手機或平板都是用arm的cpu(mips的就悲催的被忽視了),不同的cpu的特性不一樣,armeabi就是針對普通的或舊的arm v5 cpu,armeabi-v7a是針對有浮點運算或高階擴充套件功能的arm v7 cpu。

      在android.mk裡可配置以下巨集:

TARGET_CPU_API := armeabi

APP_ABI := armeabi

當你編譯時出現一些連結動態庫的undefine錯誤,或你的apk執行時出現裝載.so動態庫錯誤時,不妨看一下這個cpu型別的配置是否有誤。

========================================================================================================

現在還有x86的了,其實armeabi 、armeabi-v7a 和x86是編譯 NDK 庫時,可以使用三種支援的應用二進位制介面(ABI):

  1. ‘armeabi’ – 預設選項,將建立以基於 ARM* v5TE 的裝置為目標的庫。 具有這種目標的浮點運算使用軟體浮點運算。 使用此 ABI 建立的二進位制程式碼將可以在所有 ARM* 裝置上執行。
  2. ‘armeabi-v7a’ – 建立支援基於 ARM* v7 的裝置的庫,並將使用硬體 FPU 指令。
  3. ‘x86’ – 生成的二進位制程式碼可支援包含基於硬體的浮點運算的 IA-32 指令集。

==========================================================================================================

什麼是 NEON?

NEON* 是一種 ARM* 技術,主要用於多媒體(智慧手機和高清電視等)應用。 ARM* 表示其基於 128 位 SIMD 引擎的技術 – ARM* Cortex*(一種序列擴充套件)—可提供比 ARM* v5 架構至少高 3 倍的效能,以及比 ARM* v6 至少高 2 倍的效能。 如欲瞭解有關此技術的詳細資訊,以深入瞭解 NEON 及其它效能考慮,請訪問以下網址: http://www.arm.com/products/processors/technologies/neon.php

此處的關鍵理念為,各暫存器被“堆積”成一個向量,其中每一個暫存器均為一個元素,並與其它元素的資料型別相匹配。 在此基礎之上,運算在管道內執行,因而這一方法被稱作 Packed SIMD。

SSE: 英特爾推出的類似 NEON 的工具

SSE 指面向英特爾架構(IA)的SIMD 流指令擴充套件。 目前,英特爾® 凌動™ 最高支援 SSSE3(補充 SIMD 流指令擴充套件 3)。 凌動™ 暫不支援 SSE4.x。後者也是一個 128 位引擎,用於打包浮點資料。 這一執行模式開始於 MMX 技術。SSx 是較新的技術,取代了 MMX。。 如欲瞭解詳細資訊,請參閱英特爾《IA-32 和 IA-64 軟體開發人員手冊》中的“第一卷: 基礎架構”部分。網址為: http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html。 目前,SSE 概述部分在 5.5 節。 它提供 SSE、SSE2、SSE3 和 SSSE3 的操作碼。注意,資料運算通常會涉及到處理基於精度的打包浮點數值;並且需要在 XMM 暫存器之間,或在這些暫存器與記憶體之間批量傳輸資料。 XMM 暫存器主要用於取代 MMX 暫存器。