Erstellen eines x86- und ARM*-APK mit dem Intel® Compiler und der GNU* GCC

Inhaltsverzeichnis

  1. Einführung
  2. Vorbereiten der Build-Umgebung
  3. Build-Ausführung über Befehlszeile
    1. Konfigurieren der Anwendung
    2. Bereinigen des Arbeitsbereichs der Anwendung
    3. Erstellen der Binary für die ARM*-Architektur
    4. Erstellen der Binary für die x86-Architektur
    5. Vorbereiten des Anwendungspakets (APK)
  4. Build über Eclipse*-IDE
  5. Hinweis zur Vermeidung der Bereinigung von Binaries unter .\libs\[targetabi]
  6. Weitere Artikel und Ressourcen zu diesem Thema

Einführung

Android*-Geräte können mit Prozessoren ausgestattet sein, die die ARM-* oder die x86-Befehlssatzarchitektur (Instruction Set Architecture, ISA) unterstützen. Unterschiedliche ISAs sind nicht binärkompatibel. Aus diesem Grund sollte eine Anwendung, die nativen Code enthält, für jede Ziel-ISA native Bibliotheken bereitstellen. Die „Fat“-Android*-Anwendungspakete („Fat“-APK) sind einer der möglichen Verteilungsmechanismen für solche Anwendungen.

Dieser Artikel enthält eine schrittweise Anleitung zur Erstellung einer „Fat“-APK, die die ISA-unabhängigen Dex-Dateien für die Dalvik* Virtual Machine (Dalvik, 2013) sowie die Bibliotheken für verschiedene Ziel-ISAs enthält. Dazu gehört auch das Erstellen der nativen Anwendungsbibliothek für x86 mit dem Intel® C++-Compiler für Android*.

Zur Veranschaulichung verwenden wir das Beispiel hello-gl2 aus der NDK-r9-Distribution.

Vorbereiten der Build-Umgebung

Die folgenden Tools werden benötigt und sollten entsprechend der Empfehlung installiert werden:

Hinzufügen der erforderlichen Verzeichnisse zur Umgebungsvariablen „PATH“:

  • Verzeichnis „[ndk-dir]“ zur Verwendung des Tools „ndk-build
  • Verzeichnis „[android-sdk-dir]\sdk\tools“ zur Verwendung des Tools „android
  • Verzeichnis „[ant-dir]\bin“ zur Verwendung des Tools „ant
  • Verzeichnis „[jdk6-dir]\jre\bin“ zur Verwendung der „java"-VM. Wird vom Tool „ant“ benötigt.
    Achten Sie darauf, dass Sie in einer Windows*-Umgebung für „program files (x86)“ kurze Ordnernamen verwenden, z. B. „PROGRA~2
  • Erstellen der neuen Umgebungsvariablen „JAVA_HOME=[jdk6-dir]

Build-Ausführung über Befehlszeile

Dieser Abschnitt beschreibt, wie Sie das APK-Paket zur Unterstützung von Android-Geräten mit ARM*- und x86-Architekturen über eine befehlszeilenbasierte Build-Umgebung erstellen.

Öffnen Sie zunächst ein Befehlsfenster oder ein Terminalfenster unter Linux*. Navigieren Sie dann zum Android-NDK-Beispielverzeichnis „hello-gl2“ ([ndk-dir]\samples\hello-gl2) und führen Sie die Schritte unten aus.

