ONNX Runtime für Android bauen

Befolgen Sie die nachstehenden Anweisungen, um ONNX Runtime für Android zu bauen.

Inhalt

Voraussetzungen

Die SDK- und NDK-Pakete können über Android Studio oder das sdkmanager-Befehlszeilentool installiert werden.

Android Studio ist bequemer, aber eine größere Installation. Die Befehlszeilentools sind kleiner und ihre Verwendung kann skriptgesteuert erfolgen, sind aber etwas komplizierter einzurichten. Sie erfordern auch, dass eine Java-Laufzeitumgebung verfügbar ist.

Im Allgemeinen sollten Sie die neueste stabile NDK-Version verwenden. Wir werden uns hier auf die von Ihnen verwendete Version als <NDK version> beziehen.

Ressourcen

Android Studio

  1. Installieren Sie Android Studio

  2. Installieren Sie bei Bedarf zusätzliche SDK-Plattformen

    • Gehen Sie zu Datei->Einstellungen->Darstellung & Verhalten->Systemeinstellungen->Android SDK, um zu sehen, was derzeit installiert ist.
    • Beachten Sie, dass der SDK-Pfad, den Sie als --android_sdk_path beim Bauen von ORT verwenden müssen, ebenfalls auf dieser Konfigurationsseite angezeigt wird.
    • Höchstwahrscheinlich benötigen Sie keine zusätzlichen SDK-Plattformpakete, da die neueste Plattform frühere API-Level ansprechen kann.
  3. Installieren Sie eine NDK-Version

    • Datei->Einstellungen->Darstellung & Verhalten->Systemeinstellungen->Android SDK
    • Registerkarte "SDK Tools"
      • Wählen Sie unten das Kontrollkästchen "Paketdetails anzeigen", um spezifische Versionen anzuzeigen. Standardmäßig wird die neueste Version installiert, was in der Regel in Ordnung ist.
    • Der NDK-Pfad ist das Unterverzeichnis ndk/<NDK version> des angezeigten SDK-Pfads.

