Warum Armeabi-v7a-Code anstelle von Armeabi-Code verwenden?

141

In meinem aktuellen Projekt verwende ich mehrere .so-Dateien. Diese befinden sich im Ordner armeabi und armeabi-v7a. Leider ist eine der .so-Dateien 6 MB groß und ich muss die Dateigröße reduzieren. Anstatt eine fette APK-Datei zu haben, möchte ich nur die armeabi-Dateien verwenden und den armeabi-v7a-Ordner entfernen.

Gemäß der NDK-Dokumentation ist der armeabi-v7a-Code ein erweiterter armeabi-Code, der zusätzliche CPU-Anweisungen enthalten kann. Dies alles geht über mein Fachwissen hinaus, aber ich frage mich, warum man sowohl armeabi-v7a als auch armeabi-Code haben möchte. Es muss einen guten Grund geben, beides zu haben, oder?

Auf meinen Testgeräten scheint dies alles gut zu funktionieren. Diese haben ARM v7-CPUs. Ist es sicher anzunehmen, dass jetzt alles funktioniert?

PaulT
quelle
2
Vielleicht möchten Sie diesen Blogpost jetzt lesen. Es ist gründlich und aktuell: androidbycode.wordpress.com/tag/armeabi-v7a
IgorGanapolsky
2
Und jetzt sagt der Arzt:armeabi is deprecated in NDK r16. Removed in NDK r17. No hard float.
Amir Rezazadeh
1
Für diejenigen, die später kommen, werfen Sie einen Blick hier .
Amir Rezazadeh

Antworten:

163

Hängt davon ab, was Ihr nativer Code tut, aber v7a unterstützt Hardware-Gleitkommaoperationen, was einen großen Unterschied macht. armeabi funktioniert auf allen Geräten einwandfrei, ist jedoch viel langsamer und nutzt die CPU-Funktionen neuerer Geräte nicht aus. Nehmen Sie einige Benchmarks für Ihre spezielle Anwendung, aber das Entfernen der armeabi-v7a-Binärdateien ist im Allgemeinen keine gute Idee. Wenn Sie die Größe reduzieren müssen, möchten Sie möglicherweise zwei separate Apks für ältere (armeabi) und neuere (armeabi-v7a) Geräte.

Nikolay Elenkov
quelle
1
Wo finde ich einen Unterschied zwischen den beiden ABI? Ich bin sehr gespannt darauf, echte Unterschiede zu verstehen ...
Webshaker
1
Haben Sie eine Idee für eine elegante Lösung für Google Play, mit der Sie diese beiden verschiedenen APKs hochladen können? Es gibt keine Möglichkeit, im Manifest zu unterscheiden, dass sie unterschiedlich sind, daher möchte Google Play nur eine durch die andere ersetzen (sie haben unterschiedliche Versionscodes)
Dean Wild
11
@ DeanWild Google hat jetzt Unterstützung für das Targeting verschiedener CPU-Architekturen in der Play Store-Funktion mit mehreren APKs hinzugefügt: developer.android.com/guide/google/play/publishing/…
Charles Harley
1
@IgorGanapolsky, danke für den Hinweis. Dies ist jetzt der richtige Link: developer.android.com/google/play/publishing/…
Charles Harley
60

EABI = Embedded Application Binary Interface. Es sind solche Spezifikationen, denen eine ausführbare Datei entsprechen muss, um in einer bestimmten Ausführungsumgebung ausgeführt zu werden. Außerdem werden verschiedene Aspekte der Kompilierung und Verknüpfung angegeben, die für die Interaktion zwischen Toolchains erforderlich sind, die für die ARM-Architektur verwendet werden. Wenn wir in diesem Zusammenhang über armeabi sprechen, sprechen wir über ARM-Architektur und GNU / Linux OS. Android folgt dem Little-Endian ARM GNU / Linux ABI.

Die armeabi-Anwendung wird auf ARMv5 (z. B. ARM9) und ARMv6 (z. B. ARM11) ausgeführt. Sie können Gleitkomma-Hardware verwenden, wenn Sie Ihre Anwendung mit geeigneten GCC-Optionen wie -mfpu = vfpv3 -mfloat-abi = softfp erstellen, die den Compiler anweisen, Gleitkomma-Anweisungen für VFP-Hardware zu generieren, und die Soft-Float-Aufrufkonventionen aktivieren. armeabi unterstützt keine Hard-Float-Aufrufkonventionen (dies bedeutet, dass FP-Register nicht verwendet werden, um Argumente für eine Funktion zu enthalten), aber FP-Operationen in HW werden weiterhin unterstützt.

Die Anwendung armeabi-v7a kann auf Cortex A # -Geräten wie Cortex A8, A9 und A15 ausgeführt werden. Es unterstützt Multi-Core-Prozessoren und -mfloat-abi = hard . Wenn Sie also Ihre Anwendung mit -mfloat-abi = hard erstellen , sind viele Ihrer Funktionsaufrufe schneller.

Psihodelia
quelle
1
Laut developer.android.com/ndk/guides/abis.html : The armeabi-v7a ABI uses the -mfloat-abi=softfp switch. Was meinst du mit unterstützt -mfloat-abi = hard ?
Igor Ganapolsky
8

Anstatt eine fette APK-Datei zu haben, möchte ich nur die armeabi-Dateien verwenden und den armeabi-v7a-Ordner entfernen.

Das Gegenteil ist eine viel bessere Strategie. Wenn Sie minSdkVersion14 Jahre alt sind und Ihre Apk in den Play Store hochladen müssen, werden Sie feststellen, dass Sie die gleiche Anzahl von Geräten unterstützen, unabhängig davon, ob Sie diese unterstützen armeabioder nicht. Daher gibt es keine Geräte mit Android 4 oder höher, die überhaupt davon profitieren würden armeabi.

Dies ist wahrscheinlich der Grund, warum das Android NDK armeabigemäß Revision r17b nicht einmal mehr unterstützt. [ Quelle ]

Cristan
quelle