Mehrere APKs für verschiedene Bildschirmgrößen erstellen

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

Wenn Sie bei der Entwicklung Ihrer Android-App die Vorteile mehrerer APKs bei Google Play nutzen möchten, ist es wichtig, von Anfang an einige Best Practices anzunehmen und unnötige Probleme im weiteren Verlauf des Entwicklungsprozesses zu vermeiden. In dieser Lektion erfährst du, wie du mehrere APKs deiner App erstellst, die jeweils eine andere Klasse von Bildschirmgrößen abdecken. Außerdem erhalten Sie einige Tools, die erforderlich sind, um die Verwaltung einer Codebasis mit mehreren APKs so einfach wie möglich zu gestalten.

Prüfen, ob Sie mehrere APKs benötigen

Wenn Sie versuchen, eine App zu erstellen, die auf Android-Geräten unterschiedlicher Größen funktioniert, möchten Sie natürlich, dass Ihre App den gesamten verfügbaren Speicherplatz auf größeren Geräten ausnutzen kann, ohne die Kompatibilität oder Nutzerfreundlichkeit auf kleineren Bildschirmen zu beeinträchtigen. Zu Beginn scheint es so, als ob die Unterstützung mehrerer APKs die beste Lösung ist, aber das ist oft nicht der Fall. Im Abschnitt Verwenden eines einzelnen APKs des Entwicklerhandbuchs für mehrere APKs finden Sie einige nützliche Informationen dazu, wie Sie dies mit einem einzelnen APK erreichen können, einschließlich unserer Supportbibliothek. Sie sollten auch den Leitfaden zur Unterstützung mehrerer Bildschirme lesen. Es gibt sogar eine Supportbibliothek, die Sie mit dem Android SDK herunterladen können. Damit können Sie Fragmente auf Geräten verwenden, die vor Honeycomb verfügbar waren. Dadurch wird die Unterstützung mehrerer Bildschirme in einem einzelnen APK erheblich erleichtert.

Wenn Sie es verwalten können, bietet es mehrere Vorteile, Ihre App auf ein einzelnes APK zu beschränken:

  • Einfacheres Veröffentlichen und Testen
  • Es muss nur eine Codebasis verwaltet werden
  • Deine App kann sich an Änderungen der Gerätekonfiguration anpassen
  • App-Wiederherstellung auf allen Geräten funktioniert einfach
  • Sie müssen sich keine Gedanken über die Marktpräferenz, 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 das Thema recherchiert, das Material in die verlinkten Ressourcen aufgenommen und entschieden haben, dass Sie mehrere APKs für Ihre App verwenden.

Anforderungen im Diagramm darstellen

Erstellen Sie zuerst ein einfaches Diagramm, um schnell zu ermitteln, wie viele APKs Sie benötigen und welche Bildschirmgröße(n) jedes APK abdeckt. Glücklicherweise ist es einfach, Ihre Anforderungen schnell und einfach zu skizzieren und als Referenz für später verfügbar zu machen. 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

Jetzt müssen Sie nur noch eine Farbe im Diagramm festlegen, sodass jede Farbe ein APK repräsentiert. Hier ist ein Beispiel, wie Sie jedes APK auf bestimmte Bildschirmgrößen anwenden können.

klein normal groß xlarge

Je nach Ihren Anforderungen können Sie auch zwei APKs haben, „small and All else“ oder „xlarge and Allthing else“. Das Einfärben im Diagramm erleichtert auch die Kommunikation innerhalb des Teams. Sie können jetzt jedes APK als „Blau“, „Grün“ oder „Rot“ bezeichnen, unabhängig davon, wie viele verschiedene Bildschirmtypen es abdecken.

Alle gängigen Codes und Ressourcen in einem Bibliotheksprojekt platzieren

Unabhängig davon, ob Sie eine vorhandene Android-App modifizieren oder eine neue App erstellen möchten, ist dies das Erste, was Sie mit der Codebasis tun sollten, und ist bei Weitem der wichtigste. Alles, was in das Bibliotheksprojekt einfließt, muss nur einmal aktualisiert werden (z. B. sprachspezifische Strings, Farbthemen, behobene Fehler im gemeinsam genutzten Code). Dadurch wird die Entwicklungszeit verkürzt und die Wahrscheinlichkeit von Fehlern reduziert, die sich einfach vermeiden lassen.

Hinweis:Die Implementierungsdetails zum Erstellen und Einbinden von Bibliotheksprojekten werden in dieser Lektion nicht behandelt. Mit Android-Bibliothek erstellen können Sie sich jedoch schnell einarbeiten.

