Was ist der Unterschied zwischen compileSdkVersion und targetSdkVersion?

525

Ich habe mir die Dokumentation zum Erstellen mit Gradle angesehen, bin mir aber immer noch nicht sicher, was der Unterschied zwischen compileSdkVersionund targetSdkVersionist.

Alles was es sagt ist:

Die compileSdkVersionEigenschaft gibt das Kompilierungsziel an.

Was ist das "Kompilierungsziel"?

Ich sehe zwei Möglichkeiten, dies zu interpretieren:

  1. compileSdkVersionist die Version des Compilers, der beim Erstellen der App verwendet wird, während targetSdkVersiones sich um die "API-Ebene handelt, auf die die Anwendung abzielt" . (Wenn dies der Fall wäre, würde ich annehmen, compileSdkVersiondass größer oder gleich dem sein muss targetSdkVersion?
  2. Sie bedeuten dasselbe. "Kompilierungsziel" == "Die API-Ebene, auf die die Anwendung abzielt"
  3. Etwas anderes?

Ich sehe, dass diese Frage schon einmal gestellt wurde, aber die eine Antwort zitiert nur das Dokument, was mir unklar ist.

coder123
quelle
2
targetSdkVersion ist das, was auf Ihrem Gerät ausgeführt wird. Also, wenn Ihre Geräte niedriger als Oreo laufen, dann zielen Sie nicht auf 27.
IgorGanapolsky

Antworten:

546

compileSdkVersion

Dies compileSdkVersionist die Version der API, für die die App kompiliert wird. Dies bedeutet, dass Sie die in dieser API-Version enthaltenen Android-API-Funktionen (sowie natürlich alle früheren Versionen) verwenden können. Wenn Sie versuchen, API 16-Funktionen zu verwenden, diese jedoch compileSdkVersionauf 15 eingestellt sind, wird ein Kompilierungsfehler angezeigt. Wenn Sie compileSdkVersion16 festlegen , können Sie die App weiterhin auf einem API 15-Gerät ausführen, solange die Ausführungspfade Ihrer App nicht versuchen, APIs aufzurufen, die für API 16 spezifisch sind.

targetSdkVersion

Das targetSdkVersionhat nichts damit zu tun, wie Ihre App kompiliert wird oder welche APIs Sie verwenden können. Das targetSdkVersionsoll anzeigen, dass Sie Ihre App auf (vermutlich bis einschließlich) der von Ihnen angegebenen Version getestet haben. Dies ist eher eine Zertifizierung oder Abmeldung, die Sie dem Android-Betriebssystem als Hinweis darauf geben, wie es mit Ihrer App in Bezug auf die Betriebssystemfunktionen umgehen soll.

Zum Beispiel, wie in der Dokumentation angegeben :

Wenn Sie diesen Wert beispielsweise auf "11" oder höher setzen, kann das System unter Android 3.0 oder höher ein neues Standarddesign (Holo) auf Ihre App anwenden ...

Das Android-Betriebssystem kann zur Laufzeit ändern, wie Ihre App im Kontext des Betriebssystems basierend auf diesem Wert stilisiert oder anderweitig ausgeführt wird. Es gibt einige andere bekannte Beispiele, die von diesem Wert beeinflusst werden, und diese Liste wird wahrscheinlich nur mit der Zeit zunehmen.

Für alle praktischen Zwecke möchten die meisten Apps targetSdkVersiondie neueste veröffentlichte Version der API verwenden. Dadurch wird sichergestellt, dass Ihre App auf den neuesten Android-Geräten so gut wie möglich aussieht. Wenn Sie das nicht angeben targetSdkVersion, wird standardmäßig das verwendet minSdkVersion.

Jeff Mixon
quelle
14
Nein, targetSdkVersionsehr wahrscheinlich höher als compileSdkVersionund zu Recht. Dies bedeutet, dass Sie zwar eine App für die API 16 entwickelt haben, diese jedoch unter API 21 (Lollipop) weiterhin einwandfrei funktioniert. Sie sollten die App auf 21 erhöhen targetSdkVersion, um anzuzeigen, dass das Android-Betriebssystem alle möglichen Lollipop-Stile anwenden kann existieren zu Ihrer App.
Jeff Mixon
24
Grundsätzlich verstehe ich nicht, wie Sie ein höheres SDK als das SDK, gegen das Sie kompiliert haben, als Ziel festlegen können.
coder123
55
Wenn Sie compileSdkVersionzu einer höheren Version wechseln , möchten Sie einige neue APIs verwenden, die nur in dieser bestimmten Version enthalten sind. Wenn Sie nicht vorhaben, Lollipop-spezifische Funktionen in Ihrer App zu verwenden, gibt es (normalerweise) keinen Grund, jemals compileSdkVersionauf 21 zu setzen . Ihre App wird jedoch wahrscheinlich so wie sie ist auf API 21 einwandfrei ausgeführt, sodass Sie Änderungen vornehmen targetSdkVersionzu zeigen , um Ihre Anwendung läuft , wie Sie (Ziel) erwarten auf API 21, aber Sie sind keine spezifische APIs 21 (Kompilierung) verwenden und somit Ihre compileSdkVersionDose Aufenthalt bei 15 in diesem Beispiel.
Jeff Mixon
19
Eine Warnung wird gemeldet, wenn ich das in Android Studio mache. Ich habe "compileSdkVersion 17" und "targetSdkVersion 22" und es sagt mir, dass "targetSdkVersion nicht höher als compileSdkVersion sein sollte". Oh, habe es gerade geändert und jetzt sagt es mir, dass die targetSdkVersion nicht die neueste 22 ist und dass der Kompatibilitätsmodus möglicherweise aktiviert wird. Seufz.
Pelpotronic
18
Diese Antwort widerspricht dem, was das Android Studio sagt. targetSdkVersion ist wichtig und sollte kleiner oder gleich compileSdkVersion sein
ARK
152

Als Oneliner-Leitfaden:

minSdkVersion <= targetSdkVersion <= compileSdkVersion

Im Idealfall:

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

Lesen Sie mehr aus diesem großartigen Beitrag von Ian Lake

Jimmy Kane
quelle
Bedeutet dies, minSdkVersion dass die App mit der niedrigsten Geräte-API-Ebene canausgeführt wird? Vermutlich, weil bestimmte APIs verwendet werden, die ab sofort minSdkVersionverfügbar sind?
Nitin Bansal
1
@ NitinBansal ja. Wenn beispielsweise minSdkVersion15 (ICS 4.0.3) ist, sollten Geräte mit API 14 (ICS 4.0) die App nicht installieren können. Und zumindest für den Moment läuft die App auf 15, 16, 17, 18, 19 (20, aber das ist für das alte Wear OS), 21, 22, 23, 24, 25, 26, 27, 28 und so weiter in der Zukunft (wahrscheinlich)
Louis Tsai
33

Das compileSdkVersionsollte die neueste stabile Version sein. Die targetSdkVersionsollten vollständig getestet werden und kleiner oder gleich sein compileSdkVersion.

androidwifi
quelle
14
Gibt es einen bestimmten Grund zu sagen, dass targetSdkVersion kleiner als compileSdkVersion ist? Ich glaube, es ist eine falsche Aussage
Sufian
6
Ich denke, der Punkt ist, dass die letzte Version abwärtskompatibel ist, so dass sich die neueste API-Version wie ältere "verhalten" kann, wenn Sie die targetSdkVersionauf eine niedrigere setzen. Das targetSdkVersionsollte also das sein, das Sie getestet haben und das genaue Verhalten kennen, und kann <= der neueste Stall sein.
Dielson Sales
Ich denke, dass Ihre Aussage " compileSdkVersionsollte die neueste stabile Version sein" mit dem Zusatz "von dem Sie API-Funktionen verwenden" versehen werden sollte. Es ist nicht sinnvoll, mit API 27 (der neuesten stabilen API von heute) zu kompilieren, wenn Sie nur Funktionen mit niedrigeren API-Versionen verwenden. Die neueste stabile Version kann jedoch einige Funktionen enthalten, die automatisch verbessert werden, z. B. verbesserte Sicherheit oder effiziente Kompilierung mit Abwärtskompatibilität. Daher ist es ratsam, die neueste oder zumindest eine aktuelle stabile Version zu verwenden, aber es sollte [nicht] die neueste Version an sich sein .
Erik
27

Spät zum Spiel ... und es gibt oben einige großartige Antworten - im Wesentlichen, dass dies die compileSdkVersionVersion der API ist, gegen die die App kompiliert wurde, während die targetSdkVersiondie Version angibt, gegen die die App getestet wurde.

Ich möchte diese Antworten mit folgenden Anmerkungen ergänzen:

  1. Das targetSdkVersion wirkt sich auf die Art und Weise aus, in der Berechtigungen angefordert werden :

    • Wenn auf dem Gerät Android 6.0 (API-Level 23) oder höher ausgeführt wird, und die App targetSdkVersion23 oder höher ist, fordert die App zur Laufzeit vom Benutzer Berechtigungen an.
    • Wenn auf dem Gerät Android 5.1 (API-Level 22) oder niedriger oder die App ausgeführt wirdtargetSdkVersion 22 oder niedriger ist, fordert das System den Benutzer auf, die Berechtigungen zu erteilen, wenn der Benutzer die App installiert.
  2. Wenn das compileSdkVersionhöher ist als die von Ihrer App deklarierte VersiontargetSdkVersion , kann das System Kompatibilitätsverhalten aktivieren, um sicherzustellen, dass Ihre App weiterhin wie erwartet funktioniert. ( ref )

  3. Mit jeder neuen Android-Version ...

    • targetSdkVersion sollte inkrementiert werden, um der neuesten API-Ebene zu entsprechen, und testen Sie Ihre Anwendung anschließend gründlich auf der entsprechenden Plattformversion
    • compileSdkVersionAndererseits muss es nicht geändert werden, es sei denn, Sie fügen Funktionen hinzu, die exklusiv für die neue Plattformversion gelten
    • Infolgedessen targetSdkVersionist compileSdkVersiones nicht ungewöhnlich, eine gut gewartete / etablierte App mit zu sehen , obwohl sie oft (anfangs) kleiner als die isttargetSdkVersion > compileSdkVersion
Austin D.
quelle
5
Betreff: Ihr zweiter Punkt, ich glaube nicht, dass das Referenzdokument dies ausdrücklich sagt. Darin heißt es: "Wenn die API-Ebene der Plattform jedoch höher ist als die von targetSdkVersion Ihrer App deklarierte Version, kann das System Kompatibilitätsverhalten aktivieren, um sicherzustellen, dass Ihre App weiterhin wie erwartet funktioniert." Ich denke, dies bedeutet, dass targetSdkVersionSie möglicherweise Kompatibilitätsverhalten feststellen , wenn die API-Ebene des Geräts, auf dem Sie ausgeführt werden, neuer ist als Ihre . Ich glaube nicht, dass es etwas mit dem zu tun hat compileSdkVersion.
Jeremy
20

The CompileSdkVersion ist die Version der SDK-Plattform, mit der Ihre App für die Kompilierung usw. arbeitet. WÄHREND des Entwicklungsprozesses (Sie sollten immer die neueste verwenden). Diese Version wird mit der von Ihnen verwendeten API-Version geliefert

Geben Sie hier die Bildbeschreibung ein

Sie sehen dies in Ihrer build.gradleDatei:

Geben Sie hier die Bildbeschreibung ein

targetSdkVersion:enthält die Informationen, mit denen Ihre App NACH dem Entwicklungsprozess an den App Store geliefert wird, der dies ermöglicht TARGET the SPECIFIED version of the Android platform. Abhängig von der Funktionalität Ihrer App kann sie auf API-Versionen abzielen, die niedriger als die aktuelle sind. Beispielsweise können Sie auf API 18 abzielen, selbst wenn die aktuelle Version 23 ist.

Schauen Sie sich diese offizielle Google- Seite genau an .

Ojonugwa Jude Ochalifu
quelle
9

Ich sehe viele Unterschiede compiledSdkVersion in früheren Antworten, daher werde ich versuchen, hier ein wenig zu klären, indem ich der Webseite von Android folge.

A - Was Android sagt

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

Auswählen einer Plattformversion und einer API-Ebene Wenn Sie Ihre Anwendung entwickeln, müssen Sie die Plattformversion auswählen, anhand derer Sie die Anwendung kompilieren möchten. Im Allgemeinen sollten Sie Ihre Anwendung mit der niedrigstmöglichen Version der Plattform kompilieren, die Ihre Anwendung unterstützen kann.

Das wäre also die richtige Reihenfolge laut Android:

compiledSdkVersion = minSdkVersion <= targetSdkVersion

B - Was andere auch sagen

Einige Leute bevorzugen es, immer die höchste verfügbare compiledSkdVersion zu verwenden. Dies liegt daran, dass sie sich auf Codehinweise stützen, um zu überprüfen, ob sie neuere API-Funktionen als minSdkVersion verwenden. Daher wird entweder der Code so geändert, dass sie nicht verwendet werden, oder die Benutzer-API-Version wird zur Laufzeit überprüft, um sie bedingt mit Fallbacks für ältere API-Versionen zu verwenden.

Hinweise zu veralteten Verwendungen werden auch im Code angezeigt, sodass Sie wissen, dass in neueren API-Ebenen etwas veraltet ist, sodass Sie auf Wunsch entsprechend reagieren können.

Dies wäre also die richtige Reihenfolge für andere:

minSdkVersion <= targetSdkVersion <= compiledSdkVersion (highest possible)

Was ist zu tun?

Es hängt von Ihnen und Ihrer App ab.

Wenn Sie vorhaben, zur Laufzeit je nach API-Ebene des Benutzers unterschiedliche API-Funktionen anzubieten, verwenden Sie Option B. Sie erhalten Hinweise zu den Funktionen, die Sie beim Codieren verwenden. Stellen Sie nur sicher, dass Sie niemals neuere API-Funktionen als minSdkVersion verwenden, ohne die Benutzer-API-Ebene zur Laufzeit zu überprüfen. Andernfalls stürzt Ihre App ab. Dieser Ansatz hat auch den Vorteil, dass beim Codieren gelernt wird, was neu und was alt ist.

Wenn Sie bereits wissen, was neu oder alt ist, und eine einmalige App entwickeln, die mit Sicherheit nie aktualisiert wird, oder wenn Sie sicher sind, dass Sie neue API-Funktionen nicht bedingt anbieten, verwenden Sie Option A. Sie werden nicht gestört mit veralteten Hinweisen und Sie werden niemals in der Lage sein, neuere API-Funktionen zu verwenden, selbst wenn Sie versucht sind, dies zu tun.

CGodo
quelle
2
Ich denke nicht, dass der Android-Rat anders ist. Es gibt einen Unterschied zwischen "Kompilieren Sie Ihre Anwendung mit der niedrigstmöglichen Version" und dem Kompilieren mit einer bestimmten SDK-Version. Sie sollten generell mit der neuesten Version kompilieren (compileSdkVersion), Ihre min (minSdkVersion) so niedrig wie möglich und Ihr Ziel (targetSdkVersion) so hoch wie möglich einstellen, sofern Tests oder andere Kompatibilitätsprobleme vorliegen.
Caltor
Guter Punkt @Caltor. Ich wünschte, sie würden dieses Dokument aktualisieren, um den Unterschied zu verdeutlichen. Die <uses-sdk>Dokumentation ist äußerst vage und mehrdeutig.
Jeremy
2

Meine 2 Cent: Kompilieren Sie mit einer beliebigen Version des SDK, aber achten Sie darauf, keine APIs aufzurufen, die Ihre "minimale SDK-Version" nicht unterstützt. Das bedeutet, dass Sie mit der neuesten Version des SDK "kompilieren" können.

Die "Zielversion" bezieht sich einfach auf das, was Sie ursprünglich als Ziel geplant und möglicherweise getestet haben. Wenn Sie die Due Diligence nicht durchgeführt haben, können Sie Android auf diese Weise darüber informieren, dass einige zusätzliche Überprüfungen durchgeführt werden müssen, bevor Ihre auf "Oollo" ausgerichtete App "Lollipop" bereitgestellt wird.

Die "Zielversion" ist also offensichtlich nicht niedriger als Ihre "minimale SDK-Version", kann aber nicht höher als Ihre "kompilierte Version" sein.

pcodex
quelle
1

Sie beantworten Ihre direkten Fragen nicht, da es bereits viele detaillierte Antworten gibt. Erwähnenswert ist jedoch, dass Android Studio entgegen der Android-Dokumentation die Verwendung derselben Version für compileSDKVersionund vorschlägt targetSDKVersion.

Geben Sie hier die Bildbeschreibung ein

sshturma
quelle
0

compiledSdkVersion ==> Welche Version des SDK soll Ihren Code zu Bytecode kompilieren(wird in der Entwicklungsumgebung verwendet)? Punkt: Es ist besser, die letzte Version des SDK zu verwenden.

minSdkVersion ==> Dieses Element wird für die Installation von APK verwendet (es wird in der Produktionsumgebung verwendet). Zum Beispiel:

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

Kurze Zusammenfassung:

Informationen zu minSDKversion finden Sie im neuesten Eintrag im Twitter-Handle: https://twitter.com/minSdkVersion

TargetSDKversion: Siehe neuesten Eintrag im Twitter-Handle: https://twitter.com/targtSdkVersion oder verwenden Sie die neueste API-Ebene, wie unter devel https://developer.android.com/guide/topics/manifest/uses-sdk-element angegeben. html

Kompilierte Version: Entspricht TargetSDKversion

maxSdkVersion: Der Rat von Android lautet, dies nicht festzulegen, da Sie Ihre App nicht darauf beschränken möchten, bei zukünftigen Android-Versionen keine Leistung zu erbringen

kush
quelle
0

In den Anwendungseinstellungen der Eigenschaften eines Android-Projekts in Visual Studio 2017 (15.8.5) wurden diese kombiniert:

Geben Sie hier die Bildbeschreibung ein

Sam ist
quelle