Versão mínima do SDK do Android vs. versão do SDK de destino
442
No que diz respeito ao desenvolvimento de aplicativos para Android, qual é a diferença entre as versões Min e Target SDK? O Eclipse não me permitirá criar um novo projeto, a menos que as versões Min e Target sejam iguais!
Pelo que estou lendo, parece que a versão do Target SDK não afeta a forma como seu aplicativo é compilado. É apenas para informar ao dispositivo que o aplicativo está sendo executado e que não é necessário habilitar nenhum recurso especial de compatibilidade para que seu aplicativo funcione corretamente. Isto está certo? Parece-me que você não saberia qual é a sua versão do SDK de destino até DEPOIS de compilar e fazer muitos testes. Por que o compilador não pode apenas olhar para o seu código e descobrir com quais plataformas seu aplicativo é compatível sozinho?
Michael Novello
5
O comentarista acima entendeu mal por que alguém usa o recurso targetSDK. Veja minha resposta abaixo para mais detalhes.
21811 Steve Haley
157
A resposta aceita não está correta. Por favor, leia a resposta por Steve H.
tylerl
3
@tylerl Mas não é um erro, é uma referência às documentações do Google Android. Eu não adicionei nada.
Vikas Patidar
3
A resposta de Carl é a mais detalhada e precisa na minha opinião.
Ilya Kogan #
Respostas:
136
android: minSdkVersion
Um número inteiro que designa o nível mínimo da API necessário para a execução do aplicativo. O sistema Android impedirá o usuário de instalar o aplicativo se o nível da API do sistema for menor que o valor especificado neste atributo. Você sempre deve declarar esse atributo.
android: targetSdkVersion
Um número inteiro que designa o nível da API que o aplicativo está direcionando.
Com esse conjunto de atributos, o aplicativo diz que é capaz de executar em versões mais antigas (até minSdkVersion), mas foi explicitamente testado para funcionar com a versão especificada aqui. A especificação desta versão de destino permite que a plataforma desative as configurações de compatibilidade que não são necessárias para a versão de destino (que podem ser ativadas para manter a compatibilidade com a frente) ou habilitar os recursos mais novos que não estão disponíveis para aplicativos mais antigos. Isso não significa que você pode programar recursos diferentes para diferentes versões da plataforma - simplesmente informa a plataforma que você testou em relação à versão de destino e a plataforma não deve executar nenhum trabalho extra para manter a compatibilidade com a versão de destino.
Em geral, você definirá as duas coisas para a mesma coisa. Provavelmente seria uma situação incomum configurá-los com valores diferentes.
JJB
66
Em relação ao comentário de jjb: eu discordo. Há muitas boas razões para você ter um minSDK e um targetSDK diferentes. Veja minha resposta para mais detalhes.
21811 Steve Haley
871
O comentário enviado pelo OP à pergunta (basicamente afirmando que o targetSDK não afeta a compilação de um aplicativo) está totalmente errado! Desculpe por ser franco.
Em resumo, aqui está o objetivo de declarar um targetSDK diferente do minSDK: significa que você está usando recursos de um SDK de nível superior ao mínimo, mas garantiu a compatibilidade com versões anteriores . Em outras palavras, imagine que você deseja usar um recurso que foi introduzido apenas recentemente, mas que não é crítico para o seu aplicativo. Você definiria o targetSDK para a versão em que esse novo recurso foi introduzido e o mínimo para algo mais baixo, para que todos ainda pudessem usar seu aplicativo.
Para dar um exemplo, digamos que você esteja escrevendo um aplicativo que faça amplo uso da detecção de gestos. No entanto, todo comando que pode ser reconhecido por um gesto também pode ser executado por um botão ou no menu. Nesse caso, os gestos são um 'extra legal', mas não são necessários. Portanto, você definiria o sdk de destino como 7 ("Eclair" quando a biblioteca GestureDetection foi introduzida) e o mínimo de SDK para o nível 3 ("Cupcake") para que mesmo pessoas com telefones realmente antigos possam usar seu aplicativo. Tudo o que você precisa fazer é garantir que seu aplicativo verifique a versão do Android em que estava sendo executado antes de tentar usar a biblioteca de gestos, para evitar usá-lo se ele não existir. (É certo que este é um exemplo datado, pois quase ninguém ainda tem um telefone v1.5, mas houve um tempo em que a compatibilidade com a v1 foi mantida.
Para dar outro exemplo, você pode usar isso se quiser usar um recurso do Gingerbread ou Honeycomb. Algumas pessoas receberão as atualizações em breve, mas muitas outras, principalmente em hardware mais antigo, podem ficar paralisadas com a Eclair até que comprem um novo dispositivo. Isso permitiria que você usasse alguns dos novos recursos interessantes, mas sem excluir parte do seu mercado possível.
Existe um artigo muito bom no blog do desenvolvedor do Android sobre como usar esse recurso e, em particular, como criar o código "verifique se o recurso existe antes de usá-lo" que mencionei acima.
Para o OP: escrevi isso principalmente para o benefício de quem se deparar com essa pergunta no futuro, pois percebo que sua pergunta foi feita há muito tempo.
Você poderia fornecer uma explicação precisa de como o targetSDKversion afeta a compilação do aplicativo? Como a versão de compilação é novamente outra configuração que você precisa definir. Agradecemos antecipadamente
hnviet
9
Eu acho que Steve confundiu entre o atributo xml manifesto android: targetSdkVersion (que não tem voz real) e entre a propriedade target que reside no arquivo project.properties que representa o que o código deve ser compilado. Vou dizer novamente, o xml attr targetSdkVersion não tem significado real !!!
AlikElzin-Kilaka
3
@kilaka Metade do seu comentário é válido, mas a outra metade está simplesmente errada. Eu estava assumindo que alguém usa o mesmo valor no XML e no project.properties (também acessível através de um clique com o botão direito-> propriedades no Eclipse), então você deve apontar que eles estão armazenados em locais diferentes. No entanto, o Android Market certamente se importa com o valor que você atribui ao atributo xml targetSdkVersion. Por exemplo, ele é usado para determinar se você deve ter um ActionBar ou um menu de compatibilidade para os aplicativos Honeycomb e acima.
21812 Steve Steve Haley
2
@ Nate Eu não sabia dizer quanto mais lento esse 'código complicado' torna o tempo de execução, mas acho que dividir e usar vários APKs é pior em termos de complexidade do código. Agora, lembre-se de comentar a entrada / saída ou mesclar mais ramificações em seu controle de origem antes de poder fazer cada exportação. Quando em uma conferência do Android em outubro passado, eles disseram que introduziram o sistema APK múltiplo como uma concessão, mas ficaram felizes por pouquíssimas pessoas o usarem.
21118 Steve Haley
2
Mas lidar com várias versões é para o que os sistemas de controle de versão são feitos. É com isso que os desenvolvedores estão familiarizados (a maioria dos softwares, móveis ou não, lança versões ligeiramente diferentes para plataformas diferentes). Este "recurso" do Android não está reduzindo a complexidade. É simplesmente inseri-lo no aplicativo em execução e, como evidenciado por esse segmento, cria confusão. Claro, o Google ficará feliz por poucas pessoas o usarem ... isso os ajuda a dizer: "veja, estávamos certos em fazer essa omissão em primeiro lugar". Além disso, alguns não o usam porque ainda não sabem que ele existe.
Nate
97
Ao definir targetSdkVersion = "xx", você certifica que seu aplicativo funciona corretamente (por exemplo, foi exaustivamente testado com êxito) no nível da API xx.
Uma versão do Android em execução no nível da API acima de xx aplicará o código de compatibilidade automaticamente para oferecer suporte a todos os recursos em que você possa confiar que estavam disponíveis no nível xx da API ou antes, mas que agora estão obsoletos no nível superior da versão do Android.
Por outro lado, se você estiver usando quaisquer recursos que se tornaram obsoletos no nível xx ou anterior , o código de compatibilidade não será aplicado automaticamente pelas versões do SO em níveis mais altos da API (que não incluem mais esses recursos) para dar suporte a esses usos. Nessa situação, o seu próprio código deve ter cláusulas de casos especiais que teste o nível API e, se o nível OS detectado é um superior que já não tem a determinado recurso API, seu código deve usar recursos alternativos que estão disponíveis nos executam de OS Nível da API.
Se isso não for possível, talvez alguns recursos da interface não apareçam que normalmente acionariam eventos dentro do seu código, e talvez você esteja perdendo um recurso crítico da interface que o usuário precisa para acionar esses eventos e acessar sua funcionalidade (como no exemplo abaixo).
Conforme indicado em outras respostas, você pode definir targetSdkVersion maior que minSdkVersion se desejar usar alguns recursos da API definidos inicialmente em níveis de API mais altos que o minSdkVersion e tiver tomado medidas para garantir que seu código possa detectar e manipular a ausência desses recursos em níveis mais baixos que targetSdkVersion.
Para avisar os desenvolvedores a testarem especificamente o nível mínimo de API necessário para usar um recurso, o compilador emitirá um erro (não apenas um aviso) se o código contiver uma chamada para qualquer método definido em um nível de API posterior a minSdkVersion, mesmo que targetSdkVersion seja maior ou igual ao nível da API em que esse método foi disponibilizado pela primeira vez. Para remover esse erro, a diretiva do compilador
@TargetApi(nn)
informa ao compilador que o código no escopo dessa diretiva (que precederá um método ou uma classe) foi gravado para testar um nível de API de pelo menos nn antes de chamar qualquer método que dependa de pelo menos esse nível de API . Por exemplo, o código a seguir define um método que pode ser chamado a partir do código em um aplicativo que possui uma minSdkVersion menor que 11 e uma targetSdkVersion 11 ou superior:
@TargetApi(11)publicvoid refreshActionBarIfApi11OrHigher(){//If the API is 11 or higher, set up the actionBar and display itif(Build.VERSION.SDK_INT >=11){//ActionBar only exists at API level 11 or higherActionBar actionBar = getActionBar();//This should cause onPrepareOptionsMenu() to be called.// In versions of the API prior to 11, this only occurred when the user pressed // the dedicated menu button, but at level 11 and above, the action bar is // typically displayed continuously and so you will need to call this// each time the options on your menu change.
invalidateOptionsMenu();//Show the bar
actionBar.show();}}
Você também pode declarar um targetSdkVersion mais alto se tivesse testado nesse nível mais alto e tudo funcionasse, mesmo se você não estivesse usando nenhum recurso de um nível de API superior ao seu minSdkVersion. Isso seria apenas para evitar a sobrecarga de acessar o código de compatibilidade destinado a se adaptar do nível de destino até o nível mínimo, pois você teria confirmado (por meio de testes) que essa adaptação não era necessária.
Um exemplo de um recurso de interface do usuário que depende do targetSdkVersion declarado seria o botão de menu com três pontos verticais que aparece na barra de status de aplicativos com targetSdkVersion menor que 11, quando esses aplicativos estão em execução na API 11 e superior. Se o seu aplicativo tiver uma targetSdkVersion igual ou inferior a 10, presume-se que a interface do aplicativo dependa da existência de um botão de menu dedicado e, portanto, o botão de três pontos parece substituir o hardware dedicado anterior e / ou as versões na tela desse botão (por exemplo, como visto no Gingerbread) quando o sistema operacional tiver um nível de API mais alto para o qual um botão de menu dedicado no dispositivo não será mais assumido. No entanto, se você definir o targetSdkVersion do seu aplicativo para 11 ou superior, presume-se que você tenha aproveitado os recursos introduzidos nesse nível que substituem o botão de menu dedicado (e. g., a Barra de Ação), ou que você contornou a necessidade de ter um botão de menu do sistema; consequentemente, o menu de três pontos verticais "botão de compatibilidade" desaparece. Nesse caso, se o usuário não conseguir encontrar um botão de menu, ele não poderá pressioná-lo e isso, por sua vez, significa que a substituição de onCreateOptionsMenu (menu) da sua atividade nunca poderá ser chamada, o que, por sua vez, significa que uma parte significativa da funcionalidade do seu aplicativo pode ser privada da interface do usuário. A menos, é claro, que você tenha implementado a Barra de Ação ou algum outro meio alternativo para o usuário acessar esses recursos. para encontrar um botão de menu, ela não pode pressioná-lo, e isso, por sua vez, significa que a substituição onCreateOptionsMenu (menu) da sua atividade talvez nunca seja invocada, o que, por sua vez, significa que uma parte significativa da funcionalidade do seu aplicativo pode ser privado de sua interface com o usuário. A menos, é claro, que você tenha implementado a Barra de Ação ou outro meio alternativo para o usuário acessar esses recursos. para encontrar um botão de menu, ela não pode pressioná-lo, e isso, por sua vez, significa que a substituição onCreateOptionsMenu (menu) da sua atividade talvez nunca seja invocada, o que, por sua vez, significa que uma parte significativa da funcionalidade do seu aplicativo pode ser privado de sua interface com o usuário. A menos, é claro, que você tenha implementado a Barra de Ação ou outro meio alternativo para o usuário acessar esses recursos.
O minSdkVersion, por outro lado, estabelece um requisito de que a versão do sistema operacional de um dispositivo tenha pelo menos esse nível de API para executar seu aplicativo. Isso afeta quais dispositivos podem ver e baixar seu aplicativo quando ele está na loja de aplicativos do Google Play (e possivelmente em outras lojas de aplicativos). É uma maneira de afirmar que seu aplicativo depende de recursos do SO (API ou outro) que foram estabelecidos nesse nível e não possui uma maneira aceitável de lidar com a ausência desses recursos.
Um exemplo do uso de minSdkVersion para garantir a presença de um recurso não relacionado à API seria definir minSdkVersion como 8 para garantir que seu aplicativo seja executado apenas em uma versão habilitada para JIT do interpretador Dalvik (desde que o JIT foi introduzido para o intérprete do Android no nível 8 da API). Como o desempenho de um intérprete habilitado para JIT pode ser até cinco vezes maior do que aquele que não possui esse recurso, se o aplicativo fizer uso pesado do processador, convém exigir o nível 8 ou superior da API para garantir o desempenho adequado.
Obrigado pelas instruções de uso da diretiva TargetApi.
Samir105
@Carl Isso significa que eu sempre posso definir targetSdkVersion para qualquer versão superior à minha minSdkVersion (especialmente para obter os aprimoramentos da interface do usuário) sem a necessidade de testes ( por si só ), desde que eu restrinja minha base de código para usar apenas as APIs disponíveis na minha minSdkVersion ?
Damilola Olowookere
Olowookere Emmanuel: Se eu entendi direito, então não, isso não significa isso. Como afirma minha resposta, "se você estiver usando algum recurso que se tornou obsoleto no nível xx ou anterior ao código xx, o código de compatibilidade não será aplicado automaticamente pelas versões do sistema operacional nos níveis mais altos da API". Portanto, se seu código usar um recurso que se tornou disponível no nível 8 da API, e esse recurso se tornou obsoleto no nível 10, se você elevar sua targetSdkVersion para algo acima de 10, não haverá código de compatibilidade disponível para ajustar seus usos de esse recurso para o novo nível do sistema operacional.
Carl
(Continuação): Considerando que, se você deixar o targetSdkVersion no nível 8, embora não seja possível usar os recursos introduzidos em níveis mais altos, haverá um código de compatibilidade aplicado para permitir que o uso dos recursos do nível 8 funcione quando executado em níveis mais altos do sistema operacional.
Carl
(Continuação): pense da seguinte maneira: suponha que você tenha escrito algum código quando o nível mais alto do Android disponível fosse 8 e definisse a targetSdkVersion como 8 (porque esse era o nível mais alto da época). Agora, alguns novos lançamentos do Android são lançados e alguns dos recursos de nível 8 que você usou se tornam indisponíveis. Os usuários que ainda possuem seu APK antigo não devem ter erros, devem? Portanto, para garantir que não, o código de compatibilidade é aplicado automaticamente para ajustar suas chamadas antigas da API a fazer algo razoável quando são invocadas enquanto um usuário está executando uma versão mais recente do sistema operacional.
Carl
50
Um conceito pode ser melhor entregue com exemplos, sempre . Eu tive problemas para entender esse conceito até pesquisar o código-fonte da estrutura do Android e fazer algumas experiências, mesmo depois de ler todos os documentos nos sites de desenvolvedores do Android e nos threads relacionados ao stackoverflow. Vou compartilhar dois exemplos que me ajudaram muito a entender completamente esses conceitos.
Um DatePickerDialog terá uma aparência diferente com base no nível que você coloca no targetSDKversion ( <uses-sdk android:targetSdkVersion="INTEGER_VALUE"/>) do arquivo AndroidManifest.xml . Se você definir o valor 10 ou menos, seu DatePickerDialog será semelhante à esquerda. Por outro lado, se você definir o valor 11 ou superior, um DatePickerDialog parecerá correto, com o mesmo código .
O código que eu usei para criar este exemplo é super simples. MainActivity.javaparece :
publicclassMainActivityextendsActivity{@Overrideprotectedvoid onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);}publicvoid onClickButton(View v){DatePickerDialog d =newDatePickerDialog(this,null,2014,5,4);
d.show();}}
Como você pode ver, a estrutura obtém o targetSDKversion atual e define um tema diferente. Esse tipo de trecho de código ( getApplicationInfo().targetSdkVersion >= SOME_VERSION) pode ser encontrado aqui e ali na estrutura do Android.
Outro exemplo é sobre a classe WebView . Os métodos públicos da classe Webview devem ser chamados no thread principal e, se não, o sistema de tempo de execução lança a RuntimeException, quando você define o targetSDKversion 18 ou superior. Esse comportamento pode ser claramente entregue com seu código-fonte . Está escrito assim.
O documento do Android diz: " À medida que o Android evolui a cada nova versão, alguns comportamentos e até aparências podem mudar ". Então, observamos mudanças de comportamento e aparência, e como essa mudança é realizada.
Em resumo, o documento do Android diz " Este atributo (targetSdkVersion) informa o sistema que você testou em relação à versão de destino e o sistema não deve permitir nenhum comportamento de compatibilidade para manter a compatibilidade direta do aplicativo com a versão de destino ". Isso é realmente claro no caso do WebView. Não havia problema até JELLY_BEAN_MR2 ser liberado para chamar o método público da classe WebView no thread não principal. Não faz sentido se a estrutura do Android lança uma RuntimeException nos dispositivos JELLY_BEAN_MR2. Apenas não deve permitir comportamentos recém-introduzidos para o seu interesse, que causam resultados fatais. Portanto, o que precisamos fazer é verificar se está tudo bem em determinadas versões do targetSDK. Temos benefícios como aprimoramento da aparência ao definir targetSDKversion mais alto,
EDIT: isenção de responsabilidade. O construtor DatePickerDialog que definiu temas diferentes com base no targetSDKversion atual (que mostrei acima) na verdade foi alterado no commit posterior . No entanto, usei esse exemplo, porque a lógica não foi alterada e esses trechos de código mostram claramente o conceito targetSDKversion.
"Obtemos benefícios como aprimoramento da aparência ao definir um targetSDKversion mais alto, mas isso é responsabilidade." Se eles tivessem mencionado essa linha nos documentos, eu não a procuraria.
Pulp_fiction
@ 김준호 Eu tenho duas perguntas: 1.) No exemplo do datepicker acima, se você definiu o targetSdkVersion para 10 ou menos e executou o aplicativo em um dispositivo com o Android mais recente (por exemplo, API 22), o datepicker ainda será exibido como o antigo na foto da esquerda? 2.) Significa que eu sempre posso definir targetSdkVersion para qualquer versão superior à minha minSdkVersion (por exemplo, para obter aprimoramentos na interface do usuário como o datepicker crocante de APIs mais altas) sem a necessidade de qualquer teste ( por si só ), desde que eu restrinja minha base de código usar apenas APIs disponíveis na minha minSdkVersion?
Damilola Olowookere
@Olowookere 1) Sim. Apenas corra para isso. 2) Você pode definir targetSDKVersion como preferir, se for maior que minSDKVersion. Mas você ainda precisa testar se funciona bem na versão direcionada. Não importa se você adere à minSDKVersion api ou não. Pense no exemplo do DatePicker.
김준호
Pense em um caso em que você definiu a versão mínima 14 e a versão sdk de destino como 16, e você só usou APIs para 14 ou menos. Digamos que você tenha usado o TextView, que é introduzido no nível 1. da API. O que aconteceria?
김준호
@ 김준호 Obrigado. Mas, para sua segunda resposta, estou confuso. Se meu código usa apenas a API no minSdkVersion e eu tenho como alvo um SDK mais alto, por que preciso testar? Pensando no exemplo do DatePicker, o alto targetSdkVersion apenas melhorou a aparência do widget DatePicker e nada quebra porque eu não usei nenhum código na API maior que o minSdkVersion. Eu só quero maior targetSdkVersion porque quero que a nova aparência de widgets, não que eu quero usar novos recursos introduzidos em maior API
Damilola Olowookere
21
Para quem quer um resumo,
android:minSdkVersion
é a versão mínima até que seu aplicativo seja compatível. Se o seu dispositivo tiver uma versão inferior do Android, o aplicativo não será instalado.
enquanto,
android:targetSdkVersion
é o nível da API até o qual seu aplicativo foi projetado para execução. Significa que o sistema do seu telefone não precisa usar nenhum comportamento de compatibilidade para manter a compatibilidade direta porque você testou até essa API.
Seu aplicativo ainda será executado em versões do Android mais altas do que as fornecidas, targetSdkVersionmas o comportamento de compatibilidade com o Android será ativado.
Freebie -
android:maxSdkVersion
se a versão da API do seu dispositivo for superior, o aplicativo não será instalado. Ou seja. essa é a API máxima até a qual você permite que seu aplicativo seja instalado.
ie para MinSDK -4, maxSDK - 8, targetSDK - 8 Meu aplicativo funcionará no mínimo 1.6, mas também usei recursos suportados apenas no 2.2, que serão visíveis se estiverem instalados em um dispositivo 2.2. Além disso, para maxSDK - 8, este aplicativo não será instalado em telefones usando API> 8.
No momento em que escrevemos esta resposta, a documentação do Android não estava fazendo um excelente trabalho ao explicá-la. Agora está muito bem explicado. Veja aqui
'é a versão máxima de onde o aplicativo herdou recursos.' : isto está errado. É a versão mínima de onde o aplicativo herdou recursos - ou seja, a primeira versão que inclui os recursos necessários utilizados pelo aplicativo.
RichieHH
Inglês é uma linguagem complicada. Leia meu exemplo dado na resposta. Suponho que estou fazendo sentido lá. :)
Darpan
Não estou sendo pedante e o inglês é o idioma de suporte deste grupo. Complicado ou não dizer que é a "versão máxima em que o aplicativo suporta recursos" não está apenas errado: está totalmente errado em 180 graus. É a PRIMEIRA ou a versão mínima que suporta todos os recursos pretendidos do seu aplicativo sem usar os modos / bibliotecas de compatibilidade de fallback.
18714 RichieHH
9
Se você receber alguns erros de compilação, por exemplo:
privatevoid methodThatRequiresAPI11(){BitmapFactory.Options options =newBitmapFactory.Options();
options.inPreferredConfig =Config.ARGB_8888;// API Level 1
options.inSampleSize =8;// API Level 1
options.inBitmap = bitmap;// **API Level 11**//...}
Você recebe um erro de compilação:
O campo requer o nível 11 da API (o mínimo atual é 10): android.graphics.BitmapFactory $ Options # inBitmap
Desde a versão 17 do Android Development Tools (ADT), há uma anotação nova e muito útil @TargetApique pode corrigir isso com muita facilidade. Adicione-o antes do método que está encerrando a declaração problemática:
@TargetApiprivatevoid methodThatRequiresAPI11(){BitmapFactory.Options options =newBitmapFactory.Options();
options.inPreferredConfig =Config.ARGB_8888;// API Level 1
options.inSampleSize =8;// API Level 1// This will avoid exception NoSuchFieldError (or NoSuchMethodError) at runtime. if(Integer.valueOf(android.os.Build.VERSION.SDK)>= android.os.Build.VERSION_CODES.HONEYCOMB){
options.inBitmap = bitmap;// **API Level 11**//...}}
Não há erros de compilação agora e ele será executado!
EDIT: Isso resultará em erro de tempo de execução no nível da API menor que 11. Em 11 ou superior, ele será executado sem problemas. Portanto, certifique-se de chamar esse método em um caminho de execução protegido pela verificação de versão. O TargetApi apenas permite compilá-lo, mas você o executa por sua conta e risco.
Estou confuso sobre isso. O que acontecerá se você executar seu aplicativo posteriormente em um sistema com sdk 10?
22612 Fran Marzoa
Ele executará a instrução options.inBitmap e o aplicativo deve funcionar bem.
NinjaCoder
1
android:minSdkVersione android:targetSdkVersionambos são um valor inteiro que precisamos declarar no arquivo de manifesto do Android, mas ambos têm propriedades diferentes.
android:minSdkVersion:Este é o nível mínimo necessário da API para executar um aplicativo Android. Se instalarmos o mesmo aplicativo na versão mais baixa da API, o erro do analisador será exibido e o problema de aplicativo não suportado será exibido.
android:targetSdkVersion:A versão sdk de destino é definir o nível de aplicativo da API de destino. se esse atributo não for declarado no manifesto, a versão minSdk será sua versão do TargetSdk. Sempre é verdade que "a instalação de suporte a aplicativos em todas as versões superiores da API que declaramos como TargetSdk Version". Para tornar o aplicativo limitado, precisamos declarar maxSdkVersion em nosso arquivo de manifesto ...
Se você estiver criando aplicativos que exijam permissões perigosas e defina targetSDK como 23 ou superior , tenha cuidado. Se você não verificar as permissões no tempo de execução, receberá uma SecurityException e, se estiver usando código dentro de um bloco try, por exemplo, abrir a câmera, poderá ser difícil detectar erros se você não verificar o logcat.
Respostas:
Um número inteiro que designa o nível mínimo da API necessário para a execução do aplicativo. O sistema Android impedirá o usuário de instalar o aplicativo se o nível da API do sistema for menor que o valor especificado neste atributo. Você sempre deve declarar esse atributo.
Um número inteiro que designa o nível da API que o aplicativo está direcionando.
Com esse conjunto de atributos, o aplicativo diz que é capaz de executar em versões mais antigas (até minSdkVersion), mas foi explicitamente testado para funcionar com a versão especificada aqui. A especificação desta versão de destino permite que a plataforma desative as configurações de compatibilidade que não são necessárias para a versão de destino (que podem ser ativadas para manter a compatibilidade com a frente) ou habilitar os recursos mais novos que não estão disponíveis para aplicativos mais antigos. Isso não significa que você pode programar recursos diferentes para diferentes versões da plataforma - simplesmente informa a plataforma que você testou em relação à versão de destino e a plataforma não deve executar nenhum trabalho extra para manter a compatibilidade com a versão de destino.
Para mais informações, consulte este URL:
http://developer.android.com/guide/topics/manifest/uses-sdk-element.html
fonte
O comentário enviado pelo OP à pergunta (basicamente afirmando que o targetSDK não afeta a compilação de um aplicativo) está totalmente errado! Desculpe por ser franco.
Em resumo, aqui está o objetivo de declarar um targetSDK diferente do minSDK: significa que você está usando recursos de um SDK de nível superior ao mínimo, mas garantiu a compatibilidade com versões anteriores . Em outras palavras, imagine que você deseja usar um recurso que foi introduzido apenas recentemente, mas que não é crítico para o seu aplicativo. Você definiria o targetSDK para a versão em que esse novo recurso foi introduzido e o mínimo para algo mais baixo, para que todos ainda pudessem usar seu aplicativo.
Para dar um exemplo, digamos que você esteja escrevendo um aplicativo que faça amplo uso da detecção de gestos. No entanto, todo comando que pode ser reconhecido por um gesto também pode ser executado por um botão ou no menu. Nesse caso, os gestos são um 'extra legal', mas não são necessários. Portanto, você definiria o sdk de destino como 7 ("Eclair" quando a biblioteca GestureDetection foi introduzida) e o mínimo de SDK para o nível 3 ("Cupcake") para que mesmo pessoas com telefones realmente antigos possam usar seu aplicativo. Tudo o que você precisa fazer é garantir que seu aplicativo verifique a versão do Android em que estava sendo executado antes de tentar usar a biblioteca de gestos, para evitar usá-lo se ele não existir. (É certo que este é um exemplo datado, pois quase ninguém ainda tem um telefone v1.5, mas houve um tempo em que a compatibilidade com a v1 foi mantida.
Para dar outro exemplo, você pode usar isso se quiser usar um recurso do Gingerbread ou Honeycomb. Algumas pessoas receberão as atualizações em breve, mas muitas outras, principalmente em hardware mais antigo, podem ficar paralisadas com a Eclair até que comprem um novo dispositivo. Isso permitiria que você usasse alguns dos novos recursos interessantes, mas sem excluir parte do seu mercado possível.
Existe um artigo muito bom no blog do desenvolvedor do Android sobre como usar esse recurso e, em particular, como criar o código "verifique se o recurso existe antes de usá-lo" que mencionei acima.
Para o OP: escrevi isso principalmente para o benefício de quem se deparar com essa pergunta no futuro, pois percebo que sua pergunta foi feita há muito tempo.
fonte
Ao definir targetSdkVersion = "xx", você certifica que seu aplicativo funciona corretamente (por exemplo, foi exaustivamente testado com êxito) no nível da API xx.
Uma versão do Android em execução no nível da API acima de xx aplicará o código de compatibilidade automaticamente para oferecer suporte a todos os recursos em que você possa confiar que estavam disponíveis no nível xx da API ou antes, mas que agora estão obsoletos no nível superior da versão do Android.
Por outro lado, se você estiver usando quaisquer recursos que se tornaram obsoletos no nível xx ou anterior , o código de compatibilidade não será aplicado automaticamente pelas versões do SO em níveis mais altos da API (que não incluem mais esses recursos) para dar suporte a esses usos. Nessa situação, o seu próprio código deve ter cláusulas de casos especiais que teste o nível API e, se o nível OS detectado é um superior que já não tem a determinado recurso API, seu código deve usar recursos alternativos que estão disponíveis nos executam de OS Nível da API.
Se isso não for possível, talvez alguns recursos da interface não apareçam que normalmente acionariam eventos dentro do seu código, e talvez você esteja perdendo um recurso crítico da interface que o usuário precisa para acionar esses eventos e acessar sua funcionalidade (como no exemplo abaixo).
Conforme indicado em outras respostas, você pode definir targetSdkVersion maior que minSdkVersion se desejar usar alguns recursos da API definidos inicialmente em níveis de API mais altos que o minSdkVersion e tiver tomado medidas para garantir que seu código possa detectar e manipular a ausência desses recursos em níveis mais baixos que targetSdkVersion.
Para avisar os desenvolvedores a testarem especificamente o nível mínimo de API necessário para usar um recurso, o compilador emitirá um erro (não apenas um aviso) se o código contiver uma chamada para qualquer método definido em um nível de API posterior a minSdkVersion, mesmo que targetSdkVersion seja maior ou igual ao nível da API em que esse método foi disponibilizado pela primeira vez. Para remover esse erro, a diretiva do compilador
informa ao compilador que o código no escopo dessa diretiva (que precederá um método ou uma classe) foi gravado para testar um nível de API de pelo menos nn antes de chamar qualquer método que dependa de pelo menos esse nível de API . Por exemplo, o código a seguir define um método que pode ser chamado a partir do código em um aplicativo que possui uma minSdkVersion menor que 11 e uma targetSdkVersion 11 ou superior:
Você também pode declarar um targetSdkVersion mais alto se tivesse testado nesse nível mais alto e tudo funcionasse, mesmo se você não estivesse usando nenhum recurso de um nível de API superior ao seu minSdkVersion. Isso seria apenas para evitar a sobrecarga de acessar o código de compatibilidade destinado a se adaptar do nível de destino até o nível mínimo, pois você teria confirmado (por meio de testes) que essa adaptação não era necessária.
Um exemplo de um recurso de interface do usuário que depende do targetSdkVersion declarado seria o botão de menu com três pontos verticais que aparece na barra de status de aplicativos com targetSdkVersion menor que 11, quando esses aplicativos estão em execução na API 11 e superior. Se o seu aplicativo tiver uma targetSdkVersion igual ou inferior a 10, presume-se que a interface do aplicativo dependa da existência de um botão de menu dedicado e, portanto, o botão de três pontos parece substituir o hardware dedicado anterior e / ou as versões na tela desse botão (por exemplo, como visto no Gingerbread) quando o sistema operacional tiver um nível de API mais alto para o qual um botão de menu dedicado no dispositivo não será mais assumido. No entanto, se você definir o targetSdkVersion do seu aplicativo para 11 ou superior, presume-se que você tenha aproveitado os recursos introduzidos nesse nível que substituem o botão de menu dedicado (e. g., a Barra de Ação), ou que você contornou a necessidade de ter um botão de menu do sistema; consequentemente, o menu de três pontos verticais "botão de compatibilidade" desaparece. Nesse caso, se o usuário não conseguir encontrar um botão de menu, ele não poderá pressioná-lo e isso, por sua vez, significa que a substituição de onCreateOptionsMenu (menu) da sua atividade nunca poderá ser chamada, o que, por sua vez, significa que uma parte significativa da funcionalidade do seu aplicativo pode ser privada da interface do usuário. A menos, é claro, que você tenha implementado a Barra de Ação ou algum outro meio alternativo para o usuário acessar esses recursos. para encontrar um botão de menu, ela não pode pressioná-lo, e isso, por sua vez, significa que a substituição onCreateOptionsMenu (menu) da sua atividade talvez nunca seja invocada, o que, por sua vez, significa que uma parte significativa da funcionalidade do seu aplicativo pode ser privado de sua interface com o usuário. A menos, é claro, que você tenha implementado a Barra de Ação ou outro meio alternativo para o usuário acessar esses recursos. para encontrar um botão de menu, ela não pode pressioná-lo, e isso, por sua vez, significa que a substituição onCreateOptionsMenu (menu) da sua atividade talvez nunca seja invocada, o que, por sua vez, significa que uma parte significativa da funcionalidade do seu aplicativo pode ser privado de sua interface com o usuário. A menos, é claro, que você tenha implementado a Barra de Ação ou outro meio alternativo para o usuário acessar esses recursos.
O minSdkVersion, por outro lado, estabelece um requisito de que a versão do sistema operacional de um dispositivo tenha pelo menos esse nível de API para executar seu aplicativo. Isso afeta quais dispositivos podem ver e baixar seu aplicativo quando ele está na loja de aplicativos do Google Play (e possivelmente em outras lojas de aplicativos). É uma maneira de afirmar que seu aplicativo depende de recursos do SO (API ou outro) que foram estabelecidos nesse nível e não possui uma maneira aceitável de lidar com a ausência desses recursos.
Um exemplo do uso de minSdkVersion para garantir a presença de um recurso não relacionado à API seria definir minSdkVersion como 8 para garantir que seu aplicativo seja executado apenas em uma versão habilitada para JIT do interpretador Dalvik (desde que o JIT foi introduzido para o intérprete do Android no nível 8 da API). Como o desempenho de um intérprete habilitado para JIT pode ser até cinco vezes maior do que aquele que não possui esse recurso, se o aplicativo fizer uso pesado do processador, convém exigir o nível 8 ou superior da API para garantir o desempenho adequado.
fonte
Um conceito pode ser melhor entregue com exemplos, sempre . Eu tive problemas para entender esse conceito até pesquisar o código-fonte da estrutura do Android e fazer algumas experiências, mesmo depois de ler todos os documentos nos sites de desenvolvedores do Android e nos threads relacionados ao stackoverflow. Vou compartilhar dois exemplos que me ajudaram muito a entender completamente esses conceitos.
Um DatePickerDialog terá uma aparência diferente com base no nível que você coloca no targetSDKversion (
<uses-sdk android:targetSdkVersion="INTEGER_VALUE"/>
) do arquivo AndroidManifest.xml . Se você definir o valor 10 ou menos, seu DatePickerDialog será semelhante à esquerda. Por outro lado, se você definir o valor 11 ou superior, um DatePickerDialog parecerá correto, com o mesmo código .O código que eu usei para criar este exemplo é super simples.
MainActivity.java
parece :E
activity_main.xml
olha:É isso aí. Esse é realmente todo código que eu preciso para testar isso.
E essa mudança na aparência é clara quando você vê o código-fonte da estrutura do Android . É assim:
Como você pode ver, a estrutura obtém o targetSDKversion atual e define um tema diferente. Esse tipo de trecho de código (
getApplicationInfo().targetSdkVersion >= SOME_VERSION
) pode ser encontrado aqui e ali na estrutura do Android.Outro exemplo é sobre a classe WebView . Os métodos públicos da classe Webview devem ser chamados no thread principal e, se não, o sistema de tempo de execução lança a
RuntimeException
, quando você define o targetSDKversion 18 ou superior. Esse comportamento pode ser claramente entregue com seu código-fonte . Está escrito assim.O documento do Android diz: " À medida que o Android evolui a cada nova versão, alguns comportamentos e até aparências podem mudar ". Então, observamos mudanças de comportamento e aparência, e como essa mudança é realizada.
Em resumo, o documento do Android diz " Este atributo (targetSdkVersion) informa o sistema que você testou em relação à versão de destino e o sistema não deve permitir nenhum comportamento de compatibilidade para manter a compatibilidade direta do aplicativo com a versão de destino ". Isso é realmente claro no caso do WebView. Não havia problema até JELLY_BEAN_MR2 ser liberado para chamar o método público da classe WebView no thread não principal. Não faz sentido se a estrutura do Android lança uma RuntimeException nos dispositivos JELLY_BEAN_MR2. Apenas não deve permitir comportamentos recém-introduzidos para o seu interesse, que causam resultados fatais. Portanto, o que precisamos fazer é verificar se está tudo bem em determinadas versões do targetSDK. Temos benefícios como aprimoramento da aparência ao definir targetSDKversion mais alto,
EDIT: isenção de responsabilidade. O construtor DatePickerDialog que definiu temas diferentes com base no targetSDKversion atual (que mostrei acima) na verdade foi alterado no commit posterior . No entanto, usei esse exemplo, porque a lógica não foi alterada e esses trechos de código mostram claramente o conceito targetSDKversion.
fonte
Para quem quer um resumo,
é a versão mínima até que seu aplicativo seja compatível. Se o seu dispositivo tiver uma versão inferior do Android, o aplicativo não será instalado.
enquanto,
é o nível da API até o qual seu aplicativo foi projetado para execução. Significa que o sistema do seu telefone não precisa usar nenhum comportamento de compatibilidade para manter a compatibilidade direta porque você testou até essa API.
Seu aplicativo ainda será executado em versões do Android mais altas do que as fornecidas,
targetSdkVersion
mas o comportamento de compatibilidade com o Android será ativado.Freebie -
android:maxSdkVersion
se a versão da API do seu dispositivo for superior, o aplicativo não será instalado. Ou seja. essa é a API máxima até a qual você permite que seu aplicativo seja instalado.
ie para MinSDK -4, maxSDK - 8, targetSDK - 8 Meu aplicativo funcionará no mínimo 1.6, mas também usei recursos suportados apenas no 2.2, que serão visíveis se estiverem instalados em um dispositivo 2.2. Além disso, para maxSDK - 8, este aplicativo não será instalado em telefones usando API> 8.
No momento em que escrevemos esta resposta, a documentação do Android não estava fazendo um excelente trabalho ao explicá-la. Agora está muito bem explicado. Veja aqui
fonte
Se você receber alguns erros de compilação, por exemplo:
.
Você recebe um erro de compilação:
Desde a versão 17 do Android Development Tools (ADT), há uma anotação nova e muito útil
@TargetApi
que pode corrigir isso com muita facilidade. Adicione-o antes do método que está encerrando a declaração problemática:Não há erros de compilação agora
e ele será executado!EDIT: Isso resultará em erro de tempo de execução no nível da API menor que 11. Em 11 ou superior, ele será executado sem problemas. Portanto, certifique-se de chamar esse método em um caminho de execução protegido pela verificação de versão. O TargetApi apenas permite compilá-lo, mas você o executa por sua conta e risco.
fonte
android:minSdkVersion
eandroid:targetSdkVersion
ambos são um valor inteiro que precisamos declarar no arquivo de manifesto do Android, mas ambos têm propriedades diferentes.android:minSdkVersion:
Este é o nível mínimo necessário da API para executar um aplicativo Android. Se instalarmos o mesmo aplicativo na versão mais baixa da API, o erro do analisador será exibido e o problema de aplicativo não suportado será exibido.android:targetSdkVersion:
A versão sdk de destino é definir o nível de aplicativo da API de destino. se esse atributo não for declarado no manifesto, a versão minSdk será sua versão do TargetSdk. Sempre é verdade que "a instalação de suporte a aplicativos em todas as versões superiores da API que declaramos como TargetSdk Version". Para tornar o aplicativo limitado, precisamos declarar maxSdkVersion em nosso arquivo de manifesto ...fonte
Se você estiver criando aplicativos que exijam permissões perigosas e defina targetSDK como 23 ou superior , tenha cuidado. Se você não verificar as permissões no tempo de execução, receberá uma SecurityException e, se estiver usando código dentro de um bloco try, por exemplo, abrir a câmera, poderá ser difícil detectar erros se você não verificar o logcat.
fonte
Target sdk é a versão que você deseja segmentar e min sdk é a versão mínima.
fonte