Wenn Sie Ihre App bei Google Play veröffentlichen, sollten Sie ein Android App Bundle erstellen und hochladen. In diesem Fall generiert und stellt Google Play automatisch optimierte APKs für die Gerätekonfiguration jedes Nutzers bereit. So werden nur die Code- und Ressourcen heruntergeladen, die zum Ausführen Ihrer App erforderlich sind. Die Veröffentlichung mehrerer APKs ist nützlich, wenn Sie Ihre App nicht bei Google Play veröffentlichen, aber jedes APK selbst erstellen, signieren und verwalten müssen.
Wenn Sie Ihre Android-Anwendung so entwickeln, dass Sie mehrere APKs bei Google Play nutzen können, sollten Sie von Anfang an einige Best Practices beachten, um spätere Probleme zu vermeiden. In dieser Lektion erfahren Sie, wie Sie mehrere APKs Ihrer App erstellen, die jeweils eine andere Bildschirmgröße abdecken. Außerdem lernen Sie einige Tools kennen, mit denen Sie die Pflege einer Codebasis mit mehreren APKs so einfach wie möglich gestalten können.
Prüfen, ob mehrere APKs erforderlich sind
Wenn Sie eine App entwickeln, die auf verschiedenen Android-Geräten mit unterschiedlichen Bildschirmgrößen funktioniert, soll sie natürlich den gesamten verfügbaren Platz auf größeren Geräten nutzen, ohne Kompromisse bei Kompatibilität oder Nutzerfreundlichkeit auf kleineren Bildschirmen einzugehen. 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. Lesen Sie auch den Leitfaden zur Unterstützung mehrerer Bildschirme. Es gibt sogar eine Supportbibliothek, die Sie über das Android SDK herunterladen können. Damit können Sie Fragmente auf Geräten vor Honeycomb verwenden, was die Unterstützung mehrerer Bildschirme in einem einzigen APK erheblich erleichtert.
Wenn Sie Ihre Anwendung auf ein einzelnes APK beschränken können, hat das mehrere Vorteile, darunter:
- Einfachere Veröffentlichung und Tests
- 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 über Marktpräferenzen, das Verhalten von „Upgrades“ von einem APK auf das nächste oder darüber machen, welches APK zu welcher Geräteklasse gehört.
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 skizzieren
Erstellen Sie zuerst ein einfaches Diagramm, um schnell zu ermitteln, wie viele APKs Sie benötigen und welche Bildschirmgrößen jedes APK abdeckt. Glücklicherweise ist es ganz einfach, Ihre Anforderungen schnell und einfach zu skizzieren und als Referenz für später aufzubewahren. Beginnen Sie mit einer Zeile von Zellen, die die verschiedenen Bildschirmgrößen darstellen, die auf der Android-Plattform verfügbar sind.
klein | normal | groß | xlarge |
Färben Sie das Diagramm nun so ein, dass jede Farbe ein APK darstellt. Hier ein Beispiel dafür, wie Sie jedes APK auf einen bestimmten Bereich von Bildschirmgrößen anwenden können.
klein | normal | groß | xlarge |
Je nach Bedarf können Sie auch zwei APKs haben, „klein und alle anderen“ oder „xlarge und alle anderen“. Die Farbgebung im Diagramm erleichtert auch die Kommunikation innerhalb des Teams. Sie können jetzt einfach auf jede APK als „blau“, „grün“ oder „rot“ verweisen, unabhängig davon, wie viele verschiedene Bildschirmtypen sie abdeckt.
Alle gängigen Code- und Ressourcen in ein Bibliotheksprojekt einfügen
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 Sie eine vorhandene Anwendung so konvertieren, dass sie mehrere APKs unterstützt, durchsuchen Sie Ihre Codebasis nach jeder lokalisierten Stringdatei, Werteliste, Themenfarbe, Menüsymbol und Layout, die sich nicht in den APKs ändern, und fügen Sie sie dem Bibliotheksprojekt hinzu. Code, der sich nicht wesentlich ändern wird, sollte ebenfalls in das Bibliotheksprojekt aufgenommen werden. Sie werden diese Klassen wahrscheinlich erweitern, um eine oder zwei Methoden von APK zu APK hinzuzufügen.
Wenn Sie die Anwendung hingegen von Grund auf neu erstellen, sollten Sie zuerst Code im Bibliotheksprojekt schreiben und ihn dann nur bei Bedarf in ein einzelnes APK verschieben. Das ist auf lange Sicht viel einfacher, als ihn erst einem, dann einem anderen und dann noch einem anderen hinzuzufügen und dann Monate später herauszufinden, ob dieser Blob in den Bibliotheksabschnitt verschoben werden kann, ohne etwas zu vermasseln.
Neue APK-Projekte erstellen
Für jedes APK, das Sie veröffentlichen möchten, sollte ein separates Android-Projekt vorhanden sein. Für eine einfache Organisation sollten Sie das Bibliotheksprojekt und alle zugehörigen APK-Projekte im selben übergeordneten Ordner ablegen. Denken Sie auch daran, dass jedes APK denselben Paketnamen haben muss, der aber nicht unbedingt mit dem der Bibliothek übereinstimmen muss. Wenn Sie drei APKs gemäß 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 Sie im Bibliotheksprojekt eine Startaktivität definieren, können Sie die gesamte Anwendungsinitialisierung an einem Ort zusammenfassen. So müssen in jedem einzelnen APK nicht wieder „universelle“ Aufgaben wie die Initialisierung von Analytics, die Durchführung von Lizenzprüfungen und andere Initialisierungsverfahren implementiert werden, die sich von APK zu APK nicht wesentlich ändern.
Manifeste anpassen
Wenn ein Nutzer eine Anwendung herunterlädt, die mehrere APKs verwendet, wird die richtige APK anhand von zwei einfachen Regeln 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 jedes APK so konfiguriert ist, dass alle Bildschirmgrößen unterstützt werden, die größer als die „Ziel“-Bildschirmgröße sind. Im Einzelnen sieht der mögliche Bereich für jedes APK so aus:
klein | normal | groß | xlarge |
klein | normal | groß | xlarge |
klein | normal | groß | xlarge |
Wenn wir jedoch die Regel „Höchste Versionsnummer gewinnt“ anwenden und das Attribut „versionCode“ in jedem APK so festlegen, dass rot ≥ grün ≥ blau ist, sieht das Diagramm so aus:
klein | normal | groß | xlarge |
Angenommen, das rote APK hat eine Anforderung, die die anderen beiden nicht haben. Auf der Seite Filter bei Google Play des Android-Entwicklerleitfadens finden Sie eine vollständige Liste möglicher Ursachen. Angenommen, Rot benötigt eine Frontkamera. Der rote APK dient dazu, den zusätzlichen Bildschirmplatz zu nutzen, um mit der Frontkamera unterhaltsame Dinge zu tun. Aber wie sich herausstellte, haben nicht alle Geräte im Extralarge-Format überhaupt eine Frontkamera. 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. Es wird dann festgestellt, dass „Grün“ nicht nur mit Geräten im „XLarge“-Format kompatibel ist, sondern auch nicht darauf achtet, ob eine Frontkamera vorhanden ist. Die App kann vom Nutzer weiterhin bei Google Play heruntergeladen werden, da es trotz des ganzen Ärgers mit der Frontkamera noch ein APK gab, das diese bestimmte Bildschirmgröße unterstützte.
Damit alle Ihre APKs in separaten „Tracks“ bleiben, ist ein gutes Versionscode-Schema wichtig. Die empfohlene Version findest du im Abschnitt Versionscodes unseres Entwicklerhandbuchs. 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 und von dort aus zu inkrementieren. Das könnte so aussehen:
Blau: 1001, 1002, 1003, 1004…
Grün: 2001, 2002, 2003, 2004…
Rot:3001, 3002, 3003, 3004…
Zusammengenommen sehen Ihre Android-Manifeste in etwa so aus:
Blau:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1001" android:versionName="1.0" package="com.example.foo"> <supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:xlargeScreens="true" /> ...
Grün:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="2001" android:versionName="1.0" package="com.example.foo"> <supports-screens android:smallScreens="false" android:normalScreens="false" android:largeScreens="true" android:xlargeScreens="true" /> ...
Rot:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="3001" android:versionName="1.0" package="com.example.foo"> <supports-screens android:smallScreens="false" android:normalScreens="false" android:largeScreens="false" android:xlargeScreens="true" /> ...
Technisch gesehen funktionieren mehrere APKs entweder mit dem Tag „supports-screens“ oder dem Tag „compatible-screens“. „supports-screens“ wird in der Regel bevorzugt. Es ist in der Regel keine gute Idee, beide Tags im selben Manifest zu verwenden. Das macht die Dinge unnötig kompliziert und erhöht die Wahrscheinlichkeit von Fehlern. Beachten Sie auch, dass anstelle der Standardwerte (small und normal sind standardmäßig immer wahr) in den Manifesten der Wert für jede Bildschirmgröße explizit festgelegt wird. So können Sie sich später Ärger ersparen. Bei einem Manifest mit einem Ziel-SDK von weniger als 9 wird „xlarge“ beispielsweise automatisch auf „false“ gesetzt, da diese Größe noch nicht existierte. Seien Sie also konkret.
Checkliste vor dem Start prüfen
Prüfen Sie vor dem Hochladen bei Google Play die folgenden Punkte. Denken Sie daran, dass diese Punkte speziell für mehrere APKs relevant sind und keine 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.
- Legen Sie für jede Bildschirmgröße, die Ihr APK unterstützen soll, im Manifest „true“ fest. Legen Sie für jede Bildschirmgröße, die nicht verwendet werden soll, den Wert „false“ fest.
- Prüfen Sie Ihre Manifestfilter auf widersprüchliche Informationen. Ein APK, das nur Cupcake auf XLARGE-Displays unterstützt, wird von niemandem gesehen.
- Das Manifest jedes APKs muss für mindestens eine der unterstützten Bildschirm-, OpenGL-Textur- oder Plattformversionen eindeutig sein.
- Testen Sie jedes APK auf mindestens einem Gerät. Andernfalls haben Sie auf Ihrem Entwicklungscomputer einen der am besten anpassbaren Geräteemulatoren der Branche. Viel Spaß!
Es empfiehlt sich auch, das kompilierte APK vor der Markteinführung zu prüfen, um sicherzugehen, dass es keine Überraschungen gibt, die Ihre App bei Google Play verbergen könnten. Mit dem Tool „aapt“ ist 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: '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 für die meisten, wenn nicht für alle Geräte unsichtbar.
Was steckt dahinter? Durch das Hinzufügen der erforderlichen Berechtigung „SEND_SMS“ wurde die Funktionsanforderung „android.hardware.telephony“ implizit hinzugefügt. Da die meisten (wenn nicht alle) Geräte mit sehr großer Bildschirmgröße Tablets ohne Telefonhardware sind, wird dieses APK in diesen Fällen von Google Play herausgefiltert, bis zukünftige Geräte auf den Markt kommen, die groß genug sind, um als sehr große Bildschirmgröße gemeldet zu werden, und über Telefonhardware verfügen.
Glücklicherweise lässt sich das Problem ganz einfach beheben, indem Sie Ihrem Manifest Folgendes hinzufügen:
<uses-feature android:name="android.hardware.telephony" android:required="false" />
Die Anforderung für android.hardware.touchscreen
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. Führen Sie dann 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.
Weitere Informationen zum Veröffentlichen mehrerer APKs bei Google Play finden Sie unter Unterstützung für mehrere APKs.