748 Stimmen

Was ist der Unterschied zwischen compileSdkVersion und targetSdkVersion?

Ich habe mir die Dokumentation zum Erstellen mit Gradle angesehen, aber ich bin immer noch nicht sicher, was der Unterschied zwischen compileSdkVersion und targetSdkVersion ist.

Alles, was es sagt, ist:

Die `compileSdkVersion`-Eigenschaft gibt das Kompilierungsziel an.

Nun, was ist das "Kompilierungsziel"?

Ich sehe zwei mögliche Interpretationen:

  1. compileSdkVersion ist die Version des Compilers, der zum Erstellen der App verwendet wird, während targetSdkVersion die "API-Ebene, auf die die Anwendung abzielt" ist. (Wenn dies der Fall wäre, würde ich davon ausgehen, dass compileSdkVersion größer als oder gleich targetSdkVersion sein müsste?
  2. Sie bedeuten dasselbe. "Kompilierungsziel" == "die API-Ebene, auf die die Anwendung abzielt"
  3. Etwas anderes?

Ich sehe, dass diese Frage bereits gestellt wurde, aber die eine Antwort zitiert einfach die Dokumentation, die für mich unklar ist.

14voto

CGodo Punkte 1380

Ich sehe viele Unterschiede bezüglich compiledSdkVersion in den vorherigen Antworten, also werde ich hier versuchen, ein wenig Klarheit zu schaffen, basierend auf der Webseite von Android.

A - Was Android sagt

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

Auswahl einer Plattformversion und API-Ebene Beim Entwickeln Ihrer Anwendung müssen Sie die Plattformversion auswählen, gegen die Sie die Anwendung kompilieren werden. Im Allgemeinen sollten Sie Ihre Anwendung gegen die niedrigstmögliche Version der Plattform kompilieren, die Ihre Anwendung unterstützen kann.

Also wäre dies die richtige Reihenfolge gemäß Android:

compiledSdkVersion = minSdkVersion <= targetSdkVersion

B - Was andere auch sagen

Einige bevorzugen es, immer die höchste verfügbare compiledSkdVersion zu verwenden. Das liegt daran, dass sie sich auf Codehinweise verlassen werden, um zu überprüfen, ob sie neuere API-Funktionen als minSdkVersion verwenden, entweder den Code ändern, um sie nicht zu verwenden, oder die Benutzer-API-Version zur Laufzeit überprüfen, um sie bedingt mit Fallbacks für ältere API-Versionen zu verwenden.

Hinweise zu veralteten Verwendungen würden auch im Code erscheinen und Sie darüber informieren, dass etwas in neueren API-Level veraltet ist, damit Sie entsprechend reagieren können, wenn Sie möchten.

Also wäre dies die richtige Reihenfolge gemäß anderer:

minSdkVersion <= targetSdkVersion <= compiledSdkVersion (höchstmöglich)

Was ist zu tun?

Es hängt von Ihnen und Ihrer App ab.

Wenn Sie planen, verschiedene API-Funktionen entsprechend der API-Ebene des Benutzers zur Laufzeit anzubieten, verwenden Sie Option B. Sie erhalten Hinweise über die von Ihnen verwendeten Funktionen beim Codieren. Stellen Sie nur sicher, dass Sie niemals neuere API-Funktionen als minSdkVersion verwenden, ohne die Benutzer-API-Ebene zur Laufzeit zu überprüfen, sonst wird Ihre App abstürzen. Dieser Ansatz hat auch den Vorteil, beim Codieren zu lernen, was neu ist und was alt ist.

Wenn Sie bereits wissen, was neu oder alt ist und eine einmalige App entwickeln, die sicherlich nie aktualisiert wird, oder wenn Sie sicher sind, dass Sie keine neuen API-Funktionen bedingt anbieten werden, dann verwenden Sie Option A. Sie werden nicht mit veralteten Hinweisen belästigt und Sie werden niemals neue API-Funktionen verwenden können, auch wenn Sie dazu versucht sind.

6voto

Umang Choudhary Punkte 61

compileSdkVersion : compileSdkVersion definiert, welche Android SDK-Version von Gradle verwendet wird, um Ihre App zu kompilieren.

Zum Beispiel: In Android 12, also in SDK-Version 31, wurde eine neue Splash-Screen-API eingeführt, die es uns ermöglicht, eine Splash-Screen einfach zu implementieren. Wenn Sie diese API in Ihrer App verwenden möchten, müssen Sie die compileSdkVersion in Ihrer App auf 31 aktualisieren. Nur dann können Sie diese neue Splash-Screen-API in Ihrem Code verwenden, ansonsten erhalten Sie einen Kompilierungsfehler.

Dies bedeutet natürlich nicht, dass Sie nur diese neue API verwenden können und die Benutzer vergessen können, die ältere Android-Versionen haben, in denen diese API nicht verfügbar ist. Sie müssen auch eine alternative Möglichkeit bereitstellen, einen Splash-Screen für ältere Geräte anzuzeigen, indem Sie eine Versionsüberprüfungsbedingung verwenden.

*if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {

// Neue Splash-Screen-API

} else {

// Alter Splash-Screen-Ansatz

}*

Ebenso können in dieser Android SDK-Version einige Methoden oder Eigenschaften veraltet sein, und einige davon sogar entfernt werden. Deshalb werden Sie häufig beim Kompilieren nach dem Aktualisieren der compileSdkVersion in Ihrer App Warnungen und Fehler sehen.

Aber das Ändern der compileSdkVersion allein ändert tatsächlich nicht das Verhalten der App beim Ausführen auf einem Android-Gerät. Wie weiß also das Android-System, ob es mit Ihrer App neue Funktionalitäten verwenden kann oder nicht? Genau hier kommt targetSdkVersion ins Spiel.

targetSdkVersion : targetSdkVersion teilt dem System mit, für welche Android-Version die App entworfen und getestet wurde.

Zum Beispiel: In Android 12 wurde das Erscheinungsbild von benutzerdefinierten Benachrichtigungen geändert. Wenn Ihr targetSdkVersion unter 31 liegt, geht das System davon aus, dass Sie diese Funktion nicht getestet haben und zeigt Benachrichtigungen auf die alte Weise an, um das Risiko zu minimieren, dass Benachrichtigungen nicht richtig angezeigt werden. Erst nachdem Sie die target SDK-Version auf 31 aktualisiert haben, wird das neue Benachrichtigungsdesign verwendet.

Nicht alle Änderungen, die in neuen Android-Versionen eingeführt wurden, zielen auf diese abwärtskompatiblen Mechanismen ab. Für jede Veröffentlichung einer Android-Version werden Änderungen in der Dokumentation in zwei Gruppen unterteilt:

-> Verhaltensänderungen für Apps, die auf bestimmte Android-Versionen abzielen

-> und Änderungen für alle Apps, unabhängig davon, welche targetSdkVersion sie definieren.

Ein Beispiel für letzteres könnte die Einführung von einmaligen Berechtigungen in Android 11 sein. Wenn das Gerät Android-Version 11 oder höher verwendet und die App um Standortberechtigung bittet, kann der Benutzer vorübergehenden Zugriff auf diese Daten gewähren und die App muss diesen Fall ordnungsgemäß behandeln, unabhängig davon, ob sie SDK-Version 30 anzielt oder nicht.

Beziehung zwischen compile und target SDK-Versionen:

-> targetSdkVersion kann nicht höher sein als die compileSdkVersion, einfach weil wir während des Kompilierens nichts anzielen können, von dem wir nichts wissen.

-> Idealerweise sollten compileSdkVersion und targetSdkVersion gleich sein und beide auf das neueste SDK zeigen.

4voto

pcodex Punkte 1516

Meine 2 Cent: Kompilieren Sie gegen jede Version des SDKs, aber achten Sie darauf, keine APIs aufzurufen, die Ihre "Mindest-SDK-Version" nicht unterstützt. Das bedeutet, dass Sie "könnten" gegen die neueste Version des SDKs kompilieren.

Was die "Zielversion" betrifft, bezieht sie sich einfach darauf, was Sie von Anfang an anvisiert haben und möglicherweise getestet haben. Wenn Sie nicht die erforderlichen Sorgfaltspflichten beachtet haben, dann ist dies der Weg, um Android mitzuteilen, dass es einige zusätzliche Überprüfungen durchführen muss, bevor es Ihre App, die beispielsweise auf "Lollipop" abzielt, auf "Oreo" bereitstellt.

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

4voto

M.Namjo Punkte 256

compiledSdkVersion\==> welche Version des SDKs sollte deinen Code in Bytecode kompilieren (es wird in der Entwicklungsumgebung verwendet) Punkt: Es ist besser, die letzte Version des SDKs zu verwenden.

minSdkVersion\==> dieses Element wird für die Installation der 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;

3voto

sshturma Punkte 1053

Nichts beantworten Ihre direkten Fragen, da es bereits viele detaillierte Antworten gibt, aber es ist erwähnenswert, dass Android Studio im Gegensatz zur Android-Dokumentation vorschlägt, dieselbe Version für compileSDKVersion und targetSDKVersion zu verwenden.

Bildbeschreibung hier eingeben

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X