Application.mk

Este documento explica o arquivo de compilação Application.mk, que descreve os módulos nativos que seu aplicativo exige. Um módulo pode ser uma biblioteca estática, uma biblioteca compartilhada ou um executável.

Recomendamos que você leia as páginas Conceitos e Android.mk antes deste documento. Fazer isso ajudará a maximizar sua compreensão do material desta página.

Visão geral

O arquivo Application.mk é um fragmento de makefile do GNU realmente muito pequeno que define diversas variáveis para compilação. Ele normalmente fica em $PROJECT/jni/, onde $PROJECT aponta para a pasta “project” do seu aplicativo. Outra alternativa é colocá-lo em uma subpasta da pasta $NDK/apps/ superior. Por exemplo:

$NDK/apps/<myapp>/Application.mk

Aqui, <myapp> é um nome abreviado usado para descrever o seu aplicativo ao sistema de compilação do NDK. Ele não acessa suas bibliotecas compartilhadas geradas nem seus pacotes finais de verdade.

Variáveis

APP_PROJECT_PATH

Essa variável armazena o caminho absoluto para a pasta raiz do projeto do aplicativo. O sistema de compilação usa essa informação para colocar versões reduzidas das bibliotecas compartilhadas JNI geradas em um local específico conhecido pelas ferramentas geradoras de APK.

Se você colocar o arquivo Application.mk em $NDK/apps/<myapp>/, deve definir essa variável. Se colocar em $PROJECT/jni/, ela é opcional.

APP_OPTIM

Defina essa variável opcional como release ou debug. Ela é usada para alterar o nível de otimização ao compilar os módulos do aplicativo.

O modo “release” é o padrão, e gera binários altamente otimizados. O modo “debug” gera binários não otimizados que são muito mais fáceis de depurar.

Observe que você pode depurar binários de lançamento ou de depuração. Os binários de lançamento, no entanto, fornecem menos informações durante a depuração. Por exemplo, o sistema de compilação otimiza algumas variáveis, impedindo sua verificação. Além disso, a reorganização do código pode dificultar a análise percorrida do código (os rastreamentos de pilha podem não ser confiáveis).

Declarar android:debuggable na tag <application> do manifesto do aplicativo fará com que essa variável fique em debug como padrão, em vez de release. Para modificar esse valor padrão, configure APP_OPTIM como release.

APP_CFLAGS

Essa variável armazena um conjunto de sinalizadores de compilador em C que o sistema de compilação passa ao compilador ao compilar código-fonte em C ou C++ de qualquer um dos módulos. Você pode usar essa variável para alterar a compilação de determinado módulo de acordo com o aplicativo que precisa dele, em vez de ter que modificar o próprio arquivo Android.mk.

Todos os caminhos desses sinalizadores devem ser relativos à pasta NDK superior. Por exemplo, se você tiver a configuração a seguir:

sources/foo/Android.mk
sources/bar/Android.mk

Para especificar em foo/Android.mk que você quer adicionar o caminho para as fontes bar durante a compilação, você deve usar:

APP_CFLAGS += -Isources/bar

Ou, como alternativa:

APP_CFLAGS += -I$(LOCAL_PATH)/../bar

-I../bar não funcionará, já que é equivalente a -I$NDK_ROOT/../bar.

Observação: Essa variável só funciona em fontes em C, não em C++, no android-ndk-1.5_r1. Em todas as versões depois essa, APP_CFLAGS é compatível com todo o sistema de compilação do Android.

APP_CPPFLAGS

Essa variável contém um conjunto de sinalizadores de compilador em C++ que o sistema de compilação passe ao compilador ao compilar apenas fontes em C++.

Observação: No android-ndk-1.5_r1, essa variável funciona em fontes C e C++. Em todas as versões posteriores do NDK, APP_CPPFLAGS agora é compatível com todo o sistema de compilação do Android. Para sinalizadores aplicáveis a fontes em C e C++, use APP_CFLAGS.

APP_LDFLAGS

Um conjunto de sinalizadores de vinculador que o sistema de compilação passa ao se vincular ao aplicativo. Essa variável só é relevante quando o sistema de compilação está compilando bibliotecas compartilhadas e executáveis. Quando o sistema de compilação compila bibliotecas estáticas, ele ignora esses sinalizadores.

