Lire en anglais

Partager via


Android

Les triplets x64-android, arm-neon-android et arm64-android sont testés par l’intégration continue du registre organisé de vcpkg.

Conditions requises pour la génération Android

  1. Télécharger le NDK Android

  2. Définissez la variable ANDROID_NDK_HOME d’environnement sur votre installation android NDK pour configurer la chaîne d’outils Android. Par exemple :

    export ANDROID_NDK_HOME=/home/your-account/Android/Sdk/ndk-bundle
    

    Ou :

    export ANDROID_NDK_HOME=/home/your-account/Android/android-ndk-r26d
    

Remarque : vous devez toujours installer g++ ou un compilateur C++ qui cible votre hôte pour toutes les dépendances de l’hôte.

triplets vcpkg et leurs ABI Android correspondants

Il existe six API Android différentes, chacune étant mappée à un triplet vcpkg. Le tableau suivant décrit le mappage des architectures vcpkg aux architectures Android :

VCPKG_TARGET_TRIPLET ANDROID_ABI ANDROID_ARM_NEON
arm64-android arm64-v8a
arm-android armeabi-v7a OFF
arm-neon-android armeabi-v7a ACTIVÉ
x64-android x86_64
x86-android x86
armv6-android armeabi

Création de bibliothèques Android dans un conteneur Docker

Vous pouvez créer des bibliothèques Android, comme jsoncpp dans un conteneur Docker Ubuntu.

Créez un Dockerfile contenu avec les éléments suivants :

FROM ubuntu:22.04

ENV DEBIAN_FRONTEND noninteractive

RUN \
  apt-get update && \
  apt-get -y upgrade

RUN \
  apt-get -y --no-install-recommends install git g++ wget curl zip vim pkg-config tar cmake unzip ca-certificates

# Download Android NDK
RUN \
  wget https://dl.google.com/android/repository/android-ndk-r26d-linux.zip && \
  unzip android-ndk-r26d-linux.zip && \
  rm -rf android-ndk-r26d-linux.zip

ENV ANDROID_NDK_HOME /android-ndk-r26d

RUN git clone https://github.com/microsoft/vcpkg
WORKDIR vcpkg
RUN ./bootstrap-vcpkg.sh

ENV PATH "/vcpkg:$PATH"
ENV VCPKG_ROOT "/vcpkg"

WORKDIR /project

Générez l’image et lancez un nouveau conteneur :

docker build . -t "vcpkg-android"
docker run -it "vcpkg-android" bash

Dans le conteneur, créez /project/vcpkg.json avec le contenu suivant :

{
  "dependencies": [
    "jsoncpp"
  ],
  "builtin-baseline": "1e68748a7c6914642ed686b2e19c3d688bca150a"
}

Enfin, exécutez vcpkg install --triplet x64-android pour générer jsoncpp pour Android.

Utilisation du Kit de développement logiciel (SDK) Vulkan

vcpkg a un vulkan package qui vous find_package(Vulkan)permet de . Pour l’utiliser, vous devez fournir la variable d’environnement VULKAN_SDK .

export VULKAN_SDK=/usr/local
./vcpkg install vulkan

NDK contient déjà des en-têtes et libvulkan.so des fichiers binaires Vulkan pour chacune de ses architectures.

Pour les exposer à vcpkg, vous pouvez envisager export VULKAN_SDK=... pour chaque installation. Mais en plaçant set(ENV{VULKAN_SDK} ...) les fichiers triplets, vous pouvez ignorer le travail fastidieux.

Si vous utilisez NDK 21.3.6528147 ou une version antérieure, ce sera comme suit :

# In android triplets... (e.g. arm64-android.cmake)
set(VCPKG_CMAKE_SYSTEM_NAME Android)
# ...
# If your API level is 30, libvulkan.so is at $ENV{ANDROID_NDK_HOME}/platforms/android-30/arch-arm64/usr/lib
set(ENV{VULKAN_SDK} $ENV{ANDROID_NDK_HOME}/sysroot/usr)

Notez que l’emplacement du sysroot a changé depuis NDK 22. (Pour plus d’informations, consultez [BUG] en-têtes sysroot manquants depuis r22 ?).

Si vous préférez utiliser la dernière version, vérifiez la BuildSystemMaintainers.md du document NDK, puis placez le chemin approprié pour votre système.

Par exemple, les utilisateurs macOS utilisent le chemin d’accès comme cet exemple :

