Android

Триплеты x64-android, arm-neon-android и arm64-android тестируются общедоступным каталогом Vcpkg CI.

Требования к сборке Android

  1. Скачивание Android NDK

  2. Задайте переменную ANDROID_NDK_HOME среды для установки Android NDK, чтобы настроить цепочку инструментов Android. Например:

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

    Или сделайте так:

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

Примечание. Вам по-прежнему потребуется установить g++ или компилятор C++, предназначенный для узла для любых зависимостей узлов.

vcpkg triplets и соответствующие android ABI

Существует шесть разных API Android, каждый из которых сопоставляется с vcpkg triplet. В следующей таблице описано сопоставление архитектур vcpkg с архитектурами Android:

VCPKG_TARGET_TRIPLET ANDROID_ABI ANDROID_ARM_NEON
arm64-android arm64-v8a
arm-android armeabi-v7a ВЫКЛ.
arm-neon-android armeabi-v7a DNS
x64-android x86_64
x86-android x86
armv6-android armeabi;

Создание библиотек Android в контейнере Docker

Вы можете создавать библиотеки Android, например jsoncpp в контейнере Docker Ubuntu.

Создайте следующее Dockerfile содержимое:

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-r25c-linux.zip && \
  unzip android-ndk-r25c-linux.zip && \
  rm -rf android-ndk-r25c-linux.zip

ENV ANDROID_NDK_HOME /android-ndk-r25c

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

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

WORKDIR /project

Создайте образ и запустите новый контейнер:

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

В контейнере создайте /project/vcpkg.json следующее содержимое:

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

Наконец, запустите vcpkg install --triplet x64-android сборку jsoncpp для android.

Использование пакета SDK Vulkan

vcpkg имеет vulkan пакет , который позволяет вам find_package(Vulkan). Чтобы использовать его, необходимо предоставить VULKAN_SDK переменную среды.

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

NDK уже содержит заголовки и libvulkan.so двоичные файлы Vulkan для каждой архитектуры.

Чтобы предоставить их vcpkg, можно рассмотреть export VULKAN_SDK=... для каждой установки. Но поместив set(ENV{VULKAN_SDK} ...) в тройные файлы, вы можете пропустить емкие трудоемкие действия.

Если вы используете NDK 21.3.6528147 или более раннюю версию, это будет следующим образом:

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

Обратите внимание, что расположение sysroot изменилось с NDK 22. (Дополнительные сведения см. в разделе [ОШИБКА] заголовки sysroot отсутствуют с r22?).

Если вы предпочитаете использовать последнюю версию, проверка BuildSystemMaintainers.md документа NDK и поместите соответствующий путь для системы.

Например, пользователи Mac OS будут использовать путь, как в следующем примере:

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

Сделав это для всех android triplets, вы можете установить vulkan и пакеты, которые требуют его. (например, 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})

Пример проекта Android

Документация и примеры папки /vcpkg_android_example_cmake предоставляет рабочий пример с библиотекой Android, используюющей библиотеку jsoncpp:

Сведения

Примечание.

Этот пример компилирует только библиотеку Android, так как компиляция полнофункционированного приложения Android выходит за рамки область этого документа.

Проверьте пример: vcpkg_android.cmake

Проверьте использование vcpkg_android.cmake.

Папка vcpkg_android_example_cmake_script предоставляет тот же пример и использует скрипт cmake для упрощения использования.

Сведения

  • Основной файл CMakeLists.txt загружает vcpkg_android.cmake, если установлен флагVCPKG_TARGET_ANDROID:

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

    Важно!

    Поместите эти строки перед вызовом project().

  • Скрипт compile.sh показывает, что затем можно скомпилировать для Android с помощью простого вызова cmake, например:

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

Использование библиотек с помощью vcpkg и предварительного архива Android (AAR-файлов)

Примечание.

В этом разделе рассматривается экспериментальная функция vcpkg, которая может изменяться или удаляться в любое время.

vcpkg может экспортировать архивы Android (AAR-файлы). После создания архива он может импортироваться в Android Studio как собственный зависимый. Архив автоматически используется с помощью средства предварительной проверки android Studio.

Дополнительные сведения о prefab см. в следующем разделе:

Примечание.

Пользователи Android Studio: пакеты предварительной проверки поддерживаются в Android Studio 4+.

Requirements

  1. ndk <required>

Задайте переменную ANDROID_NDK_HOME среды для установки android ndk. Например:

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

  2. maven <optional>

  3. Триплеты Android

Примечание.

Чтобы использовать "prefab" (см. ниже), требуются все четыре архитектуры. Если отсутствует экспорт, произойдет сбой.

Пример экспорта [jsoncpp]

Во-первых, "vcpkg install" 4 android architectures (это обязательно для экспорта всех 4 из них):

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

Затем экспортируйте префаб:

Примечания.

  • Флаг --prefab-maven необязателен. Вызовите его, если maven установлен.
  • Флаг --prefab-debug выводит инструкции по использованию архива предварительной обработки с помощью gradle.
./vcpkg export --triplet x64-android jsoncpp --prefab --prefab-maven --prefab-debug

Вы увидите следующие выходные данные:

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 

Выходной каталог после экспорта

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

Пример использования [jsoncpp] через vcpkg и prefab

См. пример репозитория GitHub здесь:

atkawa7/prefab-vpkg-integration-sample