Wenn Sie eine bestehende App konvertieren, um die Unterstützung für mehrere APKs zu verwenden, durchsuchen Sie Ihre Codebasis nach jeder lokalisierten Stringdatei, einer Liste von Werten, Designs, Menüsymbolen und einem Layout, die sich in den APKs nicht ändern sollen, und fügen Sie alles im Bibliotheksprojekt ein. Code, der sich kaum ändert, sollte auch in das Bibliotheksprojekt Wahrscheinlich werden Sie diese Klassen um eine oder zwei Methoden von APK zu APK erweitern.

Wenn Sie die App hingegen von Grund auf neu erstellen, versuchen Sie so viel wie möglich, zuerst Code in das Bibliotheksprojekt zu schreiben, und verschieben Sie diese dann nur bei Bedarf in ein einzelnes APK. Das ist auf lange Sicht viel einfacher zu verwalten, als den Blob zu einem und dann einem anderen hinzuzufügen und dann Monate später herauszufinden, ob dieses Blob in den Bibliotheksabschnitt verschoben werden kann, ohne irgendetwas zu beeinträchtigen.

Neue APK-Projekte erstellen

Für jedes APK, das du veröffentlichen möchtest, sollte es ein separates Android-Projekt geben. Zur einfacheren Organisation solltest du das Bibliotheksprojekt und alle zugehörigen APK-Projekte unter demselben übergeordneten Ordner ablegen. Denken Sie auch daran, dass jedes APK denselben Paketnamen haben muss, auch wenn nicht unbedingt der Paketname an die Bibliothek weitergegeben werden muss. Wenn Sie nach dem oben beschriebenen Schema drei APKs 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 als Referenz zu jedem APK-Projekt hinzu. Definieren Sie nach Möglichkeit Ihre Startaktivität im Bibliotheksprojekt und erweitern Sie diese Aktivität in Ihrem APK-Projekt. Wenn Sie eine Startaktivität im Bibliotheksprojekt definiert haben, können Sie die gesamte Initialisierung Ihrer App an einem Ort speichern. So muss nicht jedes einzelne APK „universelle“ Aufgaben wie das Initialisieren von Analytics, das Ausführen von Lizenzüberprüfungen und andere Initialisierungsverfahren, die sich von APK zu APK kaum ändern, neu implementieren.

Manifeste anpassen

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

  • Das Manifest muss zeigen, dass das jeweilige APK berechtigt ist
  • Die höchste Versionsnummer der zulässigen APKs gewinnt

Nehmen wir beispielsweise die zuvor beschriebenen APKs und gehen davon aus, dass jedes APK alle Bildschirmgrößen unterstützt, die größer als seine "Ziel"-Bildschirmgröße sind. Einzeln betrachtet sähe der mögliche Bereich der einzelnen APKs so aus:

klein normal groß xlarge
klein normal groß xlarge
klein normal groß xlarge

Wenn wir jedoch bei Verwendung der Regel mit der höchsten Versionsnummer für jedes APK das Attribut „versionCode“ so einstellen, dass Rot ≥ Grün ≥ Blau festgelegt ist, wird das Diagramm praktisch so reduziert:

klein normal groß xlarge

Gehen wir nun weiter davon aus, dass das rote APK bestimmte Anforderungen hat, die die anderen beiden nicht erfüllen. Auf der Seite Filter bei Google Play im Android-Entwicklerleitfaden finden Sie eine vollständige Liste der möglichen Schuldige. Nehmen wir beispielsweise an, dass für Rot eine Frontkamera erforderlich ist. Der Sinn des roten APK besteht darin, den zusätzlichen verfügbaren Platz auf dem Bildschirm für unterhaltsame Dinge mit der Frontkamera zu nutzen. Aber es hat sich herausgestellt, dass nicht alle XL-Geräte auch Frontkameras haben! Das Grauen!

Glücklicherweise sieht sich Google Play das Manifest an, wenn ein Nutzer Google Play über ein solches Gerät surft, sieht, dass Red die Frontkamera als Anforderung auflistet, und ignoriert sie leise, da sie festgestellt hat, dass Rot und dieses Gerät keine Übereinstimmung im digitalen Himmel sind. Dann wird festgestellt, dass Green nicht nur mit XL-Geräten kompatibel ist, sondern dass es auch keine Rolle spielt, ob eine Frontkamera vorhanden ist. Die App kann weiterhin vom Nutzer bei Google Play heruntergeladen werden, da es trotz des Fehlers mit der Frontkamera ein APK gab, das diese spezielle Bildschirmgröße unterstützt.

Damit alle Ihre APKs auf separaten Tracks bleiben, ist es wichtig, ein gutes Versionscodeschema zu haben. Die empfohlene Version finden Sie im Bereich Versionscodes unseres Entwicklerhandbuchs. Da die Beispiel-APKs nur eine von drei möglichen Dimensionen behandeln, reicht es aus, die einzelnen APKs durch 1.000 zu trennen und von dort weiter zu erhöhen. Das könnte so aussehen:

