Quelle est la différence entre compileSdkVersion et targetSdkVersion?

525

J'ai regardé la documentation pour construire avec Gradle, mais je ne sais toujours pas quelle est la différence entre compileSdkVersionet targetSdkVersionest.

Tout ce qu'il dit est:

La compileSdkVersionpropriété spécifie la cible de compilation.

Eh bien, quelle est la "cible de compilation"?

Je vois deux façons possibles d'interpréter cela:

  1. compileSdkVersionest la version du compilateur utilisée dans la création de l'application, tandis que targetSdkVersionle "niveau API que l'application cible" . (Si tel était le cas, je suppose qu'il compileSdkVersiondoit être supérieur ou égal au targetSdkVersion?
  2. Ils signifient la même chose. "cible de compilation" == "le niveau d'API que l'application cible"
  3. Autre chose?

Je vois que cette question a déjà été posée, mais la seule réponse cite simplement le document, ce qui n'est pas clair pour moi.

coder123
la source
2
targetSdkVersion est ce que votre appareil exécute. Donc, si vos appareils sont inférieurs à Oreo, ne
visez

Réponses:

546

compileSdkVersion

C'est compileSdkVersionla version de l'API avec laquelle l'application est compilée. Cela signifie que vous pouvez utiliser les fonctionnalités d'API Android incluses dans cette version de l'API (ainsi que toutes les versions précédentes, évidemment). Si vous essayez d'utiliser les fonctionnalités de l'API 16 mais que vous la définissez compileSdkVersionsur 15, vous obtiendrez une erreur de compilation. Si vous définissez compileSdkVersionsur 16, vous pouvez toujours exécuter l'application sur un appareil API 15 tant que les chemins d'exécution de votre application n'essaient pas d'appeler des API spécifiques à API 16.

targetSdkVersion

Cela targetSdkVersionn'a rien à voir avec la façon dont votre application est compilée ou avec les API que vous pouvez utiliser. Le targetSdkVersionest censé indiquer que vous avez testé votre application sur (probablement jusqu'à et y compris) la version que vous spécifiez. Cela ressemble plus à une certification ou à une signature que vous donnez au système d'exploitation Android comme un indice de la façon dont il doit gérer votre application en termes de fonctionnalités du système d'exploitation.

Par exemple, comme l' indique la documentation :

Par exemple, la définition de cette valeur sur "11" ou supérieur permet au système d'appliquer un nouveau thème par défaut (Holo) à votre application lors de l'exécution sur Android 3.0 ou supérieur ...

Le système d'exploitation Android, au moment de l'exécution , peut changer la façon dont votre application est stylisée ou exécutée d'une autre manière dans le contexte du système d'exploitation en fonction de cette valeur. Il y a quelques autres exemples connus qui sont influencés par cette valeur et cette liste ne fera probablement qu'augmenter avec le temps.

À toutes fins pratiques, la plupart des applications voudront définir targetSdkVersionla dernière version publiée de l'API. Cela garantira que votre application est aussi belle que possible sur les appareils Android les plus récents. Si vous ne spécifiez pas le targetSdkVersion, il est par défaut le minSdkVersion.

