Leer en inglés

Compartir a través de


Android

La integración continua del registro mantenido de vcpkg prueba los triplets x64-android, arm-neon-android y arm64-android.

Requisitos de compilación de Android

  1. Descarga del NDK de Android

  2. Establezca la variable ANDROID_NDK_HOME de entorno en la instalación de NDK de Android para configurar la cadena de herramientas de Android. Por ejemplo:

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

    O:

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

Nota: Todavía tendrá que instalar g++ o un compilador de C++ que tenga como destino el host para las dependencias del host.

Tripletos vcpkg y su ABI de Android correspondiente

Hay seis ABIs android diferentes, cada uno de los cuales se asigna a un triplete vcpkg. En la tabla siguiente se describe la asignación de arquitecturas vcpkg a arquitecturas android:

VCPKG_TARGET_TRIPLET ANDROID_ABI ANDROID_ARM_NEON
arm64-android arm64-v8a
arm-android armeabi-v7a Apagado
arm-neon-android armeabi-v7a ACTIVAR
x64-android x86_64
x86-android x86
armv6-android armeabi

Compilación de bibliotecas de Android en un contenedor de Docker

Puede compilar bibliotecas de Android, como jsoncpp en un contenedor de Docker de Ubuntu.

Cree un Dockerfile objeto con el siguiente contenido:

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

Compile la imagen e inicie un nuevo contenedor:

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

En el contenedor, cree /project/vcpkg.json con el siguiente contenido:

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

Por último, ejecute vcpkg install --triplet x64-android para compilar jsoncpp para Android.

Uso del SDK de Vulkan

vcpkg tiene un vulkan paquete que le find_package(Vulkan)permite . Para usarlo, debe proporcionar la variable de VULKAN_SDK entorno.

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

NDK ya contiene encabezados y libvulkan.so archivos binarios de Vulkan para cada una de sus arquitecturas.

Para exponerlos a vcpkg, puede considerar export VULKAN_SDK=... para cada instalación. Pero colocando set(ENV{VULKAN_SDK} ...) en los archivos triples, puede omitir el trabajo tedioso.

Si usa NDK 21.3.6528147 o una versión anterior, será como la siguiente:

# 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)

Observe que la ubicación de sysroot ha cambiado desde NDK 22. (Para obtener más información, consulte [BUG] Faltan encabezados sysroot desde r22?).

Si prefiere usar la versión más reciente, compruebe la BuildSystemMaintainers.md del documento NDK y, a continuación, coloque la ruta de acceso adecuada para el sistema.

Por ejemplo, los usuarios de MacOS usarán la ruta de acceso como este ejemplo:

# 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)

Al hacerlo para todos los tripletes de Android, puede instalar vulkan y los paquetes que lo requieren. (por ejemplo, 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})

Proyecto de Android de ejemplo

La carpeta docs/examples/vcpkg_android_example_cmake proporciona un ejemplo de trabajo, con una biblioteca de Android que consume la biblioteca jsoncpp:

Detalles

  • El CMakeLists.txt simplemente usa find_package y target_link_library

  • El script de compile.sh permite seleccionar cualquier par coincidente de "android abi" / "vcpkg triplet" y probar la compilación.

  • El archivo my_lib.cpp ficticio usa la biblioteca jsoncpp.

Nota

En este ejemplo solo se compila una biblioteca de Android, ya que la compilación de una aplicación android completa está fuera del ámbito de este documento.

Prueba en un ejemplo: vcpkg_android.cmake

Pruebe con vcpkg_android.cmake.

La carpeta vcpkg_android_example_cmake_script proporciona el mismo ejemplo y usa un script cmake para simplificar el uso.

Detalles

  • El CMakeLists.txt principal carga vcpkg_android.cmake si se establece la marcaVCPKG_TARGET_ANDROID:

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

    Importante

    Coloque estas líneas antes de llamar a project().

  • El script de compile.sh muestra que es posible compilar para Android mediante una invocación de cmake simple, por ejemplo:

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

Consumo de bibliotecas con vcpkg y archivos prefabricados de Android (archivos AAR)

Nota

En esta sección se describe una característica experimental de vcpkg que puede cambiar o quitarse en cualquier momento.

vcpkg puede exportar archivos de Android (archivos AAR). Una vez creado un archivo, se puede importar en Android Studio como dependiente nativo. El archivo se consume automáticamente mediante la herramienta prefabricada de Android Studio.

Para obtener más información sobre Prefab, consulte:

Nota

Usuarios de Android Studio: los paquetes prefabricados se admiten en Android Studio 4+.

Requisitos

  1. ndk <required>

Establezca la variable de ANDROID_NDK_HOME entorno en la instalación de android ndk. Por ejemplo:

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

  2. maven <optional>

  3. Tripletes de Android

Nota

Para usar "prefabricado" (consulte a continuación), se requieren las cuatro arquitecturas. Si falta alguna, se producirá un error en la exportación.

Exportación de ejemplo [jsoncpp]

En primer lugar, ejecute "vcpkg install" para todas las arquitecturas android compatibles (es obligatorio exportar todas ellas):

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

A continuación, exporte el objeto prefabricado:

Notas:

  • La marca --prefab-maven es opcional. Llámalo si maven está instalado.
  • La --prefab-debug marca generará instrucciones sobre cómo usar el archivo prefabricado a través de gradle.
./vcpkg export --triplet x64-android jsoncpp --prefab --prefab-maven --prefab-debug

Verá una salida similar a la siguiente:

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 

Directorio de salida después de la exportación

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

Ejemplo de consumo de [jsoncpp] a través de vcpkg y prefab

Consulte el repositorio de GitHub de ejemplo aquí:

atkawa7/prefab-vpkg-integration-sample