Android Min SDK-Version vs. Target SDK-Version


442

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!


1
Nach dem, was ich lese, scheint die Target SDK-Version keinen Einfluss darauf zu haben, wie Ihre Anwendung kompiliert wird. Es dient nur dazu, dem Gerät mitzuteilen, dass die Anwendung ausgeführt wird, dass keine speziellen Kompatibilitätsfunktionen aktiviert werden müssen, damit Ihre Anwendung ordnungsgemäß funktioniert. Ist das richtig? Mir scheint, Sie würden erst wissen, was Ihre SDK-Zielversion ist, nachdem Sie viele Tests kompiliert und durchgeführt haben. Warum kann der Compiler nicht einfach Ihren Code anzeigen und herausfinden, mit welchen Plattformen Ihre Anwendung selbst kompatibel ist?
Michael Novello

5
Der obige Kommentator hat falsch verstanden, warum man die targetSDK-Funktion verwendet. Siehe meine Antwort unten für weitere Details.
Steve Haley

157
Die akzeptierte Antwort ist nicht korrekt. Bitte lesen Sie die Antwort von Steve H.
tylerl

3
@tylerl Aber es ist nicht falsch, sondern verweist auf die Google Android-Dokumentationen. Ich habe nichts hinzugefügt.
Vikas Patidar

3
Carls Antwort ist meiner Meinung nach die detaillierteste und präziseste.
Ilya Kogan

Antworten:


136

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


Im Großen und Ganzen werden Sie beide auf dasselbe einstellen. Es wäre wahrscheinlich eine ungewöhnliche Situation, wenn sie auf unterschiedliche Werte eingestellt würden.
JJB

66
Zu jjbs Kommentar: Ich bin anderer Meinung. Es gibt viele gute Gründe, warum Sie ein anderes minSDK und ein anderes targetSDK haben könnten. Siehe meine Antwort für weitere Details.
Steve Haley

871

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.


2
Könnten Sie bitte genau erklären, wie sich die targetSDKversion auf die Kompilierung der App auswirkt? Weil die Kompilierungsversion wieder eine andere Konfiguration ist, die Sie einrichten müssen. Vielen Dank im Voraus
hnviet

9
Ich denke , Steve zwischen dem Manifest XML - Attribute verwirrte Android - Version: targetSdkVersion (was kein wirkliches Mitspracherecht hat) und zwischen dem Ziel Eigenschaft , dass liegt in der project.properties - Datei , die gegen stellt dar , was sollte der Code kompiliert werden. Ich sage noch einmal, die xml attr targetSdkVersion hat keine wirkliche Bedeutung !!!
AlikElzin-Kilaka

3
@ Kilaka Die Hälfte deines Kommentars ist gültig, aber die andere Hälfte ist einfach falsch. Ich ging davon aus, dass jemand denselben Wert in XML und project.properties verwendet (auch über einen Rechtsklick-> Eigenschaften in Eclipse zugänglich), sodass Sie zu Recht darauf hinweisen, dass er an verschiedenen Orten gespeichert ist. Der Android Market kümmert sich jedoch mit Sicherheit darum, welchen Wert Sie in das XML-Attribut targetSdkVersion legen. Dies wird beispielsweise verwendet, wenn Sie festlegen, ob Sie eine ActionBar oder ein Kompatibilitätsmenü für Honeycomb-Anwendungen und höher verwenden sollen.
Steve Haley

2
@Nate Ich konnte nicht sagen, wie viel langsamer dieser 'verschlungene Code' die Laufzeit macht, aber ich denke, dass das Aufteilen und Verwenden mehrerer APKs hinsichtlich der Codekomplexität schlechter ist. Jetzt müssen Sie daran denken, weitere Zweige in Ihrer Quellcodeverwaltung zu kommentieren oder zu verschmelzen, bevor Sie jeden Export durchführen können. Als sie letzten Oktober auf einer Android-Konferenz sagten, sie hätten das Mehrfach-APK-System als Konzession eingeführt, waren aber froh, dass nur sehr wenige Leute es nutzten.
Steve Haley