Jeff Mixon
la source
14
Non, targetSdkVersiontrès probablement sera plus élevé compileSdkVersionet à juste titre. Cela signifie que, bien que vous ayez conçu une application pour cibler l'API 16, par exemple, elle fonctionne toujours bien sur l'API 21 (Lollipop) et vous devriez passer targetSdkVersionà 21 pour indiquer que le système d'exploitation Android peut appliquer les styles Lollipop qui peuvent existent dans votre application.
Jeff Mixon du
24
Fondamentalement, je ne comprends pas comment vous pouvez cibler un SDK supérieur au SDK que vous avez compilé.
coder123
55
Passer compileSdkVersionà une version supérieure signifierait que vous souhaitiez utiliser de nouvelles API qui ne sont incluses que dans cette version particulière. Si vous ne prévoyez pas d'utiliser des fonctionnalités spécifiques à Lollipop dans votre application, il n'y a vraiment (généralement) aucune raison de jamais définir compileSdkVersionà 21. Cependant, votre application fonctionnera probablement très bien sur API 21 en l'état, vous changez donc targetSdkVersionpour indiquer que votre application s'exécute comme prévu (cible) sur l'API 21, mais que vous n'utilisez aucune API spécifique à 21 (compiler) et que vous compileSdkVersionpouvez donc rester à 15 dans cet exemple.
Jeff Mixon
19
Un avertissement est signalé lorsque je le fais dans Android studio. J'ai "compileSdkVersion 17" et "targetSdkVersion 22" et il me dit que "targetSdkVersion ne devrait pas être supérieur à compileSdkVersion". Oh, je viens de le changer et maintenant il me dit que targetSdkVersion n'est pas le dernier 22 et que le mode de compatibilité pourrait entrer en jeu. Soupir.
Pelpotronic
18
Cette réponse contredit ce que dit Android Studio. targetSdkVersion est important et devrait être inférieur ou égal à compileSdkVersion
ARK
152

En tant que guide oneliner:

minSdkVersion <= targetSdkVersion <= compileSdkVersion

Idéalement:

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

En savoir plus sur ce super article de Ian Lake

Jimmy Kane
la source
Cela minSdkVersion signifie- t-il que l'application de niveau API de l'appareil le plus bas canfonctionne? Vraisemblablement parce qu'il utilise certaines API disponibles à minSdkVersionpartir de maintenant?
Nitin Bansal
1
@NitinBansal oui. Par exemple, si minSdkVersionest 15 (qui est ICS 4.0.3), les appareils avec API 14 (qui est ICS 4.0) ne devraient pas pouvoir installer l'application. Et au moins pour l'instant, l'application fonctionnera les 15, 16, 17, 18, 19 (20 mais c'est pour l'ancien système d'exploitation), 21, 22, 23, 24, 25, 26, 27, 28, etc. dans le futur (probablement)
Louis Tsai
33

La compileSdkVersiondernière version stable devrait être. Le targetSdkVersiondoit être entièrement testé et inférieur ou égal à compileSdkVersion.

androidwifi
la source
14
Une raison spécifique pour dire que targetSdkVersion est inférieur à compileSdkVersion? Je crois que c'est une fausse déclaration
Sufian
6
Je suppose que le fait est que la dernière version est rétrocompatible, donc la dernière version de l'API peut "se comporter" comme les anciennes, si vous définissez la targetSdkVersionsur une version inférieure. Donc, le targetSdkVersiondevrait être celui que vous avez testé et connaître le comportement exact, et peut être <= la dernière stable.
Dielson Sales
Je pense que votre déclaration " compileSdkVersiondevrait être la dernière version stable" devrait être suffixée avec "dont vous utilisez les fonctionnalités de l'API". Cela n'a aucun sens de compiler avec l'API 27 (la dernière API stable d'aujourd'hui) si vous n'utilisez que des fonctionnalités de version d'API inférieures. Cependant, la dernière version stable pourrait inclure certaines fonctionnalités qui s'améliorent automatiquement, par exemple une sécurité renforcée ou une compilation efficace avec une compatibilité descendante. Par conséquent, il est conseillé d'utiliser la dernière version stable ou au moins une version stable récente, mais elle «ne devrait [pas] être» la dernière version en soi .
Erik
27

Tard dans le jeu ... et il y a plusieurs bonnes réponses ci-dessus - essentiellement, c'est la compileSdkVersionversion de l'API avec laquelle l'application est compilée, tandis que la targetSdkVersionindique la version contre laquelle l'application a été testée.

