Pourquoi utiliser le code armeabi-v7a sur le code armeabi?

141

Dans mon projet actuel, j'utilise plusieurs fichiers .so. Ceux-ci se trouvent dans les dossiers armeabi et armeabi-v7a. Malheureusement, l'un des fichiers .so fait 6 Mo et je dois réduire la taille du fichier. Au lieu d'avoir un gros fichier APK, je voudrais utiliser uniquement les fichiers armeabi et supprimer le dossier armeabi-v7a.

Selon la documentation NDK, le code armeabi-v7a est un code armeabi étendu qui peut contenir des instructions CPU supplémentaires. Tout cela va au-delà de mon expertise, mais je me demande pourquoi on aimerait avoir à la fois le code armeabi-v7a et armeabi. Il doit y avoir une bonne raison d'avoir les deux, non?

Sur mes appareils de test, tout semble fonctionner correctement. Ceux-ci ont des processeurs ARM v7. Est-il prudent de supposer que tout fonctionne maintenant?

PaulT
la source
2
Vous voudrez peut-être lire ce billet de blog maintenant. Il est complet et à jour: androidbycode.wordpress.com/tag/armeabi-v7a
IgorGanapolsky
2
Et maintenant, le doc dit:armeabi is deprecated in NDK r16. Removed in NDK r17. No hard float.
Amir Rezazadeh
1
Pour ceux qui viendront plus tard, jetez un œil ici .
Amir Rezazadeh

Réponses:

163

Cela dépend de ce que fait votre code natif, mais la v7a prend en charge les opérations matérielles en virgule flottante, ce qui fait une énorme différence. armeabi fonctionnera bien sur tous les appareils, mais sera beaucoup plus lent et ne profitera pas des capacités CPU des nouveaux appareils. Prenez quelques points de repère pour votre application particulière, mais supprimer les binaires armeabi-v7a n'est généralement pas une bonne idée. Si vous avez besoin de réduire la taille, vous voudrez peut-être avoir deux apks séparés pour les appareils plus anciens (armeabi) et plus récents (armeabi-v7a).

Nikolay Elenkov
la source
1
Où puis-je trouver la différence entre les deux ABI? Je suis très instersted pour comprendre les vraies différences ...
webshaker
1
une idée sur une solution élégante pour obtenir Google Play pour vous permettre de télécharger ces deux APK différents? Il n'y a aucun moyen de différencier dans le manifeste qu'ils sont différents, donc Google Play veut simplement remplacer l'un par l'autre (ils ont des codes de version différents)
Dean Wild
11
@DeanWild Google a maintenant ajouté la prise en charge du ciblage de différentes architectures de processeur dans la fonctionnalité APK multiple du Play Store: developer.android.com/guide/google/play/publishing/…
Charles Harley
1
@IgorGanapolsky, merci de l'avoir signalé. C'est maintenant le lien correct: developer.android.com/google/play/publishing/…
Charles Harley
60

EABI = Interface binaire d'application intégrée. Ce sont de telles spécifications auxquelles un exécutable doit se conformer pour s'exécuter dans un environnement d'exécution spécifique. Il spécifie également divers aspects de compilation et de liaison requis pour l'interopérabilité entre les chaînes d'outils utilisées pour l'architecture ARM. Dans ce contexte, lorsque nous parlons d' armeabi, nous parlons d'architecture ARM et de système d'exploitation GNU / Linux. Android suit le petit boutiste ARM GNU / Linux ABI.

L'application armeabi fonctionnera sur ARMv5 (par exemple ARM9) et ARMv6 (par exemple ARM11). Vous pouvez utiliser du matériel en virgule flottante si vous construisez votre application en utilisant les options GCC appropriées comme -mfpu = vfpv3 -mfloat-abi = softfp qui indique au compilateur de générer des instructions en virgule flottante pour le matériel VFP et active les conventions d'appel soft-float. armeabi ne prend pas en charge les conventions d'appel flottantes (cela signifie que les registres FP ne sont pas utilisés pour contenir des arguments pour une fonction), mais les opérations FP dans HW sont toujours prises en charge.

L'application armeabi-v7a fonctionnera sur les appareils Cortex A # tels que Cortex A8, A9 et A15. Il prend en charge les processeurs multicœurs et prend en charge -mfloat-abi = hard . Donc, si vous créez votre application en utilisant -mfloat-abi = hard , beaucoup de vos appels de fonction seront plus rapides.

psihodelia
la source
1
Selon developer.android.com/ndk/guides/abis.html : The armeabi-v7a ABI uses the -mfloat-abi=softfp switch. Alors qu'entendez-vous par support -mfloat-abi = hard ?
IgorGanapolsky
8

Au lieu d'avoir un gros fichier APK, je voudrais utiliser uniquement les fichiers armeabi et supprimer le dossier armeabi-v7a.

Le contraire est une bien meilleure stratégie. Si vous devez minSdkVersion14 et télécharger votre apk sur le Play Store, vous remarquerez que vous prendrez en charge le même nombre d'appareils, que vous le preniez en charge armeabiou non. Par conséquent, il n'y a aucun appareil avec Android 4 ou supérieur qui en bénéficierait armeabi.

C'est probablement pourquoi Android NDK ne prend même armeabiplus en charge selon la révision r17b. [ source ]

Cristan
la source