W moim obecnym projekcie korzystam z wielu plików .so. Znajdują się one w folderze armeabi i armeabi-v7a. Niestety jeden z plików .so ma 6 MB i muszę zmniejszyć rozmiar pliku. Zamiast mieć gruby plik APK, chciałbym użyć tylko plików armeabi i usunąć folder armeabi-v7a.
Zgodnie z dokumentacją NDK, kod armeabi-v7a jest rozszerzonym kodem armeabi, który może zawierać dodatkowe instrukcje procesora. To wszystko wykracza poza moje doświadczenie, ale zastanawiam się, dlaczego chciałoby się mieć zarówno kod armeabi-v7a, jak i armeabi. Musi być dobry powód, aby mieć jedno i drugie, prawda?
Na moich urządzeniach testowych wszystko wydaje się działać dobrze. Te mają procesory ARM v7. Czy można bezpiecznie założyć, że teraz wszystko działa?
android
android-ndk
arm
armv7
PaulT
źródło
źródło
armeabi is deprecated in NDK r16. Removed in NDK r17. No hard float.
Odpowiedzi:
Zależy od tego, co robi twój kod natywny, ale v7a obsługuje sprzętowe operacje zmiennoprzecinkowe, co robi ogromną różnicę. armeabi będzie działał dobrze na wszystkich urządzeniach, ale będzie znacznie wolniejszy i nie będzie wykorzystywać możliwości procesora nowszych urządzeń. Wykonaj testy porównawcze dla swojej aplikacji, ale usuwanie plików binarnych armeabi-v7a na ogół nie jest dobrym pomysłem. Jeśli chcesz zmniejszyć rozmiar, możesz mieć dwa oddzielne apki dla starszych (armeabi) i nowszych (armeabi-v7a) urządzeń.
źródło
EABI = wbudowany interfejs binarny aplikacji. To są takie specyfikacje, z którymi musi być zgodny plik wykonywalny, aby mógł zostać wykonany w określonym środowisku wykonawczym. Określa również różne aspekty kompilacji i łączenia wymagane do współdziałania między łańcuchami narzędzi używanymi w architekturze ARM. W tym kontekście, gdy mówimy o armeabi , mówimy o architekturze ARM i systemie operacyjnym GNU / Linux. Android jest zgodny z little-endian ARM GNU / Linux ABI.
Aplikacja armeabi będzie działać na ARMv5 (np. ARM9) i ARMv6 (np. ARM11). Możesz użyć sprzętu zmiennoprzecinkowego, jeśli budujesz swoją aplikację przy użyciu odpowiednich opcji GCC, takich jak -mfpu = vfpv3 -mfloat-abi = softfp, który mówi kompilatorowi, aby generował instrukcje zmiennoprzecinkowe dla sprzętu VFP i włącza konwencje wywoływania soft-float. armeabi nie obsługuje sztywnych konwencji wywoływania typu float (oznacza to, że rejestry FP nie są używane do przechowywania argumentów funkcji), ale operacje FP w HW są nadal obsługiwane.
Aplikacja armeabi-v7a będzie działać na urządzeniach Cortex A #, takich jak Cortex A8, A9 i A15. Obsługuje procesory wielordzeniowe i obsługuje -mfloat-abi = hard . Tak więc, jeśli zbudujesz swoją aplikację przy użyciu -mfloat-abi = hard , wiele wywołań funkcji będzie szybszych.
źródło
The armeabi-v7a ABI uses the -mfloat-abi=softfp switch
. Więc co masz na myśli mówiąc support -mfloat-abi = hard ?Wręcz przeciwnie, jest znacznie lepsza strategia. Jeśli musisz mieć
minSdkVersion
14 i przesłać swój apk do sklepu Play, zauważysz, że będziesz obsługiwać tę samą liczbę urządzeń, niezależnie od tego, czy obsługujesz,armeabi
czy nie. Dlatego nie ma urządzeń z Androidem 4 lub nowszym, które w ogóle by skorzystałyarmeabi
.Prawdopodobnie dlatego Android NDK nie obsługuje
armeabi
już nawet wersji r17b. [ źródło ]źródło