Je voudrais compléter ces réponses par les notes suivantes:

  1. Cela a un targetSdkVersionimpact sur la manière dont les autorisations sont demandées :

    • Si l'appareil exécute Android 6.0 (API niveau 23) ou supérieur, et que l'application targetSdkVersionest de 23 ou supérieure, l'application demande des autorisations à l'utilisateur au moment de l'exécution.
    • Si l'appareil exécute Android 5.1 (niveau API 22) ou inférieur, ou que l'application targetSdkVersionest inférieure ou égale à 22, le système demande à l'utilisateur d'accorder les autorisations lorsque l'utilisateur installe l'application.
  2. Si la version compileSdkVersionest supérieure à la version déclarée par votre application targetSdkVersion, le système peut activer des comportements de compatibilité pour garantir que votre application continue de fonctionner comme prévu. ( ref )

  3. Avec chaque nouvelle version d'Android ...

    • targetSdkVersion doit être incrémenté pour correspondre au dernier niveau d'API, puis testez soigneusement votre application sur la version de plate-forme correspondante
    • compileSdkVersion, d'autre part, n'a pas besoin d'être modifié sauf si vous ajoutez des fonctionnalités exclusives à la nouvelle version de la plate-forme
    • En conséquence, bien qu'il targetSdkVersionsoit souvent (initialement) inférieur à la compileSdkVersion, il n'est pas rare de voir une application bien entretenue / établie avectargetSdkVersion > compileSdkVersion
Austin D
la source
5
Re: votre deuxième point, je ne pense pas que le document de référence le dise explicitement. Il indique: "Cependant, si le niveau d'API de la plate-forme est supérieur à la version déclarée par targetSdkVersion de votre application, le système peut activer des comportements de compatibilité pour garantir que votre application continue de fonctionner comme vous l'attendez." Je pense que cela signifie que si le niveau d'API de l'appareil sur lequel vous exécutez est plus récent que le vôtre, targetSdkVersionvous pouvez voir des comportements de compatibilité. Je ne pense pas que cela ait quoi que ce soit à voir avec compileSdkVersion.
Jeremy
20

The CompileSdkVersion est la version de la plate-forme SDK avec laquelle votre application fonctionne pour la compilation, etc. PENDANT le processus de développement (vous devez toujours utiliser la dernière version). Elle est livrée avec la version d'API que vous utilisez

entrez la description de l'image ici

Vous le verrez dans votre build.gradledossier:

entrez la description de l'image ici

targetSdkVersion:contient les informations fournies avec votre application APRÈS le processus de développement dans l'App Store qui le permet TARGET the SPECIFIED version of the Android platform. En fonction des fonctionnalités de votre application, elle peut cibler des versions d'API inférieures à la version actuelle.Par exemple, vous pouvez cibler l'API 18 même si la version actuelle est 23.

Jetez un œil à cette page officielle de Google .

Ojonugwa Jude Ochalifu
la source
9

Je vois beaucoup de différences compiledSdkVersiondans les réponses précédentes, je vais donc essayer de clarifier un peu ici, en suivant la page Web d'Android.

A - Ce que dit Android

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

Sélection d'une version de plate-forme et d'un niveau d'API Lorsque vous développez votre application, vous devrez choisir la version de plate-forme avec laquelle vous compilerez l'application. En général, vous devez compiler votre application par rapport à la version la plus basse possible de la plateforme que votre application peut prendre en charge.

Donc, ce serait le bon ordre selon Android:

compiledSdkVersion = minSdkVersion <= targetSdkVersion

B - Ce que les autres disent aussi

Certaines personnes préfèrent toujours utiliser la version compiléeSkdVersion la plus élevée disponible. C'est parce qu'ils s'appuieront sur des astuces de code pour vérifier s'ils utilisent des fonctionnalités d'API plus récentes que minSdkVersion, modifiant ainsi le code pour ne pas les utiliser ou vérifiant la version de l'API utilisateur au moment de l'exécution pour les utiliser conditionnellement avec des solutions de secours pour les anciennes versions d'API.

Des conseils sur les utilisations obsolètes apparaîtront également dans le code, vous permettant de savoir que quelque chose est obsolète dans les niveaux d'API plus récents, afin que vous puissiez réagir en conséquence si vous le souhaitez.

Donc, ce serait le bon ordre selon les autres:

