Was ist der Unterschied zwischen der Min- und der Target SDK-Version bei der Entwicklung von Anwendungen für Android? Mit Eclipse kann ich kein neues Projekt erstellen, es sei denn, die Versionen Min und Target sind identisch!
Was ist der Unterschied zwischen der Min- und der Target SDK-Version bei der Entwicklung von Anwendungen für Android? Mit Eclipse kann ich kein neues Projekt erstellen, es sei denn, die Versionen Min und Target sind identisch!
Antworten:
android: minSdkVersion
Eine Ganzzahl, die die minimale API-Ebene angibt, die für die Ausführung der Anwendung erforderlich ist. Das Android-System verhindert, dass der Benutzer die Anwendung installiert, wenn die API-Ebene des Systems niedriger als der in diesem Attribut angegebene Wert ist. Sie sollten dieses Attribut immer deklarieren.
android: targetSdkVersion
Eine Ganzzahl, die die API-Ebene angibt, auf die die Anwendung abzielt.
Mit diesem Attributsatz gibt die Anwendung an, dass sie auf älteren Versionen (bis auf minSdkVersion) ausgeführt werden kann, wurde jedoch explizit getestet, um mit der hier angegebenen Version zu arbeiten. Durch die Angabe dieser Zielversion kann die Plattform Kompatibilitätseinstellungen deaktivieren, die für die Zielversion nicht erforderlich sind (die andernfalls möglicherweise aktiviert sind, um die Vorwärtskompatibilität aufrechtzuerhalten) oder neuere Funktionen aktivieren, die älteren Anwendungen nicht zur Verfügung stehen. Dies bedeutet nicht, dass Sie verschiedene Funktionen für verschiedene Versionen der Plattform programmieren können. Sie informiert lediglich die Plattform, die Sie gegen die Zielversion getestet haben, und die Plattform sollte keine zusätzlichen Arbeiten ausführen, um die Vorwärtskompatibilität mit der Zielversion aufrechtzuerhalten.
Weitere Informationen finden Sie unter dieser URL:
http://developer.android.com/guide/topics/manifest/uses-sdk-element.html
Der Kommentar des OP zu der Frage (der besagt, dass das targetSDK die Kompilierung einer App nicht beeinflusst) ist völlig falsch! Tut mir leid, stumpf zu sein.
Kurz gesagt, hier ist der Zweck, ein anderes targetSDK als das minSDK zu deklarieren: Dies bedeutet, dass Sie Funktionen von einem höheren SDK als Ihrem Minimum verwenden, aber die Abwärtskompatibilität sichergestellt haben . Mit anderen Worten, stellen Sie sich vor, Sie möchten eine Funktion verwenden, die erst kürzlich eingeführt wurde, aber für Ihre Anwendung nicht kritisch ist. Sie würden dann das targetSDK auf die Version einstellen, in der diese neue Funktion eingeführt wurde, und das Minimum auf etwas niedrigeres, damit jeder Ihre App weiterhin verwenden kann.
Angenommen, Sie schreiben eine App, die die Gestenerkennung in großem Umfang nutzt. Jeder Befehl, der von einer Geste erkannt werden kann, kann jedoch auch über eine Schaltfläche oder über das Menü ausgeführt werden. In diesem Fall sind Gesten ein "cooles Extra", aber nicht erforderlich. Daher würden Sie das Ziel-SDK auf 7 ("Eclair", als die GestureDetection-Bibliothek eingeführt wurde) und das Minimum-SDK auf Stufe 3 ("Cupcake") setzen, damit auch Personen mit wirklich alten Telefonen Ihre App verwenden können. Sie müssen lediglich sicherstellen, dass Ihre App die Version von Android überprüft hat, auf der sie ausgeführt wurde, bevor Sie versuchen, die Gestenbibliothek zu verwenden, um zu vermeiden, dass Sie versuchen, sie zu verwenden, wenn sie nicht vorhanden ist. (Zugegeben, dies ist ein veraltetes Beispiel, da kaum noch jemand ein v1.5-Telefon hat, aber es gab eine Zeit, in der die Kompatibilität mit v1 beibehalten wurde.
Um ein weiteres Beispiel zu nennen, können Sie dies verwenden, wenn Sie eine Funktion von Gingerbread oder Honeycomb verwenden möchten. Einige Leute werden die Updates bald erhalten, aber viele andere, insbesondere mit älterer Hardware, bleiben möglicherweise bei Eclair, bis sie ein neues Gerät kaufen. Auf diese Weise können Sie einige der coolen neuen Funktionen nutzen, ohne jedoch einen Teil Ihres möglichen Marktes auszuschließen.
Es gibt einen wirklich guten Artikel aus dem Blog Android-Entwicklers über die Verwendung dieser Funktion und insbesondere über das Entwerfen des oben erwähnten Codes "Überprüfen Sie, ob die Funktion vorhanden ist, bevor Sie sie verwenden".
An das OP: Ich habe dies hauptsächlich zum Nutzen aller geschrieben, die in Zukunft über diese Frage stolpern, da mir klar ist, dass Ihre Frage vor langer Zeit gestellt wurde.
Wenn Sie targetSdkVersion = "xx" festlegen, bestätigen Sie, dass Ihre App auf API-Ebene xx ordnungsgemäß funktioniert (z. B. gründlich und erfolgreich getestet wurde).
Eine Version von Android, die auf einer API-Ebene über xx ausgeführt wird, wendet automatisch Kompatibilitätscode an, um alle Funktionen zu unterstützen, auf die Sie sich möglicherweise verlassen, die auf oder vor API-Ebene xx verfügbar waren, die jedoch auf der höheren Ebene dieser Android-Version veraltet sind.
Wenn Sie dagegen Funktionen verwenden, die auf oder vor Stufe xx veraltet sind , wird der Kompatibilitätscode von Betriebssystemversionen auf höheren API-Ebenen (die diese Funktionen nicht mehr enthalten) nicht automatisch angewendet, um diese Verwendungen zu unterstützen. In diesem Fall muss Ihr eigener Code über Sonderfallklauseln verfügen, mit denen die API-Ebene getestet wird. Wenn die erkannte Betriebssystemebene höher ist und nicht über die angegebene API-Funktion verfügt, muss Ihr Code alternative Funktionen verwenden, die auf den laufenden Betriebssystemen verfügbar sind API-Ebene.
Wenn dies nicht der Fall ist, werden einige Schnittstellenfunktionen möglicherweise nicht angezeigt, die normalerweise Ereignisse in Ihrem Code auslösen würden, und es fehlt möglicherweise eine wichtige Schnittstellenfunktion, die der Benutzer benötigt, um diese Ereignisse auszulösen und auf ihre Funktionen zuzugreifen (wie in der.) Beispiel unten).
Wie in anderen Antworten angegeben, können Sie targetSdkVersion höher als minSdkVersion festlegen, wenn Sie einige API-Funktionen verwenden möchten, die ursprünglich auf höheren API-Ebenen als Ihre minSdkVersion definiert wurden, und Schritte unternommen haben, um sicherzustellen, dass Ihr Code das Fehlen dieser Funktionen bei erkennen und verarbeiten kann niedrigere Ebenen als targetSdkVersion.
Um Entwickler zu warnen, speziell auf die für die Verwendung einer Funktion erforderliche Mindest-API-Ebene zu testen, gibt der Compiler einen Fehler aus (nicht nur eine Warnung), wenn Code einen Aufruf einer Methode enthält, die auf einer späteren API-Ebene als minSdkVersion definiert wurde. selbst wenn targetSdkVersion größer oder gleich der API-Ebene ist, auf der diese Methode zum ersten Mal verfügbar gemacht wurde. Um diesen Fehler zu beheben, die Compiler-Direktive
@TargetApi(nn)
teilt dem Compiler mit, dass der Code im Geltungsbereich dieser Direktive (der entweder einer Methode oder einer Klasse vorausgeht) geschrieben wurde, um eine API-Ebene von mindestens nn zu testen, bevor eine Methode aufgerufen wird, die von mindestens dieser API-Ebene abhängt . Der folgende Code definiert beispielsweise eine Methode, die aus Code in einer App mit einer minSdkVersion von weniger als 11 und einer targetSdkVersion von 11 oder höher aufgerufen werden kann:
@TargetApi(11)
public void refreshActionBarIfApi11OrHigher() {
//If the API is 11 or higher, set up the actionBar and display it
if(Build.VERSION.SDK_INT >= 11) {
//ActionBar only exists at API level 11 or higher
ActionBar 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();
}
}
Vielleicht haben Sie auch wollen eine höhere targetSdkVersion erklären , wenn Sie auf diesem höheren Niveau getestet hatten und alles funktionierte, auch wenn Sie wurden nicht alle Funktionen von einer API - Ebene höher ist als Ihre minSdkVersion verwenden. Dies dient nur dazu, den Aufwand für den Zugriff auf Kompatibilitätscode zu vermeiden, der von der Zielebene bis zur Min-Ebene angepasst werden soll, da Sie (durch Tests) bestätigt hätten, dass keine solche Anpassung erforderlich ist.
Ein Beispiel für eine UI-Funktion, die von der deklarierten targetSdkVersion abhängt, ist die Menüschaltfläche mit drei vertikalen Punkten, die in der Statusleiste von Apps mit einer targetSdkVersion von weniger als 11 angezeigt wird, wenn diese Apps unter API 11 und höher ausgeführt werden. Wenn Ihre App eine targetSdkVersion von 10 oder weniger hat, wird davon ausgegangen, dass die Benutzeroberfläche Ihrer App von der Existenz einer dedizierten Menüschaltfläche abhängt. Daher scheint die Dreipunktschaltfläche die frühere dedizierte Hardware- und / oder Bildschirmversion zu ersetzen dieser Schaltfläche (z. B. wie in Gingerbread), wenn das Betriebssystem eine höhere API-Ebene hat, für die keine dedizierte Menüschaltfläche auf dem Gerät mehr angenommen wird. Wenn Sie jedoch die targetSdkVersion Ihrer App auf 11 oder höher festlegen, wird davon ausgegangen, dass Sie die auf dieser Ebene eingeführten Funktionen genutzt haben, die die dedizierte Menüschaltfläche ersetzen (z. B. die Aktionsleiste) oder dass Sie auf andere Weise die Notwendigkeit einer Systemmenüschaltfläche umgangen haben; Infolgedessen verschwindet das Menü "Kompatibilitätstaste" mit drei vertikalen Punkten. In diesem Fall kann der Benutzer eine Menüschaltfläche nicht finden, wenn er sie nicht findet. Dies bedeutet wiederum, dass die Überschreibung von onCreateOptionsMenu (Menü) Ihrer Aktivität möglicherweise nie aufgerufen wird, was wiederum bedeutet, dass Ein wesentlicher Teil der Funktionalität Ihrer App kann der Benutzeroberfläche beraubt werden. Es sei denn, Sie haben die Aktionsleiste oder eine andere alternative Möglichkeit für den Benutzer implementiert, auf diese Funktionen zuzugreifen. Wenn sie keine Menüschaltfläche findet, kann sie diese nicht drücken. Dies bedeutet wiederum, dass die Überschreibung von onCreateOptionsMenu (Menü) Ihrer Aktivität möglicherweise nie aufgerufen wird, was wiederum bedeutet, dass ein wesentlicher Teil der Funktionalität Ihrer App sein kann seiner Benutzeroberfläche beraubt. Es sei denn, Sie haben die Aktionsleiste oder eine andere alternative Möglichkeit für den Benutzer implementiert, auf diese Funktionen zuzugreifen. Wenn sie keine Menüschaltfläche findet, kann sie diese nicht drücken. Dies bedeutet wiederum, dass die Überschreibung von onCreateOptionsMenu (Menü) Ihrer Aktivität möglicherweise nie aufgerufen wird, was wiederum bedeutet, dass ein wesentlicher Teil der Funktionalität Ihrer App sein kann seiner Benutzeroberfläche beraubt. Es sei denn, Sie haben die Aktionsleiste oder eine andere alternative Möglichkeit für den Benutzer implementiert, auf diese Funktionen zuzugreifen.
Im Gegensatz dazu gibt minSdkVersion an, dass die Betriebssystemversion eines Geräts mindestens diese API-Ebene haben muss, um Ihre App ausführen zu können. Dies wirkt sich darauf aus, welche Geräte Ihre App sehen und herunterladen können, wenn sie sich im Google Play App Store (und möglicherweise auch in anderen App Stores) befindet. Auf diese Weise können Sie feststellen, dass Ihre App auf Betriebssystemfunktionen (API oder andere) basiert, die auf dieser Ebene eingerichtet wurden, und keine akzeptable Möglichkeit bietet, mit dem Fehlen dieser Funktionen umzugehen.
Ein Beispiel für die Verwendung von minSdkVersion, um sicherzustellen, dass eine Funktion vorhanden ist, die nicht mit der API zusammenhängt, besteht darin, minSdkVersion auf 8 zu setzen, um sicherzustellen, dass Ihre App nur auf einer JIT-fähigen Version des Dalvik-Interpreters ausgeführt wird (seit Einführung von JIT) an den Android-Interpreter auf API-Ebene 8). Da die Leistung eines JIT-fähigen Interpreters bis zu fünfmal so hoch sein kann wie die eines Interpreters ohne diese Funktion, sollten Sie möglicherweise API-Stufe 8 oder höher benötigen, um eine angemessene Leistung zu gewährleisten, wenn Ihre App den Prozessor stark nutzt.
Ein Konzept kann immer besser mit Beispielen geliefert werden . Ich hatte Probleme, dieses Konzept zu verstehen, bis ich mich mit dem Quellcode des Android-Frameworks befasst und einige Experimente durchgeführt habe, selbst nachdem ich alle Dokumente auf Android-Entwicklerseiten und verwandten Stackoverflow-Threads gelesen hatte. Ich werde zwei Beispiele nennen, die mir sehr geholfen haben, diese Konzepte vollständig zu verstehen.
Ein DatePickerDialog sieht je nach Ebene, die Sie in die targetSDKversion ( <uses-sdk android:targetSdkVersion="INTEGER_VALUE"/>
) der Datei AndroidManifest.xml eingegeben haben, anders aus . Wenn Sie den Wert 10 oder niedriger einstellen, sieht Ihr DatePickerDialog wie links aus. Wenn Sie dagegen den Wert 11 oder höher festlegen, sieht ein DatePickerDialog mit demselben Code wie richtig aus .
Der Code, mit dem ich dieses Beispiel erstellt habe, ist sehr einfach. MainActivity.java
sieht aus :
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void onClickButton(View v) {
DatePickerDialog d = new DatePickerDialog(this, null, 2014, 5, 4);
d.show();
}
}
Und activity_main.xml
sieht aus:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClickButton"
android:text="Button" />
</RelativeLayout>
Das ist es. Das ist wirklich jeder Code, den ich brauche, um dies zu testen.
Und diese Änderung im Aussehen ist glasklar, wenn Sie den Quellcode des Android-Frameworks sehen . Es geht wie:
public DatePickerDialog(Context context,
OnDateSetListener callBack,
int year,
int monthOfYear,
int dayOfMonth,
boolean yearOptional) {
this(context, context.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.HONEYCOMB
? com.android.internal.R.style.Theme_Holo_Light_Dialog_Alert
: com.android.internal.R.style.Theme_Dialog_Alert,
callBack, year, monthOfYear, dayOfMonth, yearOptional);
}
Wie Sie sehen können, erhält das Framework die aktuelle targetSDKversion und legt ein anderes Thema fest. Diese Art von Code-Snippet ( getApplicationInfo().targetSdkVersion >= SOME_VERSION
) finden Sie hier und da im Android-Framework.
Ein weiteres Beispiel betrifft die WebView- Klasse. Die öffentlichen Methoden der Webview-Klasse sollten im Hauptthread aufgerufen werden. Andernfalls löst das Laufzeitsystem a aus RuntimeException
, wenn Sie targetSDKversion 18 oder höher festlegen. Dieses Verhalten kann eindeutig mit seinem Quellcode geliefert werden . Es ist einfach so geschrieben.
sEnforceThreadChecking = context.getApplicationInfo().targetSdkVersion >=
Build.VERSION_CODES.JELLY_BEAN_MR2;
if (sEnforceThreadChecking) {
throw new RuntimeException(throwable);
}
Das Android-Dokument sagt: " Während sich Android mit jeder neuen Version weiterentwickelt, können sich einige Verhaltensweisen und sogar das Erscheinungsbild ändern ." Wir haben uns also Verhaltens- und Erscheinungsänderungen angesehen und wie diese Änderungen erreicht werden.
Zusammenfassend heißt es im Android-Dokument: " Dieses Attribut (targetSdkVersion) informiert das System, das Sie gegen die Zielversion getestet haben, und das System sollte kein Kompatibilitätsverhalten aktivieren , um die Vorwärtskompatibilität Ihrer App mit der Zielversion aufrechtzuerhalten. " Dies ist bei WebView wirklich klar. Es war in Ordnung, bis JELLY_BEAN_MR2 veröffentlicht wurde, um die öffentliche Methode der WebView-Klasse für einen Nicht-Hauptthread aufzurufen. Es ist Unsinn, wenn das Android-Framework eine RuntimeException auf JELLY_BEAN_MR2-Geräten auslöst. Es sollte einfach keine neu eingeführten Verhaltensweisen für sein Interesse aktivieren, die fatale Folgen haben. Wir müssen also überprüfen, ob bei bestimmten targetSDKversions alles in Ordnung ist. Wir erhalten Vorteile wie eine Verbesserung des Erscheinungsbilds durch das Setzen einer höheren targetSDKversion.
EDIT: Haftungsausschluss. Der DatePickerDialog-Konstruktor, der basierend auf der aktuellen targetSDKversion (die ich oben gezeigt habe) verschiedene Themen festgelegt hat, wurde beim späteren Festschreiben tatsächlich geändert . Trotzdem habe ich dieses Beispiel verwendet, da die Logik nicht geändert wurde und dieses Code-Snippet das Konzept targetSDKversion deutlich zeigt.
Für diejenigen, die eine Zusammenfassung wünschen,
android:minSdkVersion
ist die Mindestversion, bis Ihre Anwendung unterstützt. Wenn Ihr Gerät eine niedrigere Android-Version hat, wird die App nicht installiert.
während,
android:targetSdkVersion
ist die API-Ebene, bis zu der Ihre App ausgeführt werden soll. Das bedeutet, dass das System Ihres Telefons kein Kompatibilitätsverhalten verwenden muss, um die Vorwärtskompatibilität aufrechtzuerhalten, da Sie bis zu dieser API getestet haben.
Ihre App wird weiterhin auf Android-Versionen ausgeführt, die höher als angegeben sind, targetSdkVersion
aber das Verhalten der Android-Kompatibilität wird aktiviert.
Werbegeschenk -
android:maxSdkVersion
Wenn die API-Version Ihres Geräts höher ist, wird die App nicht installiert. Dh. Dies ist die maximale API, bis zu der Sie Ihre App installieren lassen.
dh. für MinSDK -4, maxSDK - 8, targetSDK - 8 Meine App funktioniert mit mindestens 1.6, aber ich habe auch Funktionen verwendet, die nur in 2.2 unterstützt werden und sichtbar sind, wenn sie auf einem 2.2-Gerät installiert sind. Für maxSDK - 8 wird diese App nicht auf Telefonen mit API> 8 installiert.
Zum Zeitpunkt des Schreibens dieser Antwort war die Android-Dokumentation nicht besonders gut darin, sie zu erklären. Jetzt ist es sehr gut erklärt. Überprüfen Sie es hier
Wenn Sie beispielsweise Kompilierungsfehler erhalten:
<uses-sdk
android:minSdkVersion="10"
android:targetSdkVersion="15" />
.
private void methodThatRequiresAPI11() {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Config.ARGB_8888; // API Level 1
options.inSampleSize = 8; // API Level 1
options.inBitmap = bitmap; // **API Level 11**
//...
}
Sie erhalten einen Kompilierungsfehler:
Für das Feld ist API-Level 11 erforderlich (derzeit mindestens 10): android.graphics.BitmapFactory $ Options # inBitmap
Seit Version 17 der Android Development Tools (ADT) gibt es eine neue und sehr nützliche Anmerkung @TargetApi
, mit der dies sehr einfach behoben werden kann. Fügen Sie es vor der Methode hinzu, die die problematische Deklaration enthält:
@TargetApi
private void methodThatRequiresAPI11() {
BitmapFactory.Options options = new BitmapFactory.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**
//...
}
}
Keine Kompilierungsfehler jetzt und es wird ausgeführt!
BEARBEITEN: Dies führt zu einem Laufzeitfehler auf API-Ebene unter 11. Ab 11 wird es ohne Probleme ausgeführt. Sie müssen also sicher sein, dass Sie diese Methode in einem Ausführungspfad aufrufen, der durch die Versionsprüfung geschützt ist. Mit TargetApi können Sie es nur kompilieren, aber Sie führen es auf eigenes Risiko aus.
android:minSdkVersion
und android:targetSdkVersion
beide sind Integer-Werte, die wir in der Android-Manifest-Datei deklarieren müssen, aber beide haben unterschiedliche Eigenschaften.
android:minSdkVersion:
Dies ist die mindestens erforderliche API-Ebene, um eine Android-App auszuführen. Wenn wir dieselbe App auf einer niedrigeren API-Version installieren, wird der Parser-Fehler angezeigt und das Problem, dass die Anwendung nicht unterstützt wird, wird angezeigt.
android:targetSdkVersion:
Ziel-SDK-Version ist das Festlegen der Ziel-API-Ebene der App. Wenn dieses Attribut nicht im Manifest deklariert ist, ist die minSdk-Version Ihre TargetSdk-Version. Dies gilt immer für "App-Support-Installation auf allen höheren API-Versionen, die wir als TargetSdk-Version deklariert haben". Um ein App-beschränktes Ziel zu erreichen, müssen wir maxSdkVersion in unserer Manifest-Datei deklarieren ...
Wenn Sie Apps erstellen , für die gefährliche Berechtigungen erforderlich sind, und targetSDK auf 23 oder höher setzen , sollten Sie vorsichtig sein. Wenn Sie die Berechtigungen zur Laufzeit nicht überprüfen, erhalten Sie eine SecurityException. Wenn Sie Code in einem try-Block verwenden, z. B. eine geöffnete Kamera, kann es schwierig sein, Fehler zu erkennen, wenn Sie logcat nicht überprüfen.
Ziel-SDK ist die Version, auf die Sie abzielen möchten, und Min-SDK ist die Mindestversion.