Android API-Level, Abwärts- und Vorwärtskompatibilität

Guten Abend Freunde. Wir haben eine nützliche Übersetzung für zukünftige Studenten des Android-Entwicklers vorbereitet . Fortgeschrittenenkurs . Wir freuen uns, dieses Material mit Ihnen zu teilen.




Wenn Sie diesen Artikel lesen, bedeutet dies, dass Sie möglicherweise an folgenden Dingen interessiert sind:

  • Was bedeutet die API-Ebene?
  • Wie verwende compileSdkVersion , minSdkVersion oder targetSdkVersion ?
  • Wie kann ich garantieren, dass die Anwendung auf Geräten mit verschiedenen Versionen des Betriebssystems ordnungsgemäß funktioniert?



Alle diese Konzepte sind miteinander verbunden, und ich werde versuchen, sie Ihnen in diesem Artikel auf einfache, aber effektive Weise zu erklären.

Dazu müssen Sie den Unterschied zwischen dem SDK und der API verstehen und die API-Ebene im Android-Ökosystem kennen.

In Android besteht zwar eine 1: 1-Beziehung zwischen dem SDK und der API, und diese beiden Begriffe werden häufig synonym verwendet. Es ist jedoch wichtig zu verstehen, dass dies nicht dasselbe ist.

Es ist richtiger zu sagen, dass es für jede Android-Version ein SDK und eine entsprechende API sowie die Ebene dieser API gibt.

SDK


Es steht für Software Development Kit . Achten Sie auf das Wort "Kit" (Kit) ... es besteht nur aus einer Reihe verschiedener Tools, Bibliotheken, Dokumentationen und Beispielen, mit denen Entwickler Android-Anwendungen erstellen, debuggen und ausführen können. Mit dem SDK wird eine API bereitgestellt.

Wenn Sie den SDK-Manager in Android Studio öffnen, können Sie klarer sehen, woraus das Android SDK besteht.

Auf der ersten Registerkarte des Platform SDK werden die SDKs jeder Android-Version aufgelistet.

Wie in der Abbildung unten gezeigt, enthält das Android 9.0 SDK (auch als Pie bekannt):

  • Android SDK Platform 28 (dies ist die Framework- API ).
  • Der Quellcode für Android 28 (dies ist eine Implementierung der API, wie Sie sehen können, sie ist optional ... denken Sie daran).
  • und eine Reihe anderer Dinge ... zum Beispiel verschiedene System-Images für den Android-Emulator.


Übersicht über das SDK im Android Studio SDK Manager.

Auf der zweiten Registerkarte der SDK-Tools werden andere Tools angezeigt, die ebenfalls Teil des SDK sind, jedoch von der Plattformversion unabhängig sind. Dies bedeutet, dass sie separat freigegeben oder aktualisiert werden können.

API


Es steht für Application Programming Interface . Es ist nur eine Schnittstelle, eine Abstraktionsschicht, die eine Verbindung zwischen zwei verschiedenen „Teilen“ von Software herstellt. Es funktioniert wie ein Vertrag zwischen einem Anbieter (z. B. einer Bibliothek) und einem Verbraucher (z. B. einer Anwendung).

Dies ist eine Reihe formaler Definitionen wie Klassen, Methoden, Funktionen, Module und Konstanten, die von anderen Entwicklern zum Schreiben ihres Codes verwendet werden können. Die API enthält jedoch keine Implementierung.

API-Ebene


Die API-Ebene ist ein ganzzahliger Wert, der die Version der von der Android-Plattform angebotenen Framework-API eindeutig identifiziert.

In der Regel werden Plattform-Framework-API-Updates so konzipiert, dass die neue Version der API mit früheren Versionen kompatibel bleibt. Daher sind die meisten Änderungen an der neuen API additiv und die alten Teile der API sind veraltet, werden jedoch nicht gelöscht.

Und jetzt mag sich jemand fragen ...

Wenn die Android-API keine Implementierung bereitstellt und der SDK-Manager einen optionalen herunterladbaren API-Quellcode als Teil des SDK bereitstellt, wo befindet sich dann die entsprechende Implementierung?

Die Antwort ist einfach. Auf dem Gerät.

Lass es uns herausfinden ...

Vom Quellcode zur APK-Datei


In der Regel besteht ein Android-Projekt aus Code, der von Entwicklern mithilfe der Android-API (Anwendungsmodul) geschrieben wurde, sowie aus einigen anderen Bibliotheken / Abhängigkeiten (JAR-Dateien, AAR, Modulen usw.) und Ressourcen.