sdkmanager von Befehlszeilentools

  • Installieren Sie bei Bedarf die Java Runtime Environment und setzen Sie die Umgebungsvariable JAVA_HOME darauf.
    • https://www.java.com/en/download/
    • Hinweis für Windows: Sie MÜSSEN die 64-Bit-Version installieren (https://www.java.com/en/download/manual.jsp), da sdkmanager sonst nur x86-Pakete auflistet und die neueste NDK nur x64 ist.
  • Damit sdkmanager funktioniert, benötigt es eine bestimmte Verzeichnisstruktur. Erstellen Sie zunächst das übergeordnete Verzeichnis für die Android-Infrastruktur.
    • In unserem Beispiel nennen wir dieses .../Android/
  • Laden Sie die Befehlszeilentools aus dem Abschnitt "Nur Befehlszeilentools" weiter unten auf https://developer.android.com/studio herunter.
  • Erstellen Sie ein Verzeichnis namens "cmdline-tools" unter Ihrem übergeordneten Verzeichnis.
    • was zu .../Android/cmdline-tools führt.
  • Extrahieren Sie das Verzeichnis "tools" aus der ZIP-Datei der Befehlszeilentools in dieses Verzeichnis.
    • was zu .../Android/cmdline-tools/tools führt.
    • Hinweis für Windows: Extrahieren Sie vorzugsweise mit 7-Zip. Wenn Sie das integrierte ZIP-Extraktionstool von Windows verwenden, müssen Sie die Verzeichnisstruktur korrigieren, indem Sie die JAR-Dateien von tools\lib\_ nach tools\lib verschieben.
      • Siehe https://stackoverflow.com/questions/27364963/could-not-find-or-load-main-class-com-android-sdkmanager-main
  • Sie sollten nun in der Lage sein, Android/cmdline-tools/bin/sdkmanager[.bat] erfolgreich auszuführen.
    • Wenn Sie eine Fehlermeldung erhalten, dass Einstellungen nicht gespeichert werden konnten, und den Hilfetext von sdkmanager sehen, ist Ihre Verzeichnisstruktur falsch.
    • Siehe die letzten Schritte in dieser Antwort, um dies zu überprüfen: https://stackoverflow.com/a/61176718
  • Führen Sie .../Android/cmdline-tools/bin/sdkmanager --list aus, um die verfügbaren Pakete anzuzeigen.

  • Installieren Sie die SDK-Plattform
    • Im Allgemeinen ist die Installation der neuesten Version in Ordnung. Sie wählen ein API-Level beim Kompilieren des Codes und die neueste Plattform unterstützt viele aktuelle API-Level, z. B.

      sdkmanager --install "platforms;android-29"
      
    • Dies wird in das "platforms"-Verzeichnis unseres übergeordneten Verzeichnisses, das Android-Verzeichnis in unserem Beispiel, installiert.
    • Der SDK-Pfad, der als --android_sdk_path beim Bauen verwendet wird, ist dieses übergeordnete Verzeichnis.
  • Installieren Sie das NDK
    • Finden Sie die verfügbaren NDK-Versionen, indem Sie sdkmanager --list ausführen.
    • Installieren
      • Installieren Sie die gewünschte Version, z. B. sdkmanager --install "ndk;<NDK version>".
      • Der NDK-Pfad in unserem Beispiel mit dieser Installation wäre .../Android/ndk/<NDK version>.

Android Build Anleitungen

Cross-Kompilierung unter Windows

Der Ninja-Generator muss unter Windows verwendet werden, da der Visual Studio-Generator Android nicht unterstützt.

./build.bat --android --android_sdk_path <android sdk path> --android_ndk_path <android ndk path> --android_abi <android abi, e.g., arm64-v8a (default) or armeabi-v7a> --android_api <android api level, e.g., 27 (default)> --cmake_generator Ninja

z.B. unter Verwendung der Pfade aus unserem Beispiel

./build.bat --android --android_sdk_path .../Android --android_ndk_path .../Android/ndk/<NDK version> --android_abi arm64-v8a --android_api 27 --cmake_generator Ninja

Cross-Kompilierung unter Linux und macOS

./build.sh --android --android_sdk_path <android sdk path> --android_ndk_path <android ndk path> --android_abi <android abi, e.g., arm64-v8a (default) or armeabi-v7a> --android_api <android api level, e.g., 27 (default)>

Android Archive (AAR) bauen

Android Archive (AAR)-Dateien, die direkt in Android Studio importiert werden können, werden in Ihrem_build_dir/java/build/android/outputs/aar generiert, indem Sie die oben genannten Build-Befehle mit --build_java verwenden.

Um unter Windows mit aktiviertem --build_java zu bauen, müssen Sie außerdem

  • JAVA_HOME auf den Pfad zu Ihrer JDK-Installation setzen
    • Dies kann das JDK von Android Studio sein oder eine eigenständige JDK-Installation.
    • z.B. Powershell: $env:JAVA_HOME="C:\Program Files\Java\jdk-15" CMD: set JAVA_HOME=C:\Program Files\Java\jdk-15
  • den Build in einem Admin-Fenster ausführen
    • Der Java-Build benötigt Berechtigungen zum Erstellen eines Symlinks, was ein Admin-Fenster erfordert.

Hinweis: Proguard-Regeln für R8-Minimierung Android-App-Builds zur Funktionsfähigkeit

Für Android-Nutzer, die die Bibliothek mit R8-minimierten Builds verwenden, müssen Sie derzeit die folgende Zeile zu Ihrer proguard-rules.pro-Datei in Ihrem Android-Projekt hinzufügen, um das Paket com.microsoft.onnxruntime:onnxruntime-android zu verwenden und Laufzeitabstürze zu vermeiden.

-keep class ai.onnxruntime.** { *; }

*Referenz auf ähnliche Probleme

Es gibt ähnliche offene Probleme dazu im protobuf Github-Projekt und R8.

Android NNAPI Execution Provider

Wenn Sie den NNAPI Execution Provider unter Android verwenden möchten, siehe NNAPI Execution Provider.

Bauanleitungen

Der Android NNAPI Execution Provider kann mit den Build-Befehlen in den Android Build Anleitungen mit --use_nnapi gebaut werden.

QNN Execution Provider

Wenn Ihr Gerät über einen unterstützten Qualcomm Snapdragon SOC verfügt und Sie den QNN Execution Provider unter Android verwenden möchten, siehe QNN Execution Provider.

Bauanleitungen

Laden Sie das Qualcomm AI Engine Direct SDK herunter und installieren Sie es. Der QNN Execution Provider kann mit den Build-Befehlen in den Android Build Anleitungen mit --use_qnn static_lib --qnn_home [QNN_SDK path] gebaut werden.

Android-Änderungen mit Emulator testen (nicht anwendbar für QNN Execution Provider)

Siehe Testen von Android-Änderungen mit dem Emulator.

Ein benutzerdefiniertes Android-Paket bauen

Siehe die Dokumentation für benutzerdefinierte Builds. Insbesondere siehe den Abschnitt über das Android-Paket.