Qual é a diferença entre compileSdkVersion e targetSdkVersion?

525

Examinei a documentação para criar com Gradle, mas ainda não tenho certeza de qual é a diferença entre compileSdkVersione targetSdkVersioné.

Tudo o que diz é:

A compileSdkVersionpropriedade especifica o destino da compilação.

Bem, qual é o "destino de compilação"?

Eu vejo duas maneiras possíveis de interpretar isso:

  1. compileSdkVersioné a versão do compilador usada na criação do aplicativo, enquanto targetSdkVersioné o "nível da API que o aplicativo segmenta" . (Se fosse esse o caso, eu suponho que compileSdkVersiondeve ser maior ou igual ao targetSdkVersion?
  2. Eles significam a mesma coisa. "destino de compilação" == "o nível da API que o aplicativo segmenta"
  3. Algo mais?

Vejo que essa pergunta já foi feita antes, mas a resposta apenas cita o documento, que é o que não está claro para mim.

coder123
fonte
2
targetSdkVersion é o que seu dispositivo está executando. Portanto, se seus dispositivos estiverem funcionando abaixo do Oreo, não
mire em

Respostas:

546

compileSdkVersion

A compileSdkVersioné a versão da API na qual o aplicativo é compilado. Isso significa que você pode usar os recursos da API do Android incluídos nessa versão da API (bem como em todas as versões anteriores, obviamente). Se você tentar usar os recursos da API 16, mas definido compileSdkVersioncomo 15, você receberá um erro de compilação. Se você definir compileSdkVersion16, ainda poderá executar o aplicativo em um dispositivo API 15, desde que os caminhos de execução do aplicativo não tentem invocar nenhuma API específica da API 16.

targetSdkVersion

O targetSdkVersionnada tem a ver com a forma como seu aplicativo é compilado ou APIs que você pode utilizar. O targetSdkVersioné suposto para indicar que você testou seu aplicativo on (presumivelmente até e incluindo) a versão que você especificar. É mais como uma certificação ou aprovação que você está dando ao sistema operacional Android como uma dica de como ele deve lidar com seu aplicativo em termos de recursos do sistema operacional.

Por exemplo, como a documentação declara:

Por exemplo, definir esse valor como "11" ou superior permite que o sistema aplique um novo tema padrão (Holo) ao seu aplicativo ao executar no Android 3.0 ou superior ...

O sistema operacional Android, em tempo de execução , pode alterar a forma como seu aplicativo é estilizado ou executado no contexto do sistema operacional com base nesse valor. Existem alguns outros exemplos conhecidos que são influenciados por esse valor e essa lista provavelmente aumentará apenas com o tempo.

Para todos os fins práticos, a maioria dos aplicativos deseja definir targetSdkVersiona versão mais recente da API. Isso garantirá que seu aplicativo tenha a melhor aparência possível nos dispositivos Android mais recentes. Se você não especificar o targetSdkVersion, o padrão será o minSdkVersion.

Jeff Mixon
fonte
14
Não, targetSdkVersionmuito provavelmente será mais alto compileSdkVersione com razão. Isso significa que, embora você tenha criado um aplicativo para segmentar a API 16, por exemplo, ele ainda funciona bem na API 21 (Lollipop) e deve aumentar targetSdkVersionpara 21 para indicar que não há problema em o Android OS aplicar qualquer estilo de pirulito que possa existe no seu aplicativo.
Jeff Mixon
24
Fundamentalmente, não entendo como você poderia segmentar um SDK maior que o SDK em que você compilou.
Codigo123
55
Mudar compileSdkVersionpara uma versão superior significa que você deseja usar algumas novas APIs incluídas apenas nessa versão específica. Se você não planeja usar nenhum recurso específico do Lollipop em seu aplicativo, não há realmente (geralmente) nenhuma razão para definir compileSdkVersion21. Como é provável que seu aplicativo funcione corretamente na API 21, é possível alterar targetSdkVersionpara indicar que seu aplicativo é executado conforme o esperado (destino) na API 21, mas você não está usando nenhuma API específica para 21 (compilação) e, portanto, suacompileSdkVersion pode ficar com 15 neste exemplo.
quer
19
Um aviso é relatado quando faço isso no Android studio. Eu tenho "compileSdkVersion 17" e "targetSdkVersion 22" e ele diz "targetSdkVersion não deve ser maior que compileSdkVersion". Ah, acabei de mudar e agora está me dizendo que o targetSdkVersion não é dos 22 mais recentes e que o modo de compatibilidade pode entrar em cena. Suspiro.
Pelpotronic
18
Esta resposta contradiz o que o Android Studio diz. targetSdkVersion é importante e deve ser menor ou igual a compileSdkVersion
ARK
152

Como um guia oneliner:

minSdkVersion <= targetSdkVersion <= compileSdkVersion

Idealmente:

minSdkVersion (lowest possible) <= targetSdkVersion == compileSdkVersion (latest SDK)

Leia mais deste ótimo post de Ian Lake

Jimmy Kane
fonte
Será que minSdkVersion meios o menor nível de aplicativo de dispositivo API canpode ser executado? Presumivelmente porque usa determinadas APIs disponíveis a partir minSdkVersionde então?
Nitin Bansal
1
@NitinBansal yes. Por exemplo, se minSdkVersionfor 15 (que é o ICS 4.0.3), os dispositivos com a API 14 (que é o ICS 4.0) não poderão instalar o aplicativo. E, pelo menos por enquanto, o aplicativo será executado em 15, 16, 17, 18, 19 (20, mas isso é para o desgaste antigo), 21, 22, 23, 24, 25, 26, 27, 28 e assim por diante. no futuro (provavelmente)
Louis Tsai
33

A compileSdkVersiondeve ser a versão estável mais recente. O teste targetSdkVersiondeve ser totalmente testado e menor ou igual a compileSdkVersion.

androidwifi
fonte
14
Alguma razão específica para dizer que targetSdkVersion seja menor que compileSdkVersion? Eu acredito que é uma declaração errada
Sufian
6
Eu acho que o ponto é que a última versão é compatível com versões anteriores, então a versão mais recente da API pode "se comportar" como as mais antigas, se você definir a targetSdkVersionmenor. Portanto, targetSdkVersiondeve ser o que você testou e conhece o comportamento exato e pode ser <= o último estável.
precisa
Eu acho que a sua declaração ' compileSdkVersiondeve ser a versão estável mais recente' deve estar com o sufixo 'da qual você usa os recursos da API'. Não faz sentido compilar com a API 27 (a API estável mais recente de hoje) se você usar apenas os recursos de versão mais baixa da API. No entanto, a versão estável mais recente pode incluir alguns recursos que melhoram automaticamente, por exemplo, segurança aprimorada ou compilação eficiente com compatibilidade com versões anteriores. Portanto, é aconselhável usar a versão mais recente ou pelo menos uma versão estável recente, mas "não deve ser" a versão mais recente si .
Erik
27

Tarde do jogo .. e há várias ótimas respostas acima - basicamente, essa compileSdkVersioné a versão da API na qual o aplicativo é compilado, enquanto otargetSdkVersion indica a versão em que o aplicativo foi testado.

Gostaria de complementar essas respostas com as seguintes notas:

  1. Isso targetSdkVersionafeta a maneira como as permissões são solicitadas :

    • Se o dispositivo estiver executando o Android 6.0 (nível 23 da API) ou superior, e o aplicativotargetSdkVersion for 23 ou superior, o aplicativo solicitará permissões do usuário em tempo de execução.
    • Se o dispositivo estiver executando o Android 5.1 (nível de API 22) ou inferior, ou o aplicativo targetSdkVersionfor 22 ou inferior, o sistema solicitará que o usuário conceda as permissões quando o usuário instalar o aplicativo.
  2. Se compileSdkVersionfor maior que a versão declarada pelo seu aplicativo targetSdkVersion, o sistema poderá ativar comportamentos de compatibilidade para garantir que seu aplicativo continue funcionando da maneira que você espera. ( ref )

  3. A cada nova versão do Android ...

    • targetSdkVersion deve ser incrementado para corresponder ao nível mais recente da API e, em seguida, teste minuciosamente seu aplicativo na versão da plataforma correspondente
    • compileSdkVersion, por outro lado, não precisa ser alterado, a menos que você esteja adicionando recursos exclusivos à nova versão da plataforma
    • Como resultado, embora targetSdkVersionmuitas vezes seja (inicialmente) menor que o compileSdkVersion, não é incomum ver um aplicativo bem mantido / estabelecido comtargetSdkVersion > compileSdkVersion
Austin D
fonte
5
Re: seu segundo ponto, eu não acho que o documento de referências diz isso explicitamente. Ele diz "No entanto, se o nível da API da plataforma for superior à versão declarada pelo targetSdkVersion do seu aplicativo, o sistema poderá ativar comportamentos de compatibilidade para garantir que seu aplicativo continue funcionando da maneira que você espera". Acho que isso significa que, se o nível da API do dispositivo em que você está executando for mais recente que o seu, targetSdkVersionvocê poderá ver comportamentos de compatibilidade. Não acredito que tenha algo a ver com o compileSdkVersion.
Jeremy
20

The CompileSdkVersion é a versão da plataforma SDK com a qual seu aplicativo trabalha para compilação, etc. DURANTE o processo de desenvolvimento (você deve sempre usar as mais recentes). É fornecida com a versão da API que você está usando

insira a descrição da imagem aqui

Você verá isso no seu build.gradlearquivo:

insira a descrição da imagem aqui

targetSdkVersion:contém as informações fornecidas pelo aplicativo APÓS o processo de desenvolvimento para a loja de aplicativos que permite TARGET the SPECIFIED version of the Android platform. Dependendo da funcionalidade do seu aplicativo, ele pode segmentar versões da API inferiores às atuais. Por exemplo, você pode segmentar a API 18, mesmo que a versão atual seja 23.

Dê uma boa olhada nesta página oficial do Google .

Ojonugwa Jude Ochalifu
fonte
9

Eu vejo muitas diferenças sobre compiledSdkVersion nas respostas anteriores, então tentarei esclarecer um pouco aqui, seguindo a página da web do android.

A - O que diz o Android

De acordo com https://developer.android.com/guide/topics/manifest/uses-sdk-element.html :

Selecionando uma versão da plataforma e o nível da API Ao desenvolver seu aplicativo, você precisará escolher a versão da plataforma na qual compilará o aplicativo. Em geral, você deve compilar seu aplicativo com a versão mais baixa possível da plataforma que ele puder suportar.

Portanto, essa seria a ordem correta de acordo com o Android:

compiledSdkVersion = minSdkVersion <= targetSdkVersion

B - O que os outros também dizem

Algumas pessoas preferem sempre usar a versão compilada mais alta do Skd disponível. Isso ocorre porque eles contam com dicas de código para verificar se estão usando recursos de API mais recentes que o minSdkVersion, alterando o código para não usá-los ou verificando a versão da API do usuário em tempo de execução para usá-los condicionalmente com fallbacks de versões mais antigas da API.

As dicas sobre usos descontinuados também apareceriam no código, informando que algo está descontinuado nos níveis mais recentes da API, para que você possa reagir adequadamente, se desejar.

Portanto, essa seria a ordem correta de acordo com os outros:

minSdkVersion <= targetSdkVersion <= compiledSdkVersion (highest possible)

O que fazer?

Depende de você e seu aplicativo.

Se você planeja oferecer recursos diferentes da API de acordo com o nível da API do usuário em tempo de execução, use a opção B. Você obterá dicas sobre os recursos que você usa durante a codificação. Apenas certifique-se de nunca usar os recursos mais recentes da API que o minSdkVersion sem verificar o nível da API do usuário em tempo de execução, caso contrário, seu aplicativo falhará. Essa abordagem também tem o benefício de aprender o que há de novo e o que é antigo durante a codificação.

Se você já sabe o que é novo ou antigo e está desenvolvendo um aplicativo único que com certeza nunca será atualizado, ou tem certeza de que não oferecerá novos recursos de API condicionalmente, use a opção A. Você não será incomodado com dicas descontinuadas e você nunca poderá usar os recursos mais recentes da API, mesmo se estiver tentado a fazê-lo.

CGodo
fonte
2
Não acho que o conselho do Android seja diferente. Há uma diferença entre "compilar seu aplicativo com a versão mais baixa possível" e compilar com uma versão específica do SDK. Geralmente, você deve compilar (compileSdkVersion) com a versão mais recente, definir seu min (minSdkVersion) o mais baixo possível e definir seu destino (targetSdkVersion) o mais alto possível, sujeito a testes ou outros problemas de compatibilidade.
Caltor
Bom ponto @Caltor. Eu gostaria que eles atualizassem esse documento para esclarecer a diferença. A <uses-sdk>documentação é extremamente vaga e ambígua.
Jeremy
2

Meus 2 centavos: compile com qualquer versão do SDK, mas tome cuidado para não chamar APIs que sua "versão mínima do SDK" não oferece suporte. Isso significa que você "poderia" compilar com a versão mais recente do SDK.

Quanto à "versão de destino", ela simplesmente se refere ao que você planejou atingir em primeiro lugar e possivelmente testou. Se você não fez a devida diligência, esta é a maneira de informar ao Android que ele precisa executar algumas verificações adicionais antes de implantar o seu, digamos, o aplicativo direcionado "Lollipop" no "Oreo".

Portanto, a "versão de destino" obviamente não é inferior à sua "versão mínima do SDK", mas não pode ser superior à sua "versão compilada".

pcodex
fonte
1

Não respondendo às suas perguntas diretas, uma vez que já existem muitas respostas detalhadas, mas vale a pena mencionar que, ao contrário da documentação do Android, o Android Studio está sugerindo o uso da mesma versão para compileSDKVersione targetSDKVersion.

insira a descrição da imagem aqui

sshturma
fonte
0

compiledSdkVersion ==> qual versão do SDK deve compilar seu código no ponto de bytecode (usado no ambiente de desenvolvimento): é melhor usar a última versão do SDK.

minSdkVersion ==> esses itens são usados ​​para a instalação do APK (usado no ambiente de produção). Por exemplo:

if(client-sdk-version   <   min-sdk-versoin )
    client-can-not-install-apk;
else
    client-can-install-apk;
M.Namjo
fonte
0

Resumo rápido:

Para minSDKversion, consulte a entrada mais recente no identificador do twitter: https://twitter.com/minSdkVersion

TargetSDKversion: veja a entrada mais recente no identificador do twitter: https://twitter.com/targtSdkVersion ou use o nível de API mais recente, conforme indicado em devel https://developer.android.com/guide/topics/manifest/uses-sdk-element. html

Versão compilada: faça o mesmo que o TargetSDKversion

maxSdkVersion: o conselho do Android é não definir isso, pois você não deseja limitar seu aplicativo a não executar em futuras versões do Android

kush
fonte
0

As configurações de aplicativo das propriedades de um projeto Android no Visual Studio 2017 (15.8.5) as combinam:

insira a descrição da imagem aqui

Sam é
fonte