Der Kompilierungsprozess konvertiert in Java oder Kotlin geschriebenen Code, einschließlich Abhängigkeiten (einer der Gründe, Ihren Code zu reduzieren!), In DEX-Bytecode und komprimiert dann alles zusammen mit Ressourcen in eine APK-Datei. Zu diesem Zeitpunkt ist die Implementierung der API nicht in der endgültigen APK enthalten!


Build-Prozess - Android-Entwickler

DEX-Dateien und Android Runtime



Android-Architektur - Android-Entwickler

Android Runtime ist der Ort, an dem die ganze Drecksarbeit erledigt und die DEX-Dateien ausgeführt werden. Es besteht aus zwei Hauptkomponenten:

  • Eine virtuelle Maschine , die die Portabilität des Codes und die Plattformunabhängigkeit nutzt. Ab Android 5.0 (Lollipop) wurde die alte Laufzeit Dalvik Virtual Machine vollständig durch die neue Android RunTime (ART) ersetzt. Dalvik verwendete den JIT-Compiler, während ART die AOT-Kompilierung (Ahead of Time) plus JIT verwendet, um den Code zur Laufzeit zu profilieren.
  • Basisbibliotheken sind Standardbibliotheken für Java und Android. Einfach ausgedrückt befindet sich hier die API-Implementierung.

Die auf dieser Ebene verfügbare Version der API entspricht der Version der Android-Plattform, auf der die Anwendung ausgeführt wird.
Wenn beispielsweise Android 9 (Pie) auf dem tatsächlichen Gerät installiert ist, sind alle APIs bis Stufe 28 verfügbar.

Wenn Sie die wichtigsten Punkte von Android Runtime und die Rolle der API verstehen, sollte die minSdkVersion und Vorwärtskompatibilität sowie die Verwendung von compileSdkVersion , minSdkVersion und targetSdkVersion leicht zu verstehen targetSdkVersion .

compileSdkVersion


Dieser Wert wird nur verwendet, um Gradle mitzuteilen, mit welcher Version des SDK Ihre Anwendung kompiliert werden soll. Auf diese Weise können Entwickler auf alle verfügbaren APIs zugreifen, bis die für compileSdkVersion festgelegte API-Ebene compileSdkVersion .

Das Kompilieren mit dem neuesten SDK wird dringend empfohlen:

  • Dank eines hohen API-Niveaus können Entwickler die neueste API und die Möglichkeiten neuer Plattformen nutzen.
  • Um die neueste Version von SupportLibrary , muss compileSdkVersion mit der Version von SupportLibrary .

Um beispielsweise SupportLibrary-28.xx , muss compileSdkVersion ebenfalls 28 sein.

  • Um zu AndroidX zu wechseln oder es zu verwenden, muss compileSdkVersion auf mindestens 28 eingestellt sein.
  • bereit sein, die Anforderungen der Ziel-API-Ebene von Google Play zu erfüllen. Google hat angekündigt, jedes Jahr eine Mindest-API-Zielstufe für neue Anwendungen und Updates festzulegen, um die neuen Android-Versionen schneller auf dem Google-Markt zu verbreiten. Weitere Informationen finden Sie hier und hier .

Android-Anwendungen sind mit neuen Versionen der Android-Plattform kompatibel, da Änderungen an der API normalerweise additiv sind und die alte API möglicherweise veraltet ist, aber nicht entfernt wird.

Dies bedeutet, dass die direkte Kompatibilität hauptsächlich von der Plattform garantiert wird. Wenn Sie die Anwendung auf einem Gerät mit einer höheren API-Ebene als der in compileSdkVersion angegebenen compileSdkVersion , treten zur Laufzeit keine Probleme auf. Die Anwendung funktioniert wie erwartet neuere Versionen der Plattform.

Zum Beispiel:

Die Anwendung + compileSdkVersion = 26 und die in API-Ebene 26 eingeführte API xyz() -Methode können auf einem Gerät mit Android 8 Oreo (API-Ebene 26) verwendet werden.

Dieselbe Anwendung kann auf einem Gerät mit Android 9 Pie (API-Ebene 28) ausgeführt werden, da die API-Methode xyz() auf API-Ebene 28 weiterhin verfügbar ist.

minSdkVersion


Dieser Wert gibt die minimale API-Ebene an, auf der die Anwendung ausgeführt werden kann. Dies ist eine Mindestanforderung. Wenn nicht angegeben, ist der Standardwert 1 .

Entwickler müssen den richtigen Wert festlegen und den korrekten Betrieb der Anwendung bis zu dieser API-Ebene sicherstellen. Dies wird als Abwärtskompatibilität bezeichnet .

Während der Entwicklung warnt Lint Entwickler auch, wenn sie versuchen, eine API zu verwenden, die unter der in minSdkVersion angegebenen API minSdkVersion . Es ist sehr wichtig, die Warnungen nicht zu ignorieren und zu korrigieren!

Um die Abwärtskompatibilität sicherzustellen, können Entwickler die Version der Plattform zur Laufzeit überprüfen und die neue API in neueren Versionen der Plattform und die alte API in älteren Versionen verwenden oder je nach Fall einige statische Bibliotheken verwenden, die Abwärtskompatibilität bieten.

Es ist auch wichtig zu erwähnen, dass der Google Play Store diesen Wert verwendet, um zu bestimmen, ob die Anwendung auf einem bestimmten Gerät installiert werden kann, indem die Version der Geräteplattform mit der minSdkVersion Anwendung minSdkVersion wird.

Entwickler sollten bei der Auswahl dieses Werts sehr vorsichtig sein, da die Abwärtskompatibilität von der Plattform nicht garantiert wird.

Die Auswahl des „richtigen“ Werts für ein Projekt ist auch eine Geschäftsentscheidung, da sich dies darauf auswirkt, wie groß das Publikum der Anwendung sein wird. Schauen Sie sich die Verteilung der Plattformen an .

Zum Beispiel:

Die Anwendung + compileSdkVersion = 26 + minSdkVersion = 22 und die in API Level 26 eingeführte API xyz() -Methode können auf einem Gerät mit Android 8 Oreo (API Level 26) verwendet werden.

Dieselbe Anwendung kann auf einem älteren Gerät mit Android 5.1 Lollipop (API-Level 22) installiert und ausgeführt werden, auf dem die API-Methode xyz() nicht vorhanden ist. Wenn die Entwickler weder durch Laufzeitprüfungen noch durch Bibliotheken Abwärtskompatibilität bereitgestellt haben, stürzt die Anwendung ab, sobald sie versucht, auf die xyz() API-Methode zuzugreifen.

targetSdkVersion


Dieser Wert gibt die API-Ebene an, auf der die Anwendung entwickelt wurde.

Verwechseln Sie es nicht mit compileSdkVersion . Letzteres wird nur zur Kompilierungszeit verwendet und stellt Entwicklern neue APIs zur Verfügung. Die erste ist dagegen Teil der APK (sowie der minSdkVersion ) und ändert das Verhalten der Laufzeit. Auf diese Weise können Entwickler die direkte Kompatibilität steuern.

Manchmal kann es zu API-Änderungen im Basissystem kommen, die sich auf das Verhalten der Anwendung auswirken können, wenn Sie in einer neuen Laufzeitumgebung arbeiten.

Die Zielanwendungsebene enthält ein Laufzeitverhalten, das für die Plattformversion spezifisch ist. Wenn die Anwendung nicht bereit ist, diese Änderungen am Laufzeitverhalten zu unterstützen, schlägt sie wahrscheinlich fehl.

Ein einfaches Beispiel ist die Runtime Permission , die in Android 6 Marshmallow (API Level 23) eingeführt wurde.

Eine Anwendung kann mithilfe einer API der Ebene 23 kompiliert werden, verfügt jedoch über eine API der Zielebene 22, wenn sie noch nicht bereit ist, das neue Laufzeitberechtigungsmodell zu unterstützen.

Somit kann eine Anwendung weiterhin kompatibel sein, ohne ein neues Laufzeitverhalten einzubeziehen.

Wie bereits erwähnt, benötigt Google in jedem Fall Anwendungen, um die neuen Anforderungen der Ziel-API-Ebene zu erfüllen. Daher sollte die Aktualisierung dieses Werts immer eine hohe Priorität haben.

Wenn wir nun alles zusammenfügen, sehen wir eine klare Beziehung

minSdkVersion ≤ targetSdkVersion ≤ compileSdkVersion

Beachten Sie, dass dringend empfohlen wird, mit der neuesten API- Version zu kompilieren und zu versuchen, targetSdkVersion == compileSdkVersion zu verwenden .

Quellen


Source: https://habr.com/ru/post/de466367/


All Articles