minSdkVersion <= targetSdkVersion <= compiledSdkVersion (highest possible)

Que faire?

Cela dépend de vous et de votre application.

Si vous prévoyez d'offrir différentes fonctionnalités d'API en fonction du niveau d'API de l'utilisateur au moment de l'exécution, utilisez l'option B. Vous obtiendrez des conseils sur les fonctionnalités que vous utilisez lors du codage. Assurez-vous simplement de ne jamais utiliser de fonctionnalités d'API plus récentes que minSdkVersion sans vérifier le niveau de l'API utilisateur lors de l'exécution, sinon votre application se bloquera. Cette approche a également l'avantage d'apprendre les nouveautés et les anciennes lors du codage.

Si vous savez déjà ce qui est nouveau ou ancien et que vous développez une application unique qui ne sera certainement pas mise à jour, ou si vous êtes sûr de ne pas proposer de nouvelles fonctionnalités API sous condition, utilisez l'option A. Vous ne serez pas dérangé avec des indications obsolètes et vous ne pourrez jamais utiliser les nouvelles fonctionnalités de l'API même si vous êtes tenté de le faire.

CGodo
la source
2
Je ne pense pas que les conseils Android soient différents. Il y a une différence entre "compiler votre application avec la version la plus basse possible" et compiler avec une version particulière du SDK. Vous devez généralement compiler (compileSdkVersion) avec la dernière version, définir votre min (minSdkVersion) aussi bas que possible et définir votre cible (targetSdkVersion) aussi haut que possible sous réserve de tests ou d'autres problèmes de compatibilité.
Caltor
Bon point @Caltor. Je souhaite qu'ils mettent à jour ce document pour clarifier la différence. La <uses-sdk>documentation est extrêmement vague et ambiguë.
Jeremy
2

Mes 2 centimes: compilez avec n'importe quelle version du SDK mais veillez à ne pas appeler d'API que votre "version minimale du SDK" ne prend pas en charge. Cela signifie que vous "pourriez" compiler avec la dernière version du SDK.

Quant à la "version cible", elle se réfère simplement à ce que vous aviez prévu de cibler en premier lieu et que vous avez éventuellement testé. Si vous n'avez pas fait preuve de diligence raisonnable, c'est le moyen d'informer Android qu'il doit effectuer des vérifications supplémentaires avant de déployer votre application ciblée «Lollipop» sur «Oreo».

Ainsi, la "version cible" n'est évidemment pas inférieure à votre "version minimale du SDK" mais elle ne peut pas être supérieure à votre "version compilée".

pcodex
la source
1

Ne répondant pas à vos questions directes, car il y a déjà beaucoup de réponses détaillées, mais il convient de mentionner que, contrairement à la documentation Android, Android Studio suggère d'utiliser la même version pour compileSDKVersionet targetSDKVersion.

entrez la description de l'image ici

sshturma
la source
0

compiledSdkVersion ==> quelle version du SDK doit compiler votre code en bytecode (il utilise dans l'environnement de développement): il vaut mieux utiliser la dernière version du SDK.

minSdkVersion ==> cet élément utilise pour l'installation d'APK (il utilise dans l'environnement de production). Par exemple:

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

Résumé rapide:

Pour minSDKversion, voir la dernière entrée dans la poignée Twitter: https://twitter.com/minSdkVersion

TargetSDKversion: voir la dernière entrée dans la poignée Twitter: https://twitter.com/targtSdkVersion ou utilisez le dernier niveau d'API comme indiqué sur devel https://developer.android.com/guide/topics/manifest/uses-sdk-element. html

Version compilée: rendez-la identique à TargetSDKversion

maxSdkVersion: le conseil d'Android est de ne pas définir cela car vous ne voulez pas limiter votre application pour qu'elle ne fonctionne pas sur les futures versions d'Android

kush
la source
0

Les paramètres d'application des propriétés d'un projet Android dans Visual Studio 2017 (15.8.5) les combinent:

entrez la description de l'image ici

Sam est
la source