Ich verwende derzeit die OpenCV (OpenCV4Android) -Bibliothek, die das NDK nicht verwendet (es gibt keinen C- oder C ++ - Code). Es gibt jedoch .so-Dateien für armeabi, armeabi-v7a, mips und x86. Wenn ich all diese in das Projekt einbeziehe, beträgt die App-Größe 30 MB, wenn ich nur 1 einschließe, beträgt die App-Größe nur 9 MB. Wenn ich versuche, die App auf einem Gerät auszuführen, auf dem die .so-Datei dieses Geräts nicht enthalten ist, stürzt es ab, wenn ich jedoch die .so-Datei verwende, funktioniert sie.
Daher möchte ich mehrere APKs auf verschiedenen Gerätearchitekturen veröffentlichen, um die Dateigrößen zu reduzieren. Von dem, was ich gesehen habe, kann dies nur in der Application.mk-Datei getan werden, aber meine Bibliothek hat keine. Gibt es eine andere Möglichkeit, verschiedene Android-Architekturen zu verwenden?
Ich verwende derzeit die OpenCV (OpenCV4Android) -Bibliothek, die das NDK nicht verwendet (es gibt keinen C- oder C ++ - Code). Es gibt jedoch .so-Dateien für armeabi, armeabi-v7a, mips und x86.
Wie gesagt, wenn es .so
Dateien gibt, benutzt es das NDK.
Wenn ich versuche, die App auf einem Gerät auszuführen, auf dem die .so-Datei dieses Geräts nicht enthalten ist, stürzt es ab. Wenn ich dagegen die .so-Datei habe, funktioniert sie.
Das hängt vom Gerät ab. Viele x86-Geräte haben libhoudini
, mit denen ARM NDK-Binärdateien ausgeführt werden können, allerdings langsamer als mit nativen x86-Binärdateien. In ähnlicher Weise kann ein armeabi-v7
-Gerät armeabi
NDK-Binärdateien ausführen, wenn auch möglicherweise langsamer, insbesondere wenn Gleitkommaverarbeitung verwendet wird.
Daher möchte ich mehrere APKs auf verschiedenen Gerätearchitekturen veröffentlichen, um die Dateigrößen zu reduzieren. Von dem, was ich gesehen habe, kann dies nur in der Application.mk-Datei getan werden, aber meine Bibliothek hat keine.
Die Application.mk
-Datei steuert nur, was kompiliert wird, nicht was verteilt wird.
Gibt es eine andere Möglichkeit, verschiedene Android-Architekturen zu verwenden?
Verwenden Sie Gradle für Android, möglicherweise in Verbindung mit Android Studio, und die abi
Teilung :
Die abi
Schließung in der splits
Schließung:
entscheidet sich für unterschiedliche APK-Dateien pro CPU-Architektur
erstellt eine Whitelist der gewünschten Architekturen
fordert außerdem ein "universelles APK" an, das alle Architekturen für die Verwendung mit Vertriebskanälen enthält, die keine separaten APKs nach Architektur unterstützen
Das Ergebnis Ihres Builds sind separate APKs nach CPU-Architektur und die universelle.
Jede apk für die Anwendung sollte einen eindeutigen Versionscode haben, der von android:versionCode
angegeben wird. Einige x86-Geräte können ARMv7-Binärdateien ausführen. Um zu vermeiden, dass ARMv7 apk in x86-Geräten (und ähnlichen Szenarien für andere Architekturen) heruntergeladen / verwendet wird, sollten Sie die Versionscodes bestellen . Ordnen Sie z. B. die Versionscodes so an, dass das x86-APK einen höheren Versionscode als ARMv7 hat. Mehr zur Versionierung in diesem link .
Ein build.gradle
sample zum Erstellen eindeutiger versionscodierter APKs für jede Architektur Ihrer Wahl wird von ph0b unter github geteilt . Kopieren Sie das gleiche unten.
Vorschlag: Android mehrere apk-Unterstützung Dokumentation empfiehlt zu Verwenden Sie nicht mehrere APKs , wenn die APK-Größe weniger als 50 MB beträgt.
Sie sollten im Allgemeinen mehrere APKs verwenden, um verschiedene Geräte zu unterstützen Konfigurationen nur dann, wenn Ihr APK zu groß (größer als 50 MB) ist zu den alternativen Ressourcen, die für unterschiedliche Geräte benötigt werden Konfigurationen. Verwenden eines einzelnen APK zur Unterstützung verschiedener Konfigurationen ist immer die beste Praxis, weil es den Weg für die Anwendung macht Updates einfach und klar für die Benutzer (und macht auch Ihr Leben einfacher durch Vermeidung von Entwicklungs - und Publishing - Komplexität).
Ich empfehle nicht, dieses Muster zu verwenden, um Ihre Build-Nummer zu erstellen. ARCH - BUILD, denn wenn du eines Tages zu einer APK zurückkehren willst, musst du deinen versionCode sehr erhöhen. Stattdessen können Sie diesem Muster folgen: BUILD - ARCH
%Vor%Beispiel für Build 74 Die Build-Nummer wird sein: 7402 - armeabi-v7a 7408 - x86
Tags und Links java android apk android-ndk