Boa noite amigos. Preparamos uma tradução Ăștil para futuros alunos do Desenvolvedor Android. Curso avançado . â Estamos felizes em compartilhar este material com vocĂȘ.
Se vocĂȘ estĂĄ lendo este artigo, significa que vocĂȘ pode estar interessado em coisas como:
- O que significa o nĂvel da API?
- Como usar compileSdkVersion,minSdkVersionoutargetSdkVersion?
- Como posso garantir que o aplicativo funcione corretamente em dispositivos com diferentes versÔes do sistema operacional?

Todos esses conceitos estĂŁo relacionados entre si, e tentarei explicĂĄ-los neste artigo de uma maneira simples, mas eficaz.
Para fazer isso, vocĂȘ precisa entender a diferença entre o 
SDK e a 
API e saber qual Ă© 
o nĂvel da API no ecossistema do Android.
Ă verdade que no Android existe um relacionamento 1: 1 entre o SDK e a API, e geralmente esses dois termos sĂŁo usados ââcomo sinĂŽnimos, mas Ă© importante entender que isso nĂŁo Ă© a mesma coisa.
Ă mais correto dizer que, para cada versĂŁo do Android, existe um SDK e uma API equivalente, alĂ©m do nĂvel dessa API.
SDK
Significa 
Software Development Kit . Preste atenção à palavra "kit" (kit) ... consiste apenas em um conjunto de vårias ferramentas, bibliotecas, documentação, exemplos que ajudam os desenvolvedores a criar, depurar e executar aplicativos Android. Uma API é fornecida com o SDK.
Se vocĂȘ abrir o 
SDK Manager no Android Studio, poderĂĄ ver mais claramente em que consiste o Android SDK.
A primeira guia do 
Platform SDK lista os SDKs de cada versĂŁo do Android.
Conforme mostrado na imagem abaixo, o Android 9.0 SDK (também conhecido como Pie) contém:
- Plataforma Android SDK 28 (esta Ă© a API da estrutura).
- O cĂłdigo fonte do Android 28 (esta Ă© uma implementação da API, como vocĂȘ pode ver, Ă© opcional ... lembre-se disso).
- e vĂĄrias outras coisas ... por exemplo, vĂĄrias imagens do sistema para o emulador do Android.
 VisĂŁo geral do SDK no Android Studio SDK Manager.
VisĂŁo geral do SDK no Android Studio SDK Manager.A segunda guia das 
ferramentas do 
SDK mostra outras ferramentas que também fazem parte do SDK, mas são independentes da versão da plataforma. Isso significa que eles podem ser liberados ou atualizados separadamente.
API
Significa 
Application Programming Interface . à apenas uma interface, uma camada de abstração que fornece um link entre duas "partes" diferentes do software. Funciona como um contrato entre um provedor (por exemplo, uma biblioteca) e um consumidor (por exemplo, um aplicativo).
Este é um conjunto de definiçÔes formais, como classes, métodos, funçÔes, módulos, constantes, que podem ser usadas por outros desenvolvedores para escrever seu código. No entanto, a API não inclui uma implementação.
NĂvel da API
O nĂvel da API Ă© um valor inteiro que identifica exclusivamente a versĂŁo da API da estrutura oferecida pela plataforma Android.
Normalmente, as atualizaçÔes da API da estrutura da plataforma sĂŁo projetadas para que a nova versĂŁo da API permaneça compatĂvel com as versĂ”es anteriores, para que a maioria das alteraçÔes na nova API seja aditiva e as partes antigas da API se tornem obsoletas, mas nĂŁo excluĂdas.
E agora alguém pode se perguntar ...
se a API do Android não fornece uma implementação e o 
SDK Manager oferece um código-fonte opcional da API para download como parte do SDK, onde estå a implementação correspondente?
A resposta Ă© simples. 
No dispositivoVamos descobrir ...
Do cĂłdigo fonte para o arquivo APK
Normalmente, um projeto Android consiste em cĂłdigo escrito por desenvolvedores usando a API do Android (mĂłdulo de aplicativo), alĂ©m de algumas outras bibliotecas / dependĂȘncias (arquivos .jar, AAR, mĂłdulos etc.) e recursos.
O processo de compilação converte o cĂłdigo escrito em Java ou Kotlin, incluindo dependĂȘncias (um dos motivos para reduzir seu cĂłdigo!), No bytecode do DEX e compacta tudo em um arquivo APK junto com os recursos. Nesta fase, a implementação da API nĂŁo estĂĄ incluĂda no APK final!
 Processo de compilação - Desenvolvedores Android