Hinweis: Über dieses Fenster sollten Sie Zugang zu allen oben genannten Tools haben.

  1. Konfigurieren der Anwendung

    Führen Sie aus dem Verzeichnis „hello-gl2“ den folgenden Befehl aus, um die Datei build.xml, die später für den Beispiel-Build verwendet wird, zu erstellen.

        $ android update project --target android-18 --name HelloGL2 --path . --subprojects
            --target android-18: entspricht dem Android-Release Jelly Beans MR2.

  2. Bereinigen des Arbeitsbereichs der Anwendung

    Verwenden Sie den folgenden Befehl, um den gesamten Arbeitsbereich, einschließlich der Bibliotheken für alle ISA-Architekturen, zu bereinigen.
        $ ant clean
        $ ndk-build V=1 APP_ABI=all clean
            . V=1 : gibt alle Befehle, während sie ausgeführt werden, aus.
            . APP_ABI=all : erzwingt die Bereinigung der Zwischendateien für alle Ziele. Wenn dieser Parameter nicht angegeben wird, wird nur das Ziel armeabi bereinigt.

  3. Erstellen der Binary für die ARM*-Architektur

    Verwenden Sie den folgenden Befehl, um die Anwendungs-Binary für die ARM-Architektur zu erstellen:
        $ ndk-build APP_ABI=armeabi V=1 NDK_TOOLCHAIN=arm-linux-androideabi-4.8
            . APP_ABI=armeabi : konfiguriert die Kompilierung für das ARM*-Ziel.
            . NDK_TOOLCHAIN=arm-linux-androideabi-4.8 : überschreibt die standardmäßige GNU* GCC 4.6 und verwendet stattdessen GCC 4.8.

    Die Anwendungs-Binary (libgl2jni.so ) wird unter .\libs\armeabi\libgl2jni.so erstellt.

  4. Erstellen der Binary für die x86-Architektur mit dem Intel Compiler

    Verwenden Sie den folgenden Befehl, um die Anwendungs-Binary für die x86-Architektur mit dem Intel Compiler zu erstellen:
        $ ndk-build APP_ABI=x86 V=1 NDK_TOOLCHAIN=x86-icc NDK_APP.local.cleaned_binaries=true
            . APP_ABI=x86 : konfiguriert die Kompilierung für die x86-Architektur.
            . NDK_TOOLCHAIN=x86-icc : überschreibt die standardmäßige GCC 4.6 mit dem Intel C/C++-Compiler für Android.
            . NDK_APP.local.cleaned_binaries=true : unterdrückt das Entfernen der Bibliothek aus dem Verzeichnis libs/armeabi. Siehe Hinweise ganz unten.

    Die Anwendungs-Binary (libgl2jni.so ) wird unter .\libs\x86\libgl2jni.so erstellt.

  5. Vorbereiten des Anwendungspakets (APK)

    Wenn alle Binaries für das Android-Ziel erstellt sind, prüfen Sie, ob das Verzeichnis libs\[targetabi] die erforderliche Bibliothek für jede Zielarchitektur enthält.

    Um die Paketerstellung zu vereinfachen und die Paketsignierung zu umgehen, erstellen Sie mit dem folgenden Befehl ein Debug-Paket:
        $ ant debug

    Das neu erstellte Paket HelloGL2-debug.zip befindet sich im Verzeichnis .\bin. Es kann auf x86*- oder ARM*-Emulatoren ausgeführt werden, die mindestens Level 18 der vom Android SDK bereitgestellten API unterstützen.
    Das Paket HelloGL2-debug.zip enthält Bibliotheken für zwei Ziele: ARM EABI und x86.

