2011-08-16 65 views
120

在我目前的項目中,我使用了多個.so文件。這些位於armeabi和armeabi-v7a文件夾。不幸的是.so文件中有一個是6MB,我需要減小文件大小。我只想使用armeabi文件並刪除armeabi-v7a文件夾,而不是使用胖APK文件。爲什麼在armeabi代碼上使用armeabi-v7a代碼?

根據NDK文檔,armeabi-v7a代碼是可以包含額外CPU指令的擴展armeabi代碼。這一切都超出了我的專長,但我質疑爲什麼人們想要armeabi-v7a和armeabi代碼。必須有充分的理由才能擁有這兩個權利?

在我的測試設備上,這似乎都工作正常。這些都有ARM v7 CPU。假設現在一切正常,可以安全嗎?

+1

您可能需要立即閱讀此博客帖子。它是徹底的和最新的:https://androidbycode.wordpress.com/tag/armeabi-v7a/ –

回答

139

取決於您的本機代碼的功能,但v7a支持硬件浮點運算,這會產生巨大的差異。 armeabi在所有設備上都能正常工作,但速度會慢很多,並且不會利用較新設備的CPU功能。爲特定的應用程序做一些基準測試,但除去armeabi-v7a二進制文件通常不是一個好主意。如果您需要縮小尺寸,您可能需要針對較舊的(armeabi)和較新的(armeabi-v7a)設備進行兩次單獨的安裝。

+0

感謝您的明確答覆。在2個APK文件中分割應用程序以及進行基準測試也是一個好主意。後者實際上是一個非常好的主意!非常感謝! – PaulT

+1

我在哪裏可以找到兩個ABI之間的區別?我很難理解真正的差異... – webshaker

+7

ARM手冊? http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0344c/Cacciced.html –

55

EABI =嵌入式應用程序二進制接口。爲了在特定的執行環境中執行,可執行程序必須符合這樣的規範。它還規定了用於ARM架構的工具鏈之間互操作所需的編譯和鏈接的各個方面。在這種情況下,當我們談論armeabi我們談論ARM架構和GNU/Linux操作系統。 Android遵循小端的ARM GNU/Linux ABI。

armeabi應用程序將在ARMv5(例如ARM9)和ARMv6(例如ARM11)上運行。如果您使用適當的GCC選項(如-mfpu = vfpv3 -mfloat-abi = softfp)來構建應用程序,它會告訴編譯器爲VFP硬件生成浮點指令並啓用軟浮動調用約定,則可以使用浮點硬件。 armeabi不支持硬浮動調用約定(這意味着FP寄存器不用於包含函數的參數),但硬件中的FP操作仍然受支持。

armeabi-v7a應用程序將運行在Cortex A#設備上,如Cortex A8,A9和A15。它支持多核處理器,並支持-mfloat-abi = hard。因此,如果使用-mfloat-abi = hard構建應用程序,那麼許多函數調用將會更快。

+0

根據https://developer.android.com/ndk/guides/abis.html : 'armeabi-v7a ABI使用-mfloat-abi = softfp switch'。那麼,你的意思是**支持-mfloat-abi = hard **? –