APP_BUILD_SCRIPT

Por padrão, o sistema de compilação do NDK procura um arquivo chamado Android.mk em jni/.

Se quiser modificar esse comportamento, você pode configurar APP_BUILD_SCRIPT para apontar para um script de compilação alternativo. O sistema de compilação sempre interpreta um caminho não absoluto como relativo à pasta superior do NDK.

APP_ABI

Por padrão, o sistema de compilação do NDK gera código de máquina para a ABI armeabi. Esse código de máquina corresponde a um CPU baseado em ARMv5TE com operações de ponto flutuante de software. Você pode usar APP_ABI para selecionar uma ABI diferente. A tabela 1 mostra as configurações de APP_ABI para diferentes conjuntos de instrução.

Tabela 1. Configurações de APP_ABI para diferentes conjuntos de instrução.

Conjunto de instruções Valor
Instruções da FPU de hardware em dispositivos baseados em ARMv7 APP_ABI := armeabi-v7a
ARMv8 AArch64 APP_ABI := arm64-v8a
IA-32 APP_ABI := x86
Intel64 APP_ABI := x86_64
MIPS32 APP_ABI := mips
MIPS64 (r6) APP_ABI := mips64
Todos os conjuntos de instrução compatíveis APP_ABI := all

Observação: all está disponível a partir do NDKr7.

Você também pode especificar diversos valores colocando-os na mesma linha, delimitados por espaços. Por exemplo:

APP_ABI := armeabi armeabi-v7a x86 mips

Para obter a lista de todas as ABIs compatíveis e detalhes sobre seu uso e limitações, consulte Gerenciamento de ABI.

APP_PLATFORM

Essa variável contém o nome da plataforma Android de destino. Por exemplo, android-3 especifica as imagens do sistema do Android 1.5. Para obter uma lista completa de nomes de plataforma e imagens de sistema Android correspondentes, consulte APIs nativas do Android NDK .

APP_STL

Por padrão, o sistema de compilação do NDK fornece cabeçalhos em C++ minimamente para biblioteca de tempo de execução em C++ (system/lib/libstdc++.so) fornecida pelo sistema do Android. Além disso, ele vem com implementações em C++ alternativas, que você pode usar ou vincular a seus próprios aplicativos. Use APP_STL para selecione uma delas. Para obter informações sobre os tempos de execução suportados e os recursos que oferecem, consulte Tempos de execução e recursos do NDK.

APP_SHORT_COMMANDS

O equivalente a LOCAL_SHORT_COMMANDS no Application.mk para todo o projeto. Para saber mais, consulte a documentação dessa variável em Android.mk.

NDK_TOOLCHAIN_VERSION

Defina essa variável como 4.9 ou 4.8 para selecionar uma versão do compilador GCC. A versão 4.9 é padrão para ABIs de 64 bits, a 4.8 é padrão para ABIs de 32 bits. Para selecionar uma versão do Clang, defina essa variável como clang3.4, clang3.5 ou clang. Ao especificar clang, você está selecionando a versão mais recente do Clang.

APP_PIE

A partir do Android 4.1 (API de nível 16), o vinculador do Android aceita executáveis independentes de posição (PIE). A partir do Android 5.0 (API de nível 21), os executáveis exigem o PIE. Para usar o PIE para compilar executáveis, ative o sinalizador -fPIE. Esse sinalizador dificulta a exploração de erros de corrupção de memória por meio da aleatorização da localização do código. Por padrão, ndk-build define automaticamente esse valor como true se o projeto for destinado a android-16 ou posterior. Se você pode defini-lo manualmente como true ou false.

Esse sinalizador só se aplica a executáveis. Não produz efeito na compilação de bibliotecas estáticas ou compartilhadas.

Observação: os executáveis PIE não funcionam em versões do Android anteriores à 4.1.

Essa restrição só se aplica a executáveis. Não produz efeito na compilação de bibliotecas estáticas ou compartilhadas.

APP_THIN_ARCHIVE

Define o valor padrão de LOCAL_THIN_ARCHIVE no arquivo Android.mk para todos os módulos de biblioteca estática deste projeto. Para obter mais informações, veja a documentação sobre LOCAL_THIN_ARCHIVE em Android.mk.