Blau: 1001, 1002, 1003, 1004...
Grün: 2001, 2002, 2003, 2004...
Rot:3001, 3002, 3003, 3004...

Wenn alles zusammengenommen würde, würde Ihr Android-Manifest wahrscheinlich in etwa so aussehen:

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 "support-screens" oder mit dem Tag "compatible-screens". Im Allgemeinen wird die Unterstützung von Bildschirmen bevorzugt, und es ist generell nicht empfehlenswert, beide Tags im selben Manifest zu verwenden. Sie macht die Dinge unnötig kompliziert und erhöht die Fehleranfälligkeit. Beachten Sie auch, dass die Manifeste den Wert für jede Bildschirmgröße explizit festlegen, anstatt die Standardwerte zu nutzen (klein und normal sind standardmäßig immer „true“). So können Sie sich später Kopfzerbrechen ersparen. In einem Manifest mit einem Ziel-SDK von < 9 wird z. B. „xlarge“ automatisch auf „false“ gesetzt, da diese Größe noch nicht vorhanden war. Seien Sie also bitte explizit!

Checkliste vor dem Start prüfen

Überprüfen Sie vor dem Hochladen bei Google Play die folgenden Punkte. Diese sind für mehrere APKs relevant und stellen keineswegs eine vollständige Checkliste für alle Apps dar, die bei Google Play hochgeladen werden.

  • Alle APKs müssen denselben Paketnamen haben
  • Alle APKs müssen mit demselben Zertifikat signiert sein.
  • Jede Bildschirmgröße, die von deinem APK unterstützt werden soll, im Manifest auf „true“ gesetzt. Setzen Sie jede Bildschirmgröße, die vermieden werden soll,
  • Überprüfe deine Manifest-Filter auf widersprüchliche Informationen. Ein APK, das Cupcake nur auf XLARGE-Bildschirmen unterstützt, kann niemand sehen.
  • Das Manifest jedes APK muss für mindestens eine unterstützte Bildschirm-, OpenGL-Textur- oder Plattformversion eindeutig sein.
  • Testen Sie jedes APK auf mindestens einem Gerät. Abgesehen davon haben Sie einen der am besten anpassbaren Geräteemulatoren der Branche auf Ihrem Entwicklungscomputer. Mach mal was!

Es lohnt sich auch, das kompilierte APK vor der Veröffentlichung zu überprüfen, um sicherzustellen, dass Ihre App bei Google Play keine Überraschungen verbirgt. Mit dem Tool „aapt“ geht dies ziemlich einfach. Aapt (das Android Asset Packaging Tool) ist Teil des Build-Prozesses zum Erstellen und Packen Ihrer Android-Anwendungen und außerdem ein sehr praktisches Tool für die Prüfung.

>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'

Achten Sie bei der Überprüfung der aapt-Ausgabe darauf, dass Sie keine widersprüchlichen Werte für „supports-screens“ und „compatible-screens“ sowie keine unbeabsichtigten „uses-feature“-Werte haben, die als Ergebnis von im Manifest festgelegten Berechtigungen hinzugefügt wurden. Im Beispiel oben ist das APK für die meisten, wenn nicht sogar für alle Geräte, nicht sichtbar.

Warum? Durch Hinzufügen der erforderlichen Berechtigung „SEND_SMS“ wurde die Funktionsanforderung von „android.hardware.telephony“ implizit hinzugefügt. Da es sich bei den meisten (wenn nicht allen) großen Geräten um Tablets ohne Telefonie-Hardware handelt, filtert Google Play dieses APK in diesen Fällen heraus, bis zukünftige Geräte verfügbar sind, die beide groß genug sind, um als XLarge-Bildschirm zu melden und über Telefoniehardware verfügen.

Zum Glück lässt sich dies leicht beheben, indem Sie Ihrem Manifest Folgendes hinzufügen:

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

Die android.hardware.touchscreen-Anforderung wird ebenfalls implizit hinzugefügt. Wenn Sie möchten, dass Ihr APK auf Fernsehern sichtbar ist, die keine Touchscreen-Geräte sind, fügen Sie Ihrem Manifest Folgendes hinzu:

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

Wenn du die Checkliste vor dem Start abgearbeitet hast, lade deine APKs bei Google Play hoch. Es kann etwas dauern, bis die App beim Stöbern bei Google Play angezeigt wird. Führen Sie in diesem Fall jedoch eine letzte Überprüfung durch. Lade die App auf alle Testgeräte herunter, um sicherzugehen, dass die APKs auf die gewünschten Geräte ausgerichtet sind.

Weitere Informationen zum Veröffentlichen mehrerer APKs bei Google Play findest du unter Unterstützung für mehrere APKs.