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
vai fazer com que a biblioteca não carregue em versões do SO que não
têm a API mais recente, independentemente de essas APIs serem chamadas ou não.
Para um novo app, escolha a versão mais recente disponível. Para um app já existente, atualize para a última versão quando for conveniente.
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.
Para um novo app, escolha a versão mais recente disponível. Para um app já existente, atualize
para a última versão quando for conveniente (depois de atualizar a compileSdkVersion
).
Embora os desenvolvedores geralmente conheçam a targetSdkVersion
do app deles, essa
API é útil para os desenvolvedores de bibliotecas que não sabem qual targetSdkVersion
os usuários vão escolher.
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 build e 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
é usada pelo NDK para determinar quais recursos podem ser utilizados
ao compilar seu código. Por exemplo, essa propriedade determina quais recursos FORTIFY
(link em inglês) são usados na libc e também pode permitir melhorias de performance 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 que pode ser usada com o código.
Para um novo app, consulte os dados de distribuição de usuários no assistente de novo projeto do Android Studio
ou em apilevels.com (link em inglês). Faça sua escolha de maneira a equilibrar
possíveis custos de participação de mercado e de manutenção. Quanto menor a minSdkVersion
,
mais tempo você vai passar contornando bugs antigos e adicionando comportamentos substitutos
para recursos ainda não implementados.
Para um app já existente, aumente a minSdkVersion
sempre que os níveis antigos da API não
compensarem mais os custos de manutenção ou diminua se essa for uma demanda dos usuários e se
os novos custos de manutenção compensarem. O Play Console tem métricas específicas para a
distribuição de usuários do seu app.
A minSdkVersion
do aplicativo é disponibilizada para o pré-processador
pela macro __ANDROID_MIN_SDK_VERSION__
. A __ANDROID_API__
legada é
idêntica, mas prefira a citada anteriormente porque o significado é mais claro. Essa macro é
definida automaticamente pelo Clang, então
nenhum cabeçalho precisa ser incluído para fazer uso dela. Para
builds do NDK, essa macro sempre é definida.