Propriedades da versão do SDK do Android

Os apps Android podem definir várias propriedades da versão do SDK no arquivo build.gradle. A documentação do Android build.gradle explica o que essas propriedades significam para o aplicativo em geral. Este documento explica como essas propriedades afetam os builds do NDK.

compileSdkVersion

Essa propriedade não tem efeito nos builds do NDK. A disponibilidade da API para o NDK é regida por minSdkVersion. Isso ocorre porque os símbolos C++ são resolvidos prontamente no tempo de carregamento da biblioteca em vez de serem resolvidos lentamente quando são chamados pela primeira vez (como em Java). O uso de símbolos que não estão disponíveis na minSdkVersion fará com que a biblioteca não carregue em versões do SO que não têm a API mais recente, independentemente dessas APIs serem chamadas ou não.

targetSdkVersion

Assim como o Java, a targetSdkVersion do app pode mudar o comportamento do ambiente de execução do código nativo. As mudanças de comportamento no sistema são, quando possível, aplicadas apenas a apps com uma targetSdkVersion maior ou igual à versão do SO que introduziu a mudança.

Embora os desenvolvedores de apps geralmente conheçam a targetSdkVersion do app, essa API é útil para os desenvolvedores de bibliotecas que não sabem qual targetSdkVersion os usuários escolherão.

No tempo de execução, é possível receber a targetSdkVersion usada por um aplicativo chamando android_get_application_target_sdk_version(). Essa API está disponível na API de nível 24 e mais recentes. Essa função tem a seguinte assinatura:

/**
 * Returns the `targetSdkVersion` of the caller, or `__ANDROID_API_FUTURE__` if
 * there is no known target SDK version (for code not running in the context of
 * an app).
 *
 * The returned values correspond to the named constants in `<android/api-level.h>`,
 * and is equivalent to the AndroidManifest.xml `targetSdkVersion`.
 *
 * See also android_get_device_api_level().
 *
 * Available since API level 24.
 */
int android_get_application_target_sdk_version() __INTRODUCED_IN(24);

Outras mudanças de comportamento podem depender do nível da API do dispositivo. Para ver o nível da API do dispositivo em que seu aplicativo está sendo executado, chame android_get_device_api_level(). Essa função tem a seguinte assinatura:

/**
 * Returns the API level of the device we're actually running on, or -1 on failure.
 * The returned values correspond to the named constants in `<android/api-level.h>`,
 * and is equivalent to the Java `Build.VERSION.SDK_INT` API.
 *
 * See also android_get_application_target_sdk_version().
 */
int android_get_device_api_level();

maxSdkVersion

Essa propriedade não tem efeito nos builds do NDK.

minSdkVersion

A minSdkVersion definida no arquivo build.gradle determina quais APIs estão disponíveis no tempo de compilação e determina a versão mínima do SO compatível com seu código. Consulte compileSdkVersion para entender por que isso é diferente nos builds Java.

A minSdkVersion do aplicativo é disponibilizada para o pré-processador usando a macro __ANDROID_API__. Essa macro é definida automaticamente pelo Clang. Portanto, nenhum cabeçalho precisa ser incluído para usá-la. Para builds do NDK, essa macro é sempre definida.

A minSdkVersion é usada pelo NDK para determinar quais recursos podem ser usados ao compilar seu código. Por exemplo, essa propriedade determina quais recursos FORTIFY são usados na libc e também pode permitir melhorias de desempenho ou de tamanho, como hashes GNU ou RELR, para binários que não são compatíveis com versões mais antigas do Android. Mesmo que você não use nenhuma API nova, essa propriedade ainda rege a versão mínima do sistema operacional compatível com o código. Apesar disso, é possível que as bibliotecas sejam carregadas em uma versão mais antiga do sistema operacional. Não conte com isso, já que pode variar entre versões do NDK, do sistema operacional ou de dispositivos individuais.