2011-08-16 9 views
120

私の現在のプロジェクトでは、複数の.soファイルを使用しています。これらはarmeabiとarmeabi-v7aフォルダにあります。残念ながら.soファイルの1つは6MBで、ファイルサイズを小さくする必要があります。太ったAPKファイルを作成する代わりに、armeabiファイルだけを使用してarmeabi-v7aフォルダを削除したいと考えています。armeabiコードよりもarmeabi-v7aコードを使用するのはなぜですか?

NDKの文書によると、armeabi-v7aコードは拡張ARMeabiコードであり、余分なCPU命令を含むことができます。これは私の専門知識を超えていますが、なぜarmeabi-v7aとarmeabiコードの両方を使用したいのですか?両方の理由があるのは間違いないでしょう。

私のテストデバイスでは、このすべてがうまくいくようです。これらはARM v7 CPUを搭載しています。すべてが今働いていると想定するのは安全でしょうか?

+1

このブログポストには、今すぐ読むことができます。それは徹底的で最新のものです:https://androidbycode.wordpress.com/tag/armeabi-v7a/ –

答えて

139

ネイティブコードに依存しますが、v7aはハードウェア浮動小数点演算をサポートしているため、大きな違いがあります。 Armeabiはすべてのデバイスでうまく動作しますが、処理速度は大幅に遅くなり、新しいデバイスのCPU機能を利用することはありません。特定のアプリケーションのベンチマークを取るが、armeabi-v7aバイナリを削除することは一般的には良い考えではない。サイズを小さくする必要がある場合は、古い(armeabi)デバイス用と新しい(armeabi-v7a)デバイス用に2つの別々のapkが必要です。

+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 OSについて説明します。 Androidは、リトルエンディアンのARM GNU/Linux ABIに準拠しています。

armeabiアプリケーションはARMv5(ARM9など)とARMv6(ARM11など)で動作します。 -mfpu = vfpv3 -mfloat-abi = softfpのような適切なGCCオプションを使用してアプリケーションを構築する場合は、VFPハードウェアの浮動小数点命令を生成するようにコンパイラに指示し、ソフト浮動呼び出し規則を有効にする場合は浮動小数点ハードウェアを使用できます。 armeabiはハードフロート呼び出し規約をサポートしていません(FPレジスタは関数の引数を含むために使用されません)が、HWのFP操作は引き続きサポートされています。

armeabi-v7aアプリケーションは、Cortex A8、A9、A15などのCortex A#デバイスで実行されます。マルチコアプロセッサーをサポートし、-mfloat-abi = hardをサポートしています。したがって、-mfloat-abi = hardを使用してアプリケーションをビルドすると、多くの関数呼び出しが高速になります。

+0

https://developer.android.com/ndk/guides/abis.htmlによると: 'armeabi-v7a ABIは、-mfloat-abi = softfpスイッチを使用します。だからあなたは**サポートしていますか?-mfloat-abi =ハード**? –

関連する問題