Application.mk中APP_ABI 的含義

我們在編寫JNI代碼時有一個可選的文件Application.mk ,這個文件你可以不創建,但是有時候是有必要寫一個這樣的文件的。

Application.mk文件用於描述應用程序本身的一些屬性信息,如應用程序依賴哪些庫,應用程序的根目錄,應用程序運行在哪些類型指令集的CPU下,還有一些編譯選項,

在此文件中定義的東西會應用於整個應用程序包括android.mk也會用到這裏面的選項。


如果你不寫此文件,會默認編出所有android.mk中寫的libs / modules APP_ABI會默認指定爲armeabi

下面我們主要介紹APP_ABI的用途。


首先市面上的android智能設備很多也很雜,各種類型各個廠家的芯片,但都是基於某種指令集來開發出來的,這裏的ABI(Application Binary Interface)實際就是指應用程序基於哪種指令集來進行編譯,官方文檔說其實是以下幾點不同:

- the CPU instruction set that the machine code should use

  - the endianness of memory stores and loads at runtime

  - the format of executable binaries (shared libraries, programs, etc...)
    and what type of content is allowed/supported in them.

  - various conventions used to pass data between your code and
    the system (e.g. how registers and/or the stack are used when functions
    are called, alignment constraints, etc...)

  - alignment and size constraints for enum types, structure fields and
    arrays.

  - the list of function symbols available to your machine code at runtime,
    generally from a very specific selected set of libraries.

我們能用到的ABI 也就四種  armeabi armeabi-v7a x86 和mips 前兩者最常用到。

在編譯的時候你可以指定其中的一種或者幾種,如果指定了幾種,這時候打包到APK後這個APK被稱爲“胖二進制”,也就是它包含了幾種ABI類型的lib

當APK被安裝到設備上的時候,android系統有這樣一個機制:

系統支持哪些ABI類型它自己是知道的,它們會將最適合機器性能發揮的ABI類型標記位'primary' 把剩下的也支持的標記爲‘secondary’

例如

CPU 工藝爲 ARMv5TE-based 的CPU只有'primary'  爲armeabi  沒有'secondary'
而類型爲ARMv7-based的CPU 'primary'  爲armeabi-v7a  'secondary'爲armeabi

應用程序安裝的時候系統首先檢查lib/<primary-abi>/libxx.so 如果有的話就將此處的lib隨應用程序copy到/data/app/下面這個大家應該知道第三方應用的安裝目錄

如果沒有的話,而機器有secondary ,就檢查lib/<secondary-abi>/libxx.so 


所以這就是爲什麼我們不用寫application.mk 而應用程序能在amrv7 的機器上面跑得好好的,但是這有可能沒有發揮到amrv7的最有效的性能。

所以如果是我寫應用程序我會指定兩個或更多(當然這可能造成APK體積增大,這個要自己取捨)


另外推薦一個工具查看android系統的硬件信息 z-devicetest  ,可以看到CPU型號等具體信息。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章