Examinei a documentação para criar com Gradle, mas ainda não tenho certeza de qual é a diferença entre compileSdkVersion
e targetSdkVersion
é.
Tudo o que diz é:
A
compileSdkVersion
propriedade especifica o destino da compilação.
Bem, qual é o "destino de compilação"?
Eu vejo duas maneiras possíveis de interpretar isso:
compileSdkVersion
é a versão do compilador usada na criação do aplicativo, enquantotargetSdkVersion
é o "nível da API que o aplicativo segmenta" . (Se fosse esse o caso, eu suponho quecompileSdkVersion
deve ser maior ou igual aotargetSdkVersion
?- Eles significam a mesma coisa. "destino de compilação" == "o nível da API que o aplicativo segmenta"
- 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.
android
sdk
android-gradle-plugin
android-build
coder123
fonte
fonte
Respostas:
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 definidocompileSdkVersion
como 15, você receberá um erro de compilação. Se você definircompileSdkVersion
16, 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
targetSdkVersion
nada tem a ver com a forma como seu aplicativo é compilado ou APIs que você pode utilizar. OtargetSdkVersion
é 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:
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
targetSdkVersion
a 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 otargetSdkVersion
, o padrão será ominSdkVersion
.fonte
targetSdkVersion
muito provavelmente será mais altocompileSdkVersion
e 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 aumentartargetSdkVersion
para 21 para indicar que não há problema em o Android OS aplicar qualquer estilo de pirulito que possa existe no seu aplicativo.compileSdkVersion
para 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 definircompileSdkVersion
21. Como é provável que seu aplicativo funcione corretamente na API 21, é possível alterartargetSdkVersion
para 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.Como um guia oneliner:
Idealmente:
Leia mais deste ótimo post de Ian Lake
fonte
minSdkVersion
meios o menor nível de aplicativo de dispositivo APIcan
pode ser executado? Presumivelmente porque usa determinadas APIs disponíveis a partirminSdkVersion
de então?minSdkVersion
for 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)A
compileSdkVersion
deve ser a versão estável mais recente. O testetargetSdkVersion
deve ser totalmente testado e menor ou igual acompileSdkVersion
.fonte
targetSdkVersion
menor. Portanto,targetSdkVersion
deve ser o que você testou e conhece o comportamento exato e pode ser <= o último estável.compileSdkVersion
deve 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 .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:
Isso
targetSdkVersion
afeta a maneira como as permissões são solicitadas :targetSdkVersion
for 23 ou superior, o aplicativo solicitará permissões do usuário em tempo de execução.targetSdkVersion
for 22 ou inferior, o sistema solicitará que o usuário conceda as permissões quando o usuário instalar o aplicativo.Se
compileSdkVersion
for maior que a versão declarada pelo seu aplicativotargetSdkVersion
, o sistema poderá ativar comportamentos de compatibilidade para garantir que seu aplicativo continue funcionando da maneira que você espera. ( ref )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 correspondentecompileSdkVersion
, por outro lado, não precisa ser alterado, a menos que você esteja adicionando recursos exclusivos à nova versão da plataformatargetSdkVersion
muitas vezes seja (inicialmente) menor que ocompileSdkVersion
, não é incomum ver um aplicativo bem mantido / estabelecido comtargetSdkVersion > compileSdkVersion
fonte
targetSdkVersion
você poderá ver comportamentos de compatibilidade. Não acredito que tenha algo a ver com ocompileSdkVersion
.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á usandoVocê verá isso no seu
build.gradle
arquivo:targetSdkVersion:
contém as informações fornecidas pelo aplicativo APÓS o processo de desenvolvimento para a loja de aplicativos que permiteTARGET 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 .
fonte
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 :
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.
fonte
<uses-sdk>
documentação é extremamente vaga e ambígua.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".
fonte
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
compileSDKVersion
etargetSDKVersion
.fonte
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:
fonte
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
fonte
As configurações de aplicativo das propriedades de um projeto Android no Visual Studio 2017 (15.8.5) as combinam:
fonte