Build über Eclipse*-IDE

  1. Öffnen Sie Eclipse und laden Sie das Beispiel [ndk-dir]/samples/hello-gl2.
    • Wählen Sie im Menü File > New > Project > Android Project...
    • Wählen Sie die Schaltfläche Android project from existing code.
    • Wählen Sie einen beliebigen API-Level über Android 1.5.
    • Klicken Sie im Feld Root Directory auf Browse... und wählen Sie das Verzeichnis [ndk-dir]/samples/hello-gl2.
    • Klicken Sie auf Finish.
  2. Fügen Sie nativen Support zum Projekt hinzu:
    Klicken Sie mit der rechten Maustaste auf den Projektnamen und wählen Sie Android Tools > Add Native Support...
  3. Erstellen Sie eine separate Build-Konfiguration für jede Zielplattform und setzen Sie den Build-Befehl.
    Klicken Sie mit der rechten Maustaste auf das Projekt und wählen Sie Project properties -> C/C++ Builder -> "Manage configurations..."
     Klicken Sie auf New, um die folgenden neuen Konfigurationen auf Basis der Konfiguration Default hinzuzufügen:
    • „x86_icc“ für x86-Ziel mit Intel Compiler ICC
    • „amr_gcc“ für ARM-Ziel mit GNU GCC
    Setzen Sie – immer noch im gleichen „Project Properties“-Fenster – den Wert für Configuration auf „x86_icc“:
    • Deaktivieren Sie „Use default build command“.
    • Fügen Sie Folgendes zum Feld Build command hinzu:
      ndk-build APP_ABI=x86 NDK_TOOLCHAIN=x86-icc
    Setzen Sie – immer noch im gleichen „Project Properties“-Fenster – den Wert für Configuration auf „arm_gcc“:
    • Deaktivieren Sie „Use default build command“.
    • Fügen Sie Folgendes zum Feld Build command hinzu:
      ndk-build APP_ABI=armeabi NDK_TOOLCHAIN=arm-linux-androideabi-4.8
    • Klicken Sie auf OK.
  4. Bereinigen Sie den gesamten Arbeitsbereich der Anwendung.
    Klicken Sie hierzu mit der rechten Maustaste auf das Projekt und wählen Sie Build configurations > Clean all…

    Hinweis: Ist Application.mk im Verzeichnis jni vorhanden, stellen Sie sicher, dass die folgende Zeile NICHT vorhanden ist:
    NDK_APP.local.cleaned_binaries=true

  5. Erstellen Sie die App-Binary für das ARM*-Ziel mit der GCC.
    • Erstellen Sie Application.mk im Verzeichnis jni und fügen Sie die folgende Zeile hinzu:
      NDK_APP.local.cleaned_binaries=true
    • Klicken Sie mit der rechten Maustaste auf das Projekt und wählen Sie Build configurations > Set Active > arm_gcc.
    • Klicken Sie mit der rechten Maustaste auf das Projekt und wählen Sie Build Project.
    • Prüfen Sie die erstellte Binärdatei unter [eclipse-workspace-dir]\GL2JNIActivity\libs\armeabi\libgl2jni.so.
  6. Erstellen Sie die App-Binary für x86 mit dem Intel Compiler.
    • Klicken Sie mit der rechten Maustaste auf das Projekt und wählen Sie Build configurations > Set Active > x86_icc.
    • Klicken Sie mit der rechten Maustaste auf das Projekt und wählen Sie Build Project.
    • Prüfen Sie die erstellte Binärdatei unter [eclipse-workspace-dir]\GL2JNIActivity\libs\x86\libgl2jni.so.
  7. Erstellen Sie alle App-Binaries für alle konfigurierten Ziele.
    • Erstellen Sie Application.mk im Verzeichnis jni und fügen Sie die folgende Zeile hinzu:
      NDK_APP.local.cleaned_binaries=true
    • Klicken Sie mit der rechten Maustaste auf das Projekt und wählen Sie Build configurations > Build All...
    • Prüfen Sie die erstellten Binärdateien unter:
      • [eclipse-workspace-dir]\GL2JNIActivity\libs\armeabi\libgl2jni.so
      • [eclipse-workspace-dir]\GL2JNIActivity\libs\x86\libgl2jni.so
  8. Erstellen Sie nicht signierte Anwendungspakete.
    Klicken Sie hierzu mit der rechten Maustaste auf das Projekt und wählen Sie Android Tools > Add Native Support...

Hinweis zur Vermeidung der Bereinigung von Binaries unter .\libs\[targetabi]

Der Parameter NDK_APP.local.cleaned_binaries=true, mit dem sich die Entfernung zuvor erstellter Bibliotheken unterdrücken lässt, funktioniert in zukünftigen NDK-Releases eventuell nicht mehr. Informationen zur Deaktivierung von Löschvorgängen für die neu installierten Ziel-Binaries finden Sie im Makefile [ndk-dir]/build/core/setup-app.mk.

Weitere Artikel und Ressourcen zu diesem Thema 

Weitere Informationen über Intel® Tools für Android-Entwickler siehe Intel® Developer Zone für Android.

Per informazioni complete sulle ottimizzazioni del compilatore, consultare l'Avviso sull'ottimizzazione