2
Der Umgang mit mehreren Versionen ist jedoch das Ziel von Versionskontrollsystemen. Entwickler kennen sich damit aus (die meisten mobilen oder nicht mobilen Programme veröffentlichen leicht unterschiedliche Versionen für unterschiedliche Plattformen). Diese Android "Funktion" reduziert nicht die Komplexität. Es wird einfach in die laufende Anwendung verschoben, was, wie dieser Thread zeigt, Verwirrung stiftet. Sicher, Google wird sich freuen, dass nur wenige Leute es verwenden ... das hilft ihnen zu sagen: "Sehen Sie, wir hatten Recht, diese Auslassung überhaupt zu machen." Außerdem verwenden einige es nicht, weil sie noch nicht wissen, dass es existiert.
Nate

97

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.


Vielen Dank für Anweisungen zur Verwendung der TargetApi-Direktive.
Samir105

@Carl Bedeutet dies, dass ich targetSdkVersion immer auf eine höhere Version als meine minSdkVersion einstellen kann (insbesondere, um diese Verbesserungen der Benutzeroberfläche zu erhalten), ohne dass Tests ( per se ) erforderlich sind, solange ich meine Codebasis auf die Verwendung von APIs beschränke, die nur in meiner minSdkVersion verfügbar sind ?
Damilola Olowookere

Olowookere Emmanuel: Wenn ich Sie richtig verstehe, dann nein, das heißt das nicht. In meiner Antwort heißt es: "Wenn Sie Funktionen verwenden, die auf oder vor Stufe xx veraltet sind, wird der Kompatibilitätscode von Betriebssystemversionen auf höheren API-Stufen nicht automatisch angewendet." Wenn Ihr Code also eine Funktion verwendet, die beispielsweise auf API-Ebene 8 verfügbar wurde, und diese Funktion auf Ebene 10 veraltet ist, ist kein Kompatibilitätscode verfügbar, mit dem Sie Ihre Verwendung anpassen können, wenn Sie Ihre targetSdkVersion auf einen Wert über 10 erhöhen diese Funktion auf die neue Betriebssystemebene.
Carl

(Fortsetzung): Wenn Sie Ihre targetSdkVersion auf Stufe 8 belassen, können Sie zwar keine Funktionen verwenden, die auf höheren Ebenen eingeführt wurden, es wird jedoch Kompatibilitätscode angewendet, damit Ihre Verwendung von Funktionen der Stufe 8 beim Ausführen funktioniert höhere Betriebssystemebenen.
Carl

(Fortsetzung): Stellen Sie sich das so vor: Angenommen, Sie haben Code geschrieben, als die höchste verfügbare Android-Stufe 8 war, und Sie haben Ihre targetSdkVersion auf 8 gesetzt (weil dies zu dieser Zeit die höchste Stufe war). Jetzt erscheinen einige neue Versionen von Android, und einige der von Ihnen verwendeten Level 8-Funktionen sind nicht mehr verfügbar. Benutzer, die noch über Ihre alte APK verfügen, sollten keine Fehler feststellen, oder? Um dies zu gewährleisten, wird der Kompatibilitätscode automatisch angewendet, um Ihre alten API-Aufrufe so anzupassen, dass sie beim Aufrufen eines neueren Betriebssystems ausgeführt werden, wenn sie aufgerufen werden.
Carl

50

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 .

DatePickerDialog-Look mit targetSDKversion 10 oder niedriger DatePickerDialog-Look mit targetSDKversion 11 oder höher

Der Code, mit dem ich dieses Beispiel erstellt habe, ist sehr einfach. MainActivity.javasieht 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.xmlsieht 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.


2
"Wir erhalten Vorteile wie eine Verbesserung des Erscheinungsbilds durch das Setzen einer höheren targetSDKversion, aber dies bringt Verantwortung mit sich." Wenn sie diese Zeile in Dokumenten erwähnt hätten, würde ich nicht danach suchen.
pulp_fiction