# In android triplets... (e.g. arm64-android.cmake)
set(VCPKG_CMAKE_SYSTEM_NAME Android)
# ...
# If your API level is 30, libvulkan.so is at $ENV{ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/30
set(ENV{VULKAN_SDK} $ENV{ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr)

En procédant ainsi pour tous les triplets Android, vous pouvez installer vulkan et les packages qui en ont besoin. (p. ex. vulkan-hpp)

'vcpkg install vulkan-hpp :arm64-android'
user@host$ ./vcpkg install vulkan-hpp:arm64-android
Computing installation plan...
The following packages will be built and installed:
  * vulkan[core]:arm64-android -> 1.1.82.1-1
    vulkan-hpp[core]:arm64-android -> 2019-05-11-1
Additional packages (*) will be modified to complete this operation.
Detecting compiler hash for triplet arm64-android...
...
Starting package 1/2: vulkan:arm64-android
Building package vulkan[core]:arm64-android...
-- Using community triplet arm64-android. This triplet configuration is not guaranteed to succeed.
-- [COMMUNITY] Loading triplet configuration from: /.../vcpkg/triplets/community/arm64-android.cmake
-- Querying VULKAN_SDK Environment variable
-- Searching /.../Library/Android/sdk/ndk/22.1.7171670/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/vulkan/ for vulkan.h
-- Found vulkan.h
-- Performing post-build validation
-- Performing post-build validation done
...
Building package vulkan[core]:arm64-android... done
Installing package vulkan[core]:arm64-android...
Installing package vulkan[core]:arm64-android... done
Elapsed time for package vulkan:arm64-android: 35.9 ms
Starting package 2/2: vulkan-hpp:arm64-android
Building package vulkan-hpp[core]:arm64-android...
-- Using community triplet arm64-android. This triplet configuration is not guaranteed to succeed.
-- [COMMUNITY] Loading triplet configuration from: /.../vcpkg/triplets/community/arm64-android.cmake
-- Using cached /.../vcpkg/downloads/KhronosGroup-Vulkan-Hpp-5ce8ae7fd0d9c0543d02f33cfa8a66e6a43e2150.tar.gz
-- Cleaning sources at /.../vcpkg/buildtrees/vulkan-hpp/src/e6a43e2150-4f344cd911.clean. Use --editable to skip cleaning for the packages you specify.
-- Extracting source /.../vcpkg/downloads/KhronosGroup-Vulkan-Hpp-5ce8ae7fd0d9c0543d02f33cfa8a66e6a43e2150.tar.gz
-- Using source at /.../vcpkg/buildtrees/vulkan-hpp/src/e6a43e2150-4f344cd911.clean
-- Performing post-build validation
-- Performing post-build validation done
...
Building package vulkan-hpp[core]:arm64-android... done
Installing package vulkan-hpp[core]:arm64-android...
Installing package vulkan-hpp[core]:arm64-android... done
Elapsed time for package vulkan-hpp:arm64-android: 144.5 ms

Total elapsed time: 1.013 s

The package vulkan-hpp:arm64-android is header only and can be used from CMake via:

    find_path(VULKAN_HPP_INCLUDE_DIRS "vulkan/vulkan.hpp")
    target_include_directories(main PRIVATE ${VULKAN_HPP_INCLUDE_DIRS})

Exemple de projet Android

Le dossier docs/examples/vcpkg_android_example_cmake fournit un exemple de travail, avec une bibliothèque Android qui consomme la bibliothèque jsoncpp :

Détails

  • Le CMakeLists.txt utilise find_package simplement et target_link_library

  • Le script compile.sh vous permet de sélectionner n’importe quelle paire correspondante de « android abi » / « vcpkg triplet » et de tester la compilation

  • Le fichier my_lib.cpp factice utilise la bibliothèque jsoncpp

Notes

Cet exemple compile uniquement une bibliothèque Android, car la compilation d’une application Android à part entière dépasse la portée de ce document.

Test sur un exemple : vcpkg_android.cmake

Testez l’utilisation de vcpkg_android.cmake.

Le dossier vcpkg_android_example_cmake_script fournit le même exemple et utilise un script cmake pour simplifier l’utilisation.

Détails

  • La CMakeLists.txt principale charge vcpkg_android.cmake si l’indicateur VCPKG_TARGET_ANDROID est défini :

    if (VCPKG_TARGET_ANDROID)
        include("cmake/vcpkg_android.cmake")
    endif()
    

    Important

    Placez ces lignes avant d’appeler project().

  • Le script compile.sh montre qu’il est ensuite possible de compiler pour Android à l’aide d’un appel cmake simple, par exemple :

    cmake .. -DVCPKG_TARGET_ANDROID=ON -DANDROID_ABI=armeabi-v7a
    

Consommer des bibliothèques à l’aide de vcpkg et d’archives prefab Android (fichiers AAR)

Notes

Cette section décrit une fonctionnalité expérimentale de vcpkg qui peut changer ou être supprimée à tout moment.

vcpkg peut exporter des archives Android (fichiers AAR). Une fois qu’une archive est créée, elle peut être importée dans Android Studio en tant que dépendante native. L’archive est consommée automatiquement à l’aide de l’outil préfabriqué d’Android Studio.

Pour plus d’informations sur Prefab, consultez :

Notes

Utilisateurs d’Android Studio : les packages préfabriqués sont pris en charge sur Android Studio 4+.

Spécifications

  1. ndk <required>

Définissez la variable ANDROID_NDK_HOME d’environnement sur votre installation android ndk. Par exemple :

export ANDROID_NDK_HOME=/home/your-account/Android/Sdk/ndk-bundle
  1. 7zip <required on windows> ou zip <required on linux>

  2. maven <optional>

  3. Triplets Android

Notes

Pour utiliser « prefab » (voir ci-dessous), les quatre architectures sont requises. Si l’exportation est manquante, l’exportation échoue.

Exemple d’exportation [jsoncpp]

Tout d’abord, exécutez « vcpkg install » pour toutes les architectures Android prises en charge (il est obligatoire d’exporter toutes ces architectures) :

./vcpkg install jsoncpp:arm-android  jsoncpp:arm64-android  jsoncpp:x64-android  jsoncpp:x86-android

Ensuite, exportez le préfabriqué :

Remarques :

  • L'indicateur --prefab-maven est facultatif. Appelez-le si maven est installé.
  • L’indicateur --prefab-debug génère des instructions sur l’utilisation de l’archive préfabriquée via gradle.
./vcpkg export --triplet x64-android jsoncpp --prefab --prefab-maven --prefab-debug

Vous verrez la sortie comme suit :

The following packages are already built and will be exported:
    jsoncpp:arm64-android

Exporting package jsoncpp...
[DEBUG] Found 4 triplets
  arm64-android
  x64-android
  x86-android
  arm-android

...
... Lots of output...
...

[INFO] Scanning for projects...
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-clean-plugin/2.5/maven-clean-plugin-2.5.pom

...
... Lots of output...
...

[INFO] BUILD SUCCESS
[INFO] Total time:  2.207 s
[INFO] Finished at: 2020-05-10T14:42:28+02:00


...
... Lots of output...
...

[DEBUG] Configuration properties in Android Studio
In app/build.gradle

  com.vcpkg.ndk.support:jsoncpp:1.9.2

And cmake flags

    externalNativeBuild {
                cmake {
                    arguments '-DANDROID_STL=c++_shared'
                    cppFlags "-std=c++17"
                }
            }

In gradle.properties

    android.enablePrefab=true
    android.enableParallelJsonGen=false
    android.prefabVersion=${prefab.version}

Successfully exported jsoncpp. Checkout .../vcpkg/prefab 

Répertoire de sortie après l’exportation

prefab
└── jsoncpp/
    ├── aar/
    │   ├── AndroidManifest.xml
    │   ├── META-INF/
    │   │   └── LICENSE
    │   └── prefab/
    │       ├── modules/
    │       │   └── jsoncpp/
    │       │       ├── libs/
    │       │       │   ├── android.arm64-v8a/
    │       │       │   │   ├── abi.json
    │       │       │   │   ├── include/
    │       │       │   │   │   └── json/
    │       │       │   │   │       ├── json.h
    │       │       │   │   │       └── ....
    │       │       │   │   └── libjsoncpp.so
    │       │       │   ├── android.armeabi-v7a/
    │       │       │   │   ├── abi.json
    │       │       │   │   ├── include/
    │       │       │   │   │   └── json/
    │       │       │   │   │       ├── json.h
    │       │       │   │   │       └── ....
    │       │       │   │   └── libjsoncpp.so
    │       │       │   ├── android.x86/
    │       │       │   │   ├── abi.json
    │       │       │   │   ├── include/
    │       │       │   │   │   └── json/
    │       │       │   │   │       ├── json.h
    │       │       │   │   │       └── ....
    │       │       │   │   └── libjsoncpp.so
    │       │       │   └── android.x86_64/
    │       │       │       ├── abi.json
    │       │       │       ├── include/
    │       │       │       │   └── json/
    │       │       │       │       ├── json.h
    │       │       │       │       └── ....
    │       │       │       └── libjsoncpp.so
    │       │       └── module.json
    │       └── prefab.json
    ├── jsoncpp-1.9.2.aar
    └── pom.xml

Exemple de consommation [jsoncpp] via vcpkg et prefab

Consultez l’exemple de dépôt GitHub ici :

atkawa7/prefab-vpkg-integration-sample