Leggere in inglese

Condividi tramite


Android

I triplets x64-android, arm-neon-android e arm64-android vengono testati dall'integrazione continua del Registro di sistema curato da vcpkg.

Requisiti di compilazione android

  1. Scaricare Android NDK

  2. Impostare la variabile ANDROID_NDK_HOME di ambiente sull'installazione di Android NDK per configurare la toolchain Android. Ad esempio:

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

    Oppure:

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

Nota: sarà comunque necessario installare g++ o un compilatore C++ destinato all'host per qualsiasi dipendenza host.

triplet vcpkg e l'ABI Android corrispondente

Ci sono sei diverse ABI Android, ognuna delle quali esegue il mapping a un triplo vcpkg. La tabella seguente illustra il mapping dalle architetture vcpkg alle architetture android:

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

Compilazione di librerie Android in un contenitore Docker

È possibile compilare librerie Android, ad esempio jsoncpp in un contenitore Docker Ubuntu.

Creare un Dockerfile oggetto con il contenuto seguente:

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

Compilare l'immagine e avviare un nuovo contenitore:

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

Nel contenitore creare /project/vcpkg.json con il contenuto seguente:

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

Infine, eseguire vcpkg install --triplet x64-android per compilare jsoncpp per Android.

Uso di Vulkan SDK

vcpkg include un vulkan pacchetto che consente di .find_package(Vulkan) Per usarlo, è necessario specificare la VULKAN_SDK variabile di ambiente.

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

NDK contiene già intestazioni e libvulkan.so file binari Vulkan per ognuna delle relative architetture.

Per esporli a vcpkg, è possibile prendere in considerazione export VULKAN_SDK=... per ogni installazione. Ma inserendo set(ENV{VULKAN_SDK} ...) i file triplo, è possibile ignorare il lavoro noioso.

Se si usa NDK 21.3.6528147 o una versione precedente, sarà simile al seguente:

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

Si noti che il percorso di sysroot è cambiato da NDK 22. Per altre informazioni, vedere [BUG] intestazioni sysroot mancanti da r22?).

Se si preferisce usare la versione più recente, controllare il BuildSystemMaintainers.md del documento NDK e quindi inserire il percorso appropriato per il sistema.

Ad esempio, gli utenti macOS useranno il percorso come nell'esempio seguente:

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

In questo modo, per tutti i tripletti Android, è possibile installare vulkan e i pacchetti che lo richiedono. (ad esempio 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})

Progetto Android di esempio

La documentazione della cartella /examples/vcpkg_android_example_cmake fornisce un esempio funzionante, con una libreria Android che usa la libreria jsoncpp:

Dettagli

  • Il CMakeLists.txt usa find_package semplicemente e target_link_library

  • Lo script compile.sh consente di selezionare qualsiasi coppia corrispondente di "android abi" / "vcpkg triplet" e di testare la compilazione

  • Il file fittizio my_lib.cpp usa la libreria jsoncpp

Nota

Questo esempio compila solo una libreria Android, perché la compilazione di un'app Android completa esula dall'ambito di questo documento.

Eseguire un test in un esempio: vcpkg_android.cmake

Eseguire il test usando vcpkg_android.cmake.

La cartella vcpkg_android_example_cmake_script fornisce lo stesso esempio e usa uno script cmake per semplificare l'utilizzo.

Dettagli

  • Il CMakeLists.txt principale carica vcpkg_android.cmake se il flag VCPKG_TARGET_ANDROID è impostato:

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

    Importante

    Posizionare queste righe prima di chiamare project().

  • Lo script compile.sh mostra che è quindi possibile compilare per Android usando una semplice chiamata cmake, ad esempio:

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

Usare librerie con vcpkg e archivi prefab Android (file AAR)

Nota

Questa sezione illustra una funzionalità sperimentale di vcpkg che può cambiare o essere rimossa in qualsiasi momento.

vcpkg può esportare archivi Android (file AAR). Dopo aver creato un archivio, può essere importato in Android Studio come dipendente nativo. L'archivio viene utilizzato automaticamente usando lo strumento di prefab di Android Studio.

Per altre informazioni sul prefab, vedere:

Nota

Utenti di Android Studio: i pacchetti prefab sono supportati in Android Studio 4+.

Requisiti

  1. ndk <required>

Impostare la variabile ANDROID_NDK_HOME di ambiente sull'installazione di Android ndk. Ad esempio:

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

  2. maven <optional>

  3. Triplette Android

Nota

Per usare "prefab" (vedere di seguito), sono necessarie tutte e quattro le architetture. Se manca l'esportazione, l'esportazione avrà esito negativo.

Esempio di esportazione [jsoncpp]

Eseguire prima di tutto "vcpkg install" per tutte le architetture Android supportate (è obbligatorio esportarle tutte):

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

Esportare quindi il prefab:

Note:

  • Il --prefab-maven flag è facoltativo. Chiamalo se maven è installato.
  • Il --prefab-debug flag restituisce istruzioni su come usare l'archivio prefab tramite gradle.
./vcpkg export --triplet x64-android jsoncpp --prefab --prefab-maven --prefab-debug

Verrà visualizzato un output simile al seguente:

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 

Directory di output dopo l'esportazione

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

Esempio di utilizzo [jsoncpp] tramite vcpkg e prefab

Vedere il repository GitHub di esempio qui:

atkawa7/prefab-vpkg-integration-sample