@ 김준호 Ich habe zwei Fragen: 1.) Wenn Sie im obigen Datepicker-Beispiel targetSdkVersion auf 10 oder niedriger gesetzt und die App auf einem Gerät mit dem neuesten Android (z. B. API 22) ausgeführt haben, wird der Datepicker weiterhin wie das alte angezeigt auf dem linken Bild? 2.) Bedeutet dies, dass ich targetSdkVersion immer auf eine höhere Version als meine minSdkVersion einstellen kann (z. B. um diese Verbesserungen der Benutzeroberfläche wie diesen knusprigen Datepicker von höheren APIs zu erhalten), ohne dass ( per se ) Tests erforderlich sind, solange ich meine Codebasis einschränke nur APIs verwenden, die in meiner minSdkVersion verfügbar sind?
Damilola Olowookere

@Olowookere 1) Ja. Lauf einfach los. 2) Sie können targetSDKVersion beliebig einstellen, wenn es höher als minSDKVersion ist. Sie müssen jedoch noch testen, ob es in der Zielversion einwandfrei funktioniert. Es spielt keine Rolle, ob Sie sich an die minSDKVersion-API halten oder nicht. Denken Sie an ein DatePicker-Beispiel.
16.

Stellen Sie sich einen Fall vor, in dem Sie die Mindestversion 14 und die Ziel-SDK-Version auf 16 gesetzt haben und Apis nur für 14 oder weniger verwendet haben. Angenommen, Sie haben TextView verwendet, das in API-Level 1 eingeführt wird. Was würde passieren?
16.

@ 김준호 Danke. Aber für Ihre zweite Antwort bin ich verwirrt. Wenn mein Code nur API in minSdkVersion verwendet und ich auf ein höheres SDK abziele, warum muss ich dann testen? Wenn man an ein DatePicker-Beispiel denkt, hat die hohe targetSdkVersion nur das Aussehen des DatePicker-Widgets verbessert und nichts ist kaputt gegangen, weil ich keinen Code in einer API verwendet habe, die höher als minSdkVersion ist. Ich möchte nur eine höhere targetSdkVersion, weil ich das neue Erscheinungsbild von Widgets möchte, nicht, dass ich neue Funktionen verwenden möchte, die bei einer höheren API eingeführt wurden
Damilola Olowookere

21

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, targetSdkVersionaber 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


"ist die maximale Version, von der Ihre App Funktionen geerbt hat." : das ist falsch. Dies ist die Mindestversion, von der Ihre App Funktionen geerbt hat, dh die erste Version, die die erforderlichen Funktionen enthält, die von Ihrer App verwendet werden.
RichieHH

Englisch ist eine schwierige Sprache. Lesen Sie mein Beispiel in der Antwort. Ich gehe davon aus, dass ich dort Sinn mache. :)
Darpan

Ich bin nicht pedantisch und Englisch ist die Unterstützungssprache in dieser Gruppe. Tricky oder nicht zu sagen, es sei die "maximale Version, in der die App Funktionen unterstützt", ist nicht nur falsch: Es ist total um 180 Grad falsch. Es ist die ERSTE oder Mindestversion, die alle beabsichtigten Funktionen Ihrer Anwendung unterstützt, ohne Fallback-Kompatibilitätsmodi / -bibliotheken zu verwenden.
RichieHH

9

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.


1
Ich bin verwirrt darüber. Was passiert, wenn Sie Ihre App später in einem System mit SDK 10 ausführen?
Fran Marzoa

Es wird options.inBitmap-Anweisung ausführen und App sollte gut funktionieren.
NinjaCoder

1

android:minSdkVersionund android:targetSdkVersionbeide 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 ...


0

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.


0

Ziel-SDK ist die Version, auf die Sie abzielen möchten, und Min-SDK ist die Mindestversion.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.