Ler em inglês

Compartilhar via


Android

Os trigêmeos x64-android, arm-neon-android e arm64-android são testados pela integração contínua do registro com curadoria do vcpkg.

Requisitos de compilação do Android

  1. Fazer o download do Android NDK

  2. Defina a variável de ANDROID_NDK_HOME ambiente para a instalação do Android NDK para configurar a cadeia de ferramentas do Android. Por exemplo:

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

    Ou:

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

Observação: você ainda precisará instalar o g++ ou um compilador C++ direcionado ao seu host para quaisquer dependências do host.

trigêmeos vcpkg e sua ABI Android correspondente

Existem seis ABIs Android diferentes, cada uma das quais mapeia para um trio vcpkg. A tabela a seguir descreve o mapeamento de arquiteturas vcpkg para arquiteturas Android:

VCPKG_TARGET_TRIPLET ANDROID_ABI ANDROID_ARM_NEON
arm64-android arm64-v8a
arm-andróide armeabi-v7a OFF
braço-neon-andróide armeabi-v7a ATIVADO
x64-android x86_64
x86-android x86
armv6-android armeabi

Criação de bibliotecas do Android em um contêiner do Docker

Você pode criar bibliotecas do Android, como jsoncpp em um contêiner do Ubuntu Docker.

Crie um Dockerfile com os seguintes conteúdos:

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

Crie a imagem e inicie um novo contêiner:

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

No contêiner, crie /project/vcpkg.json com o seguinte conteúdo:

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

Por fim, execute vcpkg install --triplet x64-android para compilar jsoncpp para Android.

Usando o Vulkan SDK

vcpkg tem um vulkan pacote que permite que você find_package(Vulkan). Para usá-lo, você deve fornecer a variável de VULKAN_SDK ambiente.

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

O NDK já contém cabeçalhos e libvulkan.so binários Vulkan para cada uma de suas arquiteturas.

Para expô-los ao vcpkg, você pode considerar export VULKAN_SDK=... para cada instalação. Mas, ao colocar set(ENV{VULKAN_SDK} ...) os arquivos trigêmeos, você pode pular o trabalho tedioso.

Se você estiver usando o NDK 21.3.6528147 ou uma versão anterior, será o seguinte:

# 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 o local do sysroot foi alterado desde o NDK 22. (Para obter mais informações, consulte [BUG] cabeçalhos sysroot ausentes desde r22?).

Se você preferir usar a versão mais recente, verifique o BuildSystemMaintainers.md do documento NDK e coloque o caminho apropriado para o seu sistema.

Por exemplo, os usuários do MacOS usarão o caminho como este exemplo:

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

Ao fazer isso para todos os trigêmeos Android, você pode instalar vulkan e os pacotes que exigem isso. (por exemplo, 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})

Exemplo de projeto Android

A pasta docs/examples/vcpkg_android_example_cmake fornece um exemplo de trabalho, com uma biblioteca Android que consome a biblioteca jsoncpp:

Detalhes

  • O CMakeLists.txt simplesmente usa find_package e target_link_library

  • O script compile.sh permite que você selecione qualquer par correspondente de "android abi" / "vcpkg triplet" e teste a compilação

  • O arquivo my_lib.cpp fictício usa a biblioteca jsoncpp

Observação

Este exemplo compila apenas uma biblioteca Android, pois a compilação de um aplicativo Android completo está além do escopo deste documento.

Teste em um exemplo: vcpkg_android.cmake

Teste usando vcpkg_android.cmake.

A pasta vcpkg_android_example_cmake_script fornece o mesmo exemplo e usa um script cmake para simplificar o uso.

Detalhes

  • O CMakeLists.txt principal carrega vcpkg_android.cmake se o sinalizador VCPKG_TARGET_ANDROID estiver definido:

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

    Importante

    Coloque essas linhas antes de chamar project().

  • O script compile.sh mostra que é possível compilar para Android usando uma simples invocação do cmake, por exemplo:

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

Consumir bibliotecas usando vcpkg e arquivos pré-fabricados do Android (arquivos AAR)

Observação

Esta seção cobre um recurso experimental do vcpkg que pode ser alterado ou removido a qualquer momento.

vcpkg pode exportar arquivos do Android (arquivos AAR). Depois que um arquivo é criado, ele pode ser importado no Android Studio como um dependente nativo. O arquivo é consumido automaticamente usando a ferramenta prefab do Android Studio.

Para obter mais informações sobre o Prefab, consulte:

Observação

Usuários do Android Studio: os pacotes pré-fabricados são compatíveis com o Android Studio 4+.

Requisitos

  1. ndk <required>

Defina a variável ANDROID_NDK_HOME de ambiente para a instalação do Android NDK. Por exemplo:

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. Trigêmeos Android

Observação

Para usar "prefab" (veja abaixo), todas as quatro arquiteturas são necessárias. Se algum estiver faltando, a exportação falhará.

Exemplo de exportação [jsoncpp]

Primeiro, execute "vcpkg install" para todas as arquiteturas Android suportadas (é obrigatório exportar todas elas):

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

Em seguida, exporte o pré-fabricado:

Observações:

  • O sinalizador --prefab-maven é opcional. Chame-o se o maven estiver instalado.
  • O --prefab-debug sinalizador produzirá instruções sobre como usar o arquivo pré-fabricado via gradle.
./vcpkg export --triplet x64-android jsoncpp --prefab --prefab-maven --prefab-debug

Você verá uma saída como esta:

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 

O diretório de saída após a exportação

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

Exemplo de consumo de [jsoncpp] via vcpkg e prefab

Veja o exemplo de repositório GitHub aqui:

atkawa7/prefab-vpkg-integration-sample