Processo de compilação - Desenvolvedores AndroidArquivos DEX e Android Runtime
 Arquitetura Android - Desenvolvedores Android
Arquitetura Android - Desenvolvedores AndroidO Android Runtime Ă© o local em que todo o trabalho sujo Ă© realizado e os arquivos DEX sĂŁo executados. Consiste em dois componentes principais:
- Uma mĂĄquina virtual para aproveitar a portabilidade de cĂłdigo e a independĂȘncia da plataforma. A partir do Android 5.0 (Lollipop), o antigo tempo de execução, Dalvik Virtual Machine, foi completamente substituĂdo pelo novo Android RunTime (ART). Dalvik usou o compilador JIT, enquanto o ART usa a compilação AOT (Ahead of time) mais JIT para criar o perfil do cĂłdigo em tempo de execução.
- Bibliotecas base são bibliotecas Java e Android padrão. Simplificando, é aqui que a implementação da API estå localizada.
A versĂŁo da API disponĂvel neste nĂvel corresponde Ă  versĂŁo da plataforma Android na qual o aplicativo estĂĄ sendo executado.
Por exemplo, se o Android 9 (Pie) estiver instalado no dispositivo real, todas as APIs atĂ© o nĂvel 28 estarĂŁo disponĂveis.
Se vocĂȘ entende os pontos principais do Android Runtime e qual Ă© o papel da API, deve ser fĂĄcil entender a 
compatibilidade com 
versÔes anteriores e futuras , além do uso de 
compileSdkVersion , 
minSdkVersion e 
targetSdkVersion .
compileSdkVersion
Este valor Ă© usado apenas para 
informar ao 
Gradle qual versĂŁo do SDK deve ser compilada. Isso permite que os desenvolvedores acessem todas as APIs disponĂveis atĂ© o nĂvel da API definido para 
compileSdkVersion .
Ă altamente recomendĂĄvel compilar com o SDK mais recente:- Um alto nĂvel de API permite que os desenvolvedores aproveitem a API mais recente e as oportunidades oferecidas pelas novas plataformas.
- Para usar a versĂŁo mais recente do compileSdkVersion,compileSdkVersiondeve corresponder Ă  versĂŁo doSupportLibrary.
Por exemplo, para usar 
SupportLibrary-28.xx , 
compileSdkVersion também deve ser 28.
- Para alternar para o AndroidX ou usĂĄ-lo, compileSdkVersion deve estar definido como pelo menos 28.
- estar pronto para atender aos requisitos do nĂvel da API de destino do Google Play . O Google anunciou que a cada ano definirĂĄ um nĂvel mĂnimo de meta de API para novos aplicativos e atualizaçÔes para espalhar as novas versĂ”es do Android para o mercado do Google mais rapidamente. VocĂȘ pode encontrar mais informaçÔes aqui e aqui .
Os aplicativos Android sĂŁo compatĂveis com as novas versĂ”es da plataforma Android, pois as alteraçÔes na API geralmente sĂŁo aditivas e a API antiga pode se tornar obsoleta, mas nĂŁo removida.
Isso significa que 
a compatibilidade direta Ă© garantida principalmente pela plataforma e, quando vocĂȘ executa o aplicativo em um dispositivo com um nĂvel de API mais alto do que o especificado em 
compileSdkVersion , não hå problemas no tempo de execução, o aplicativo funcionarå conforme o esperado em versÔes mais recentes da plataforma.
Por exemplo:
O aplicativo + 
compileSdkVersion = 
26 e o método API 
xyz() introduzido no 
nĂvel da API 26 podem funcionar em um dispositivo com Android 8 Oreo (API nĂvel 26).
O mesmo aplicativo pode funcionar em um dispositivo com Android 9 Pie (API nĂvel 28), pois o mĂ©todo API 
xyz() ainda estĂĄ disponĂvel no nĂvel 28 da API.
minSdkVersion
Este valor indica o nĂvel mĂnimo da API no qual o aplicativo pode ser executado. 
Este Ă© um requisito mĂnimo. Se nĂŁo especificado, o valor padrĂŁo Ă© 1 .
Os desenvolvedores precisam definir o valor correto e garantir a operação correta do aplicativo atĂ© esse nĂvel da API. Isso Ă© chamado de 
compatibilidade com versÔes anteriores .
Durante o desenvolvimento, o 
Lint também avisa os desenvolvedores quando eles tentam usar qualquer API abaixo da especificada em 
minSdkVersion . 
Ă muito importante nĂŁo ignorar os avisos e corrigi-los!Para garantir 
compatibilidade com versÔes anteriores , os desenvolvedores podem verificar a versão da plataforma em tempo de execução e usar a nova API em versÔes mais recentes da plataforma e a API antiga em versÔes mais antigas ou, dependendo do caso, usar algumas bibliotecas eståticas que fornecem compatibilidade com versÔes anteriores.
TambĂ©m Ă© importante mencionar que a Google Play Store usa esse valor para determinar se o aplicativo pode ser instalado em um dispositivo especĂfico, comparando a versĂŁo da plataforma do dispositivo com o aplicativo 
minSdkVersion .
Os desenvolvedores devem ter muito cuidado ao escolher esse valor, pois a compatibilidade com versÔes anteriores não é garantida pela plataforma.
Escolher o valor "certo" para um projeto tambĂ©m Ă© uma decisĂŁo de negĂłcios, pois afeta o tamanho do pĂșblico-alvo do aplicativo. Veja a 
distribuição de plataformas .
Por exemplo:
O aplicativo + 
compileSdkVersion = 
26 + 
minSdkVersion = 
22 e o método API 
xyz() introduzido no nĂvel da API 26 podem funcionar em um dispositivo com Android 8 Oreo (API nĂvel 26).
O mesmo aplicativo pode ser instalado e executado em um dispositivo mais antigo com Android 5.1 Lollipop (API nĂvel 22), em que o mĂ©todo da API 
xyz() não existe. Se os desenvolvedores não fornecerem compatibilidade com versÔes anteriores por meio de verificaçÔes de tempo de execução ou de qualquer biblioteca, o aplicativo falharå assim que tentar acessar o método da API 
xyz() .
targetSdkVersion
Este valor indica o nĂvel da API em que o aplicativo foi desenvolvido.
NĂŁo confunda com 
compileSdkVersion . O Ășltimo Ă© usado apenas em tempo de compilação e disponibiliza novas APIs para os desenvolvedores. O primeiro, por outro lado, faz parte do APK (assim como 
minSdkVersion ) e altera o comportamento do tempo de execução. à assim que os desenvolvedores podem controlar 
a compatibilidade direta .
Ăs vezes, pode haver algumas alteraçÔes de API no sistema base que podem afetar o comportamento do aplicativo ao trabalhar em um novo ambiente de tempo de execução.
O nĂvel do aplicativo de destino inclui um comportamento de tempo de execução especĂfico da versĂŁo da plataforma. Se o aplicativo nĂŁo estiver pronto para suportar essas alteraçÔes no comportamento do tempo de execução, Ă© provĂĄvel que falhe.
Um exemplo simples Ă© a 
permissĂŁo de tempo de execução , que foi introduzida no Android 6 Marshmallow (nĂvel 23 da API).
Um aplicativo pode ser compilado usando uma API de nĂvel 23, mas possui uma API de nĂvel 22 de destino, se ainda nĂŁo estiver pronto para suportar o novo modelo de permissĂŁo de tempo de execução.
Portanto, um aplicativo ainda pode ser compatĂvel sem incluir um novo comportamento em tempo de execução.
De qualquer forma, como jĂĄ mencionado, o Google exige que os aplicativos atendam aos novos requisitos do nĂvel da API de destino; portanto, vocĂȘ sempre deve ter alta prioridade para atualizar esse valor.
Agora, juntando tudo, vemos um relacionamento claro
minSdkVersion †targetSdkVersion †compileSdkVersionLembre-se de que Ă© altamente recomendĂĄvel que vocĂȘ compile com o nĂvel mais recente da API e tente usar 
targetSdkVersion == 
compileSdkVersion .
Fontes