Mehrere APKs für verschiedene API-Ebenen erstellen

Wenn Sie Ihre App bei Google Play veröffentlichen, sollten Sie ein Android App Bundle erstellen und hochladen. In diesem Fall erstellt Google Play automatisch optimierte APKs und stellt sie für die Gerätekonfiguration der einzelnen Nutzer bereit. Dadurch werden nur der Code und die Ressourcen heruntergeladen, die für die Ausführung deiner App erforderlich sind. Die Veröffentlichung mehrerer APKs ist sinnvoll, wenn du nicht bei Google Play veröffentlichst, aber du jedes APK selbst erstellen, signieren und verwalten musst.

Wenn du deine Android-App entwickelst, um mehrere APKs bei Google Play zu nutzen, ist es wichtig, von Anfang an einige bewährte Vorgehensweisen zu berücksichtigen und unnötige Probleme im weiteren Entwicklungsprozess zu vermeiden. In dieser Lektion erfährst du, wie du mehrere APKs deiner App erstellst, die jeweils einen etwas anderen Bereich von API-Levels abdecken. Du wirst auch einige Tools kennenlernen, die die Verwaltung einer Codebasis mit mehreren APKs so einfach wie möglich machen.

Bestätigen, dass Sie mehrere APKs benötigen

Wenn Sie eine Anwendung entwickeln, die auf mehreren Generationen der Android-Plattform funktioniert, möchten Sie natürlich, dass Ihre Anwendung die neuen Funktionen auf neuen Geräten nutzt, ohne die Abwärtskompatibilität zu beeinträchtigen. Auf den ersten Blick mag es so aussehen, als wäre der Support für mehrere APKs die beste Lösung, aber das ist oft nicht der Fall. Im Abschnitt Stattdessen ein einzelnes APK verwenden des Entwicklerhandbuchs für mehrere APKs finden Sie einige nützliche Informationen dazu, wie Sie dies mit einem einzelnen APK erreichen, einschließlich der Verwendung unserer Supportbibliothek. Außerdem erfährst du, wie du Code schreibst, der nur auf bestimmten API-Ebenen in einem einzigen APK ausgeführt wird, ohne auf rechenintensive Techniken wie die Reflexion aus diesem Artikel zurückzugreifen.

Wenn Sie Ihre Anwendung auf ein einzelnes APK beschränken können, hat das mehrere Vorteile:

  • Einfacheres Veröffentlichen und Testen
  • Es muss nur eine Codebasis verwaltet werden
  • Ihre Anwendung kann sich an Änderungen der Gerätekonfiguration anpassen
  • Geräteübergreifende App-Wiederherstellung funktioniert einfach
  • Sie müssen sich keine Gedanken um die Marktpräferenz, das Verhalten von „Upgrades“ von einem APK zum nächsten oder welches APK für welche Geräteklasse machen.

Im Rest dieser Lektion wird davon ausgegangen, dass Sie sich mit dem Thema befasst, sich das Material in den verlinkten Ressourcen sorgfältig angesehen und festgestellt haben, dass mehrere APKs der richtige Weg für Ihre Anwendung sind.

Anforderungen grafisch darstellen

Erstellen Sie zuerst ein einfaches Diagramm, um schnell zu ermitteln, wie viele APKs Sie benötigen und welchen API-Bereich jedes APK abdeckt. Zur praktischen Referenz finden Sie auf der Seite Plattformversionen der Website für Android-Entwickler Daten zur relativen Anzahl aktiver Geräte, auf denen eine bestimmte Version der Android-Plattform ausgeführt wird. Außerdem ist es zwar anfangs einfach, aber es wird schnell schwierig, den Überblick darüber zu behalten, auf welche API-Ebenen jedes APK ausgerichtet ist, insbesondere wenn es Überschneidungen gibt (was oft der Fall ist). Glücklicherweise ist es ganz einfach, Ihre Anforderungen schnell und einfach zu skizzieren und für später als Referenz zu speichern.

Wenn du ein Diagramm mit mehreren APKs erstellen möchtest, beginne mit einer Zeile von Zellen, die die verschiedenen API-Ebenen der Android-Plattform darstellen. Fügen Sie am Ende eine zusätzliche Zelle hinzu, um zukünftige Android-Versionen darzustellen.

3 4 5 6 7 8 9 10 11 12 13 +

Jetzt müssen Sie nur noch das Diagramm farbig markieren, sodass jede Farbe für ein APK steht. Hier ist ein Beispiel dafür, wie du jedes APK auf einen bestimmten Bereich von API-Levels anwenden kannst.

3 4 5 6 7 8 9 10 11 12 13 +

Nachdem Sie dieses Diagramm erstellt haben, geben Sie es an Ihr Team weiter. Die Kommunikation im Team für Ihr Projekt ist jetzt noch einfacher geworden, da Sie sich nicht mehr fragen können, wie es mit dem APK für die API-Level 3 bis 6 oder mit dem Android 1.x-Betriebssystem umgeht. Wie läuft es?“ Sie können einfach sagen: „Wie weit ist das Blue APK?“

Alle gängigen Codes und Ressourcen in einem Bibliotheksprojekt speichern

Ganz gleich, ob Sie eine vorhandene Android-Anwendung ändern oder eine neue erstellen, ist dies das Erste, was Sie mit der Codebasis tun sollten, und bei weitem das Wichtigste. Alles, was in das Bibliotheksprojekt aufgenommen wird, muss nur einmal aktualisiert werden (z. B. sprachlokalisierte Strings, Farbthemen, im gemeinsamen Code behobene Fehler). Das verkürzt die Entwicklungszeit und verringert die Wahrscheinlichkeit von Fehlern, die leicht hätten vermieden werden können.

Hinweis: Die Implementierungsdetails zum Erstellen und Einbinden von Bibliotheksprojekten fallen nicht in den Rahmen dieser Lektion. Weitere Informationen finden Sie unter Android-Bibliothek erstellen.

Wenn du eine vorhandene App für die Verwendung mehrerer APK-Dateien umwandelst, durchsuche deine Codebasis nach allen lokalisierten Stringdateien, Listen von Werten, Designfarben, Menüsymbolen und dem Layout, die sich nicht in den APKs ändern, und füge sie in das Bibliotheksprojekt ein. Code, der sich kaum verändert, sollte auch in das Bibliotheksprojekt integriert werden. Sie werden diese Klassen wahrscheinlich erweitern, um eine oder zwei Methoden von APK zu APK hinzuzufügen.

Wenn Sie die Anwendung jedoch von Grund auf neu erstellen, versuchen Sie zuerst so gut wie möglich, Code im Bibliotheksprojekt zu schreiben, und verschieben Sie ihn dann nur bei Bedarf auf ein individuelles APK. Dies ist auf lange Sicht viel einfacher zu verwalten, als es erst einem, dann einem und dann einem anderen hinzuzufügen und Monate später zu versuchen, herauszufinden, ob dieses Blob in den Bibliotheksabschnitt verschoben werden kann, ohne etwas zu verschrauben.

Neue APK-Projekte erstellen

Für jedes APK, das Sie veröffentlichen möchten, sollte es ein separates Android-Projekt geben. Um die Organisation zu erleichtern, solltest du das Bibliotheksprojekt und alle zugehörigen APK-Projekte im selben übergeordneten Ordner ablegen. Denk auch daran, dass jedes APK denselben Paketnamen haben muss, auch wenn der Paketname nicht unbedingt mit der Bibliothek geteilt werden muss. Wenn Sie drei APKs nach dem oben beschriebenen Schema haben, könnte Ihr Stammverzeichnis so aussehen:

alexlucas:~/code/multi-apks-root$ ls
foo-blue
foo-green
foo-lib
foo-red

Fügen Sie nach dem Erstellen der Projekte das Bibliotheksprojekt jedem APK-Projekt als Referenz hinzu. Definieren Sie nach Möglichkeit die Startaktivität im Bibliotheksprojekt und erweitern Sie diese Aktivität in Ihrem APK-Projekt. Wenn du eine Startaktivität im Bibliotheksprojekt definiert hast, kannst du die gesamte Initialisierung deiner App an einem Ort speichern, damit nicht jedes einzelne APK „universelle“ Aufgaben wie das Initialisieren von Analytics, das Ausführen von Lizenzprüfungen und andere Initialisierungsverfahren, die sich von APK zu APK kaum ändern, noch einmal implementieren muss.

Manifeste anpassen

Wenn ein Nutzer eine App über Google Play herunterlädt, die mehrere APKs verwendet, wird anhand von zwei einfachen Regeln das richtige APK ausgewählt:

  • Im Manifest muss angegeben sein, dass das betreffende APK berechtigt ist.
  • Von den infrage kommenden APKs hat das APK mit der höchsten Versionsnummer Vorrang.

Nehmen wir als Beispiel die oben beschriebenen mehrere APKs und gehen davon aus, dass wir für keines der APKs eine maximale API-Ebene festgelegt haben. Für jedes einzelne APK sieht der mögliche Bereich so aus:

3 4 5 6 7 8 9 10 11 12 13 +
3 4 5 6 7 8 9 10 11 12 13 +
3 4 5 6 7 8 9 10 11 12 13 +

Da ein APK mit einer höheren minSdkVersion auch einen höheren Versionscode haben muss, wissen wir in Bezug auf die versionCode-Werte, dass Rot ≥ Grün ≥ Blau. Daher können wir das Diagramm effektiv so minimieren:

3 4 5 6 7 8 9 10 11 12 13 +

Nehmen wir nun weiter an, dass das Red APK Anforderungen hat, die die anderen beiden nicht haben. Auf der Seite Filter bei Google Play im Android-Entwicklerleitfaden finden Sie eine vollständige Liste möglicher Fehler. Nehmen wir beispielsweise an, dass für Rot eine Frontkamera erforderlich ist. Tatsächlich besteht der Sinn des roten APK darin, die Frontkamera mit süßen neuen Funktionen zu kombinieren, die in API 11 hinzugefügt wurden. Es hat sich jedoch herausgestellt, dass nicht alle Geräte, die API 11 unterstützen, auch Frontkameras haben! Das ist schrecklich!

Wenn ein Nutzer Google Play jedoch von einem solchen Gerät aus besucht, sieht Google Play im Manifest, dass Red die Frontkamera als Anforderung angibt, und ignoriert sie stillschweigend, da festgestellt wurde, dass Red und dieses Gerät nicht zusammenpassen. Dann wird angezeigt, dass Green nicht nur vorwärtskompatibel mit Geräten mit API 11 ist, da kein maxSdkVersion definiert wurde, sondern auch nicht, ob es eine Frontkamera gibt oder nicht. Die App kann weiterhin vom Nutzer bei Google Play heruntergeladen werden, da es trotz des gesamten Fehlers mit der Frontkamera noch ein APK gab, das dieses bestimmte API-Level unterstützt.

Damit alle Ihre APKs in separaten „Tracks“ bleiben, ist ein gutes Versionscode-Schema wichtig. Den empfohlenen Code finden Sie im Bereich Versionscodes unseres Entwicklerleitfadens. Da es sich bei den Beispiel-APKs nur um eine von drei möglichen Dimensionen handelt, reicht es aus, die einzelnen APKs um 1.000 zu trennen, die ersten Ziffern auf die minSdkVersion für das jeweilige APK festzulegen und von dort aus zu inkrementieren. Dies könnte etwa so aussehen:

Blau: 03001, 03002, 03003, 03004…
Grün: 07001, 07002, 07003, 07004...
Rot:11001, 11002, 11003, 11004...

Zusammengenommen sehen Ihre Android-Manifeste in etwa so aus:

Blau:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="03001" android:versionName="1.0" package="com.example.foo">
    <uses-sdk android:minSdkVersion="3" />
    ...

Grün:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="07001" android:versionName="1.0" package="com.example.foo">
    <uses-sdk android:minSdkVersion="7" />
    ...

Rot:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="11001" android:versionName="1.0" package="com.example.foo">
    <uses-sdk android:minSdkVersion="11" />
    ...

Checkliste vor der Veröffentlichung ansehen

Überprüfen Sie die folgenden Punkte, bevor Sie sie bei Google Play hochladen. Denken Sie daran, dass diese für mehrere APKs relevant sind und keinesfalls eine vollständige Checkliste für alle Apps darstellen, die auf Google Play hochgeladen werden.

  • Alle APKs müssen denselben Paketnamen haben
  • Alle APKs müssen mit demselben Zertifikat signiert sein
  • Wenn sich die APKs in der Plattformversion überschneiden, muss das APK mit der höheren minSdkVersion einen höheren Versionscode haben
  • Überprüfe deine Manifestfilter auf widersprüchliche Informationen. Ein APK, das Cupcake auf XLARGE-Bildschirmen nur unterstützt, wird von niemandem gesehen werden.
  • Das Manifest jedes APK muss für mindestens einen unterstützten Bildschirm, eine unterstützte OpenGL-Textur oder eine Plattformversion eindeutig sein
  • Testen Sie jedes APK auf mindestens einem Gerät. Ansonsten ist auf Ihrem Entwicklungscomputer einer der am besten anpassbaren Geräteemulatoren der Branche installiert. Viel Spaß!

Es lohnt sich auch, das kompilierte APK zu prüfen, bevor Sie es auf den Markt bringen, um sicherzustellen, dass es keine Überraschungen gibt, die Ihre App bei Google Play verstecken könnten. Mit dem Tool "aapt" geht das ganz einfach. Aapt (Android Asset Packaging Tool) ist Teil des Build-Prozesses zum Erstellen und Verpacken Ihrer Android-Anwendungen und auch ein sehr praktisches Tool zum Prüfen derselben.

>aapt dump badging
package: name='com.example.hello' versionCode='1' versionName='1.0'
sdkVersion:'11'
uses-permission:'android.permission.SEND_SMS'
application-label:'Hello'
application-icon-120:'res/drawable-ldpi/icon.png'
application-icon-160:'res/drawable-mdpi/icon.png'
application-icon-240:'res/drawable-hdpi/icon.png'
application: label='Hello' icon='res/drawable-mdpi/icon.png'
launchable-activity: name='com.example.hello.HelloActivity'  label='Hello' icon=''
uses-feature:'android.hardware.telephony'
uses-feature:'android.hardware.touchscreen'
main
supports-screens: 'small' 'normal' 'large' 'xlarge'
supports-any-density: 'true'
locales: '--_--'
densities: '120' '160' '240'

Prüfen Sie bei der Prüfung der aapt-Ausgabe, ob es keine in Konflikt stehenden Werte für „supports-screens“ und „compatible-screens“ gibt und ob keine unbeabsichtigten „uses-feature“-Werte vorhanden sind, die aufgrund von Berechtigungen hinzugefügt wurden, die Sie im Manifest festgelegt haben. Im Beispiel oben ist das APK nicht für sehr viele Geräte sichtbar.

Was steckt dahinter? Durch das Hinzufügen der erforderlichen Berechtigung SEND_SMS wurde die Funktionsanforderung von „android.hardware.telephony“ implizit hinzugefügt. Da API 11 Honeycomb ist (die speziell für Tablets optimierte Android-Version) und keine Honeycomb-Geräte Telefoniehardware haben, wird dieses APK von Google Play in allen Fällen herausgefiltert, bis zukünftige Geräte mit einem höheren API-Level UND Telefoniehardware auf den Markt kommen.

Dieses Problem lässt sich leicht beheben, indem du Folgendes zu deinem Manifest hinzufügst:

<uses-feature android:name="android.hardware.telephony" android:required="false" />

Die android.hardware.touchscreen-Anforderung wird ebenfalls implizit hinzugefügt. Wenn Ihr APK auf Fernsehern ohne Touchscreen angezeigt werden soll, fügen Sie Ihrem Manifest Folgendes hinzu:

<uses-feature android:name="android.hardware.touchscreen" android:required="false" />

Nachdem Sie die Checkliste vor der Veröffentlichung durchgegangen sind, laden Sie Ihre APKs bei Google Play hoch. Es kann etwas dauern, bis die App bei der Suche in Google Play angezeigt wird. Wenn das der Fall ist, führen Sie noch eine letzte Prüfung durch. Laden Sie die Anwendung auf alle Testgeräte herunter, die Sie haben, um sicherzustellen, dass die APKs auf die gewünschten Geräte ausgerichtet sind. Herzlichen Glückwunsch, Sie haben alles erledigt.