web-dev-qa-db-ja.com

armeabiコードではなくarmeabi-v7aコードを使用する理由

現在のプロジェクトでは、複数の.soファイルを使用しています。これらはarmeabiおよびarmeabi-v7aフォルダーにあります。残念ながら、.soファイルの1つは6MBであり、ファイルサイズを小さくする必要があります。太いAPKファイルを使用する代わりに、armeabiファイルのみを使用してarmeabi-v7aフォルダーを削除したいと思います。

NDKのドキュメントによると、armeabi-v7aコードは拡張されたarmeabiコードであり、追加のCPU命令を含めることができます。これはすべて私の専門知識を超えていますが、なぜarmeabi-v7aとarmeabiの両方のコードが必要なのか疑問です。両方を持っている正当な理由があるに違いありませんか?

私のテストデバイスでは、これはすべて正常に動作するようです。これらにはARM v7 CPUがあります。すべてが現在機能していると仮定しても安全ですか?

138
PaulT

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

157
Nikolay Elenkov

EABI =組み込みアプリケーションバイナリインターフェイス。特定の実行環境で実行するために実行可能ファイルが準拠する必要があるのは、このような仕様です。また、ARMアーキテクチャに使用されるツールチェーン間の相互運用に必要なコンパイルとリンケージのさまざまな側面を指定します。この文脈でarmeabiについて話すとき、ARMアーキテクチャとGNU/Linux OSについて話します。 AndroidはリトルエンディアンARM GNU/Linux ABIに従います。

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

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

59
psihodelia

太いAPKファイルを使用する代わりに、armeabiファイルのみを使用してarmeabi-v7aフォルダーを削除したいと思います。

その反対は、はるかに優れた戦略です。 14にminSdkVersionがあり、apkをPlayストアにアップロードすると、armeabiをサポートするかどうかにかかわらず、同じ数のデバイスをサポートすることに気付くでしょう。そのため、armeabiの恩恵を受けるAndroid 4以上のデバイスはありません。

これがおそらく、Android NDKがリビジョンr17bに従ってarmeabiをサポートしなくなった理由です。 [ ソース ]

5
Cristan