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.