我們在編寫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型號等具體信息。