App-Größe reduzieren

Nutzer scheuen sich oft, zu große Apps herunterzuladen, insbesondere in Schwellenländern, in denen Geräte mit unzuverlässigen 2G- und 3G-Netzwerken verbunden sind oder Nutzer Tarife mit Datenlimits haben. Auf dieser Seite wird beschrieben, wie Sie die Downloadgröße Ihrer App reduzieren können, damit mehr Nutzer Ihre App herunterladen können.

App mit Android App Bundles hochladen

Laden Sie Ihre App als Android App Bundle hoch, um die App-Größe sofort zu reduzieren, wenn Sie die App bei Google Play veröffentlichen. Ein Android App Bundle ist ein Uploadformat, das den gesamten kompilierten Code und alle Ressourcen Ihrer App enthält. Die APK-Generierung und -Signierung werden jedoch an Google Play übertragen.

Das App-Bereitstellungsmodell von Google Play verwendet dann Ihr App-Bundle, um optimierte APKs für die Gerätekonfiguration jedes Nutzers zu generieren und bereitzustellen. So laden Nutzer nur den Code und die Ressourcen herunter, die sie zum Ausführen Ihrer App benötigen. Sie müssen nicht mehrere APKs erstellen, signieren und verwalten, um verschiedene Geräte zu unterstützen, und Nutzer erhalten kleinere, optimierte Downloads.

Bei Google Play gilt für Apps, die mit App-Bundles veröffentlicht werden, eine Beschränkung der komprimierten Downloadgröße von 200 MB. Mit Play Feature Delivery und Play Asset Delivery sind größere Größen möglich. Wenn Sie die Größe Ihrer App jedoch erhöhen, kann sich das negativ auf die Installationserfolgsrate auswirken und die Anzahl der Deinstallationen kann steigen. Wir empfehlen Ihnen daher, die auf dieser Seite beschriebenen Richtlinien anzuwenden, um die Downloadgröße Ihrer App so weit wie möglich zu reduzieren.

APK-Struktur

Bevor Sie die Größe Ihrer App reduzieren, sollten Sie sich mit der Struktur des APK einer App vertraut machen. Eine APK-Datei besteht aus einem ZIP-Archiv, das alle Dateien enthält, aus denen Ihre App besteht. Dazu gehören Java-Klassendateien, Ressourcendateien und eine Datei mit kompilierten Ressourcen.

Ein APK enthält die folgenden Verzeichnisse:

  • META-INF/: Enthält die Signaturdateien CERT.SF und CERT.RSA sowie die Manifestdatei MANIFEST.MF.
  • assets/: Enthält die Assets der App, die die App mit einem AssetManager-Objekt abrufen kann.
  • res/: Enthält Ressourcen, die nicht in resources.arsc kompiliert werden.
  • lib/: Enthält den kompilierten Code, der für die Softwareschicht eines Prozessors spezifisch ist. Dieses Verzeichnis enthält ein Unterverzeichnis für jeden Plattformtyp, z. B. armeabi, armeabi-v7a, arm64-v8a, x86, x86_64 und mips.

Eine APK enthält auch die folgenden Dateien. Nur AndroidManifest.xml ist obligatorisch:

  • resources.arsc: Enthält kompilierte Ressourcen. Diese Datei enthält den XML-Inhalt aller Konfigurationen des Ordners res/values/. Das Verpackungstool extrahiert diesen XML-Inhalt, kompiliert ihn in binärer Form und archiviert den Inhalt. Dazu gehören Sprach-Strings und ‑Stile sowie Pfade zu Inhalten, die nicht direkt in der Datei resources.arsc enthalten sind, z. B. Layoutdateien und Bilder.
  • classes.dex: Enthält die Klassen, die im DEX-Dateiformat kompiliert wurden, das von der virtuellen Dalvik- oder ART-Maschine verstanden wird.
  • AndroidManifest.xml: Enthält die Android-Manifestdatei. In dieser Datei werden Name, Version, Zugriffsrechte und referenzierte Bibliotheksdateien der App aufgeführt. Die Datei verwendet das binäre XML-Format von Android.

Anzahl und Größe der Ressourcen reduzieren

Die Größe Ihrer APK wirkt sich darauf aus, wie schnell Ihre App geladen wird, wie viel Arbeitsspeicher sie verwendet und wie viel Strom sie verbraucht. Sie können die Größe Ihrer APK reduzieren, indem Sie die Anzahl und Größe der darin enthaltenen Ressourcen verringern. Insbesondere können Sie Ressourcen entfernen, die von Ihrer App nicht mehr verwendet werden, und skalierbare Drawable-Objekte anstelle von Bilddateien verwenden. In diesem Abschnitt werden diese Methoden und andere Möglichkeiten zum Reduzieren der Ressourcen in Ihrer App beschrieben, um die Gesamtgröße Ihres APK zu verringern.

Nicht verwendete Ressourcen entfernen

Das Tool lint, ein statischer Code-Analyzer, der in Android Studio enthalten ist, erkennt Ressourcen in Ihrem Ordner res/, auf die in Ihrem Code nicht verwiesen wird. Wenn das lint-Tool eine potenziell nicht verwendete Ressource in Ihrem Projekt findet, wird eine Meldung wie im folgenden Beispiel ausgegeben:

res/layout/preferences.xml: Warning: The resource R.layout.preferences appears
    to be unused [UnusedResources]

Bibliotheken, die Sie Ihrem Code hinzufügen, enthalten möglicherweise ungenutzte Ressourcen. Gradle kann Ressourcen automatisch für Sie entfernen, wenn Sie shrinkResources in der Datei build.gradle.kts Ihrer App aktivieren.

Kotlin

android {
    // Other settings.

    buildTypes {
        getByName("release") {
            minifyEnabled = true
            shrinkResources = true
            proguardFiles(getDefaultProguardFile('proguard-android.txt'), "proguard-rules.pro")
        }
    }
}

Groovy

android {
    // Other settings.

    buildTypes {
        release {
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

Um shrinkResources zu verwenden, müssen Sie die Codeverkleinerung aktivieren. Während des Build-Prozesses entfernt R8 zuerst ungenutzten Code. Anschließend werden die nicht verwendeten Ressourcen vom Android-Gradle-Plug-in entfernt.

Weitere Informationen zum Verkleinern von Code und Ressourcen sowie zu anderen Methoden, mit denen Android Studio die APK-Größe reduziert, finden Sie unter App verkleinern, verschleiern und optimieren.

Im Android-Gradle-Plug-in 7.0 und höher können Sie die Konfigurationen deklarieren, die von Ihrer App unterstützt werden. Gradle übergibt diese Informationen mithilfe des resourceConfigurations-Flavors und der Option defaultConfig an das Build-System. Das Build-System verhindert dann, dass Ressourcen aus anderen nicht unterstützten Konfigurationen im APK enthalten sind, wodurch die Größe des APKs reduziert wird. Weitere Informationen zu diesem Feature finden Sie unter Nicht verwendete alternative Ressourcen entfernen.

Ressourcennutzung durch Bibliotheken minimieren

Bei der Entwicklung einer Android-App verwenden Sie in der Regel externe Bibliotheken, um die Benutzerfreundlichkeit und Vielseitigkeit Ihrer App zu verbessern. Sie können beispielsweise auf AndroidX verweisen, um die Nutzerfreundlichkeit auf älteren Geräten zu verbessern, oder Google Play-Dienste verwenden, um automatische Übersetzungen für Text in Ihrer App abzurufen.

Wenn eine Bibliothek für einen Server oder Desktop entwickelt wurde, kann sie viele Objekte und Methoden enthalten, die Ihre App nicht benötigt. Wenn Sie nur die Teile der Bibliothek einbinden möchten, die Ihre App benötigt, können Sie die Dateien der Bibliothek bearbeiten, sofern die Lizenz dies zulässt. Sie können auch eine alternative, für Mobilgeräte optimierte Bibliothek verwenden, um Ihrer App bestimmte Funktionen hinzuzufügen.

Decodierung nativer animierter Bilder

In Android 12 (API-Level 31) wird die NDK-ImageDecoder-API erweitert, um alle Frames und Zeitmessungsdaten von Bildern zu decodieren, die die Dateiformate „Animiertes GIF“ und „Animiertes WebP“ verwenden.

Verwenden Sie ImageDecoder anstelle von Drittanbieterbibliotheken, um die APK-Größe weiter zu reduzieren und von zukünftigen Updates in Bezug auf Sicherheit und Leistung zu profitieren.

Weitere Informationen zur ImageDecoder API finden Sie in der API reference und im Beispiel auf GitHub.

Nur bestimmte Dichten unterstützen

Android unterstützt verschiedene Bildschirmdichten, z. B.:

  • ldpi
  • mdpi
  • tvdpi
  • hdpi
  • xhdpi
  • xxhdpi
  • xxxhdpi

Android unterstützt zwar die oben genannten Dichten, Sie müssen Ihre gerasterten Assets aber nicht für jede Dichte exportieren.

Wenn Sie wissen, dass nur ein kleiner Prozentsatz Ihrer Nutzer Geräte mit bestimmten Dichten hat, sollten Sie überlegen, ob Sie diese Dichten in Ihre App aufnehmen müssen. Wenn Sie keine Ressourcen für eine bestimmte Bildschirmdichte einfügen, skaliert Android automatisch vorhandene Ressourcen, die ursprünglich für andere Bildschirmdichten entwickelt wurden.

Wenn Ihre App nur skalierte Bilder benötigt, können Sie noch mehr Speicherplatz sparen, indem Sie nur eine Variante eines Bildes in drawable-nodpi/ haben. Wir empfehlen, mindestens eine xxhdpi-Bildvariante in Ihre App aufzunehmen.

Weitere Informationen zur Bildschirmdichte finden Sie unter Bildschirmgrößen und ‑dichten.

Zeichnungsobjekte verwenden

Für einige Bilder ist keine statische Bildressource erforderlich. Das Framework kann das Bild stattdessen dynamisch zur Laufzeit zeichnen. Drawable-Objekte oder <shape> in XML können nur sehr wenig Speicherplatz in Ihrem APK belegen. Außerdem werden mit XML-Drawable-Objekten monochrome Bilder erzeugt, die den Material Design-Richtlinien entsprechen.

Ressourcen wiederverwenden

Sie können eine separate Ressource für Varianten eines Bildes einfügen, z. B. getönte, schattierte oder gedrehte Versionen desselben Bildes. Wir empfehlen jedoch, dieselben Ressourcen wiederzuverwenden und sie bei Bedarf zur Laufzeit anzupassen.

Android bietet mehrere Dienstprogramme zum Ändern der Farbe eines Assets, entweder mit den Attributen android:tint und tintMode.

Sie können auch Ressourcen weglassen, die nur eine gedrehte Version einer anderen Ressource sind. Das folgende Code-Snippet zeigt ein Beispiel dafür, wie ein „Daumen hoch“-Symbol in ein „Daumen runter“-Symbol umgewandelt wird, indem es in der Mitte des Bildes gedreht wird:

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/ic_thumb_up"
    android:pivotX="50%"
    android:pivotY="50%"
    android:fromDegrees="180" />

Aus Code rendern

Sie können die APK-Größe auch reduzieren, indem Sie Ihre Bilder prozedural rendern. Durch die prozedurale Darstellung wird Speicherplatz freigegeben, da Sie keine Bilddatei mehr in Ihrem APK speichern.

PNG-Dateien komprimieren

Mit dem Tool aapt können die Bildressourcen, die sich in res/drawable/ befinden, während des Build-Prozesses mit verlustfreier Komprimierung optimiert werden. Mit dem Tool aapt kann beispielsweise ein True-Color-PNG, das nicht mehr als 256 Farben benötigt, in ein 8-Bit-PNG mit einer Farbpalette konvertiert werden. So erhalten Sie ein Bild mit derselben Qualität, aber mit einer geringeren Speicherbelastung.

Für die aapt gelten die folgenden Einschränkungen:

  • Das aapt-Tool verkleinert keine PNG-Dateien im Ordner asset/.
  • Bilddateien müssen 256 oder weniger Farben enthalten, damit sie mit dem Tool aapt optimiert werden können.
  • Das Tool aapt kann PNG-Dateien, die bereits komprimiert sind, aufblähen. Um dies zu verhindern, können Sie das Flag isCrunchPngs verwenden, um diesen Prozess für PNG-Dateien zu deaktivieren:
  • Kotlin

        buildTypes.all { isCrunchPngs = false }
        

    Groovy

        buildTypes.all { isCrunchPngs = false }
        

PNG- und JPEG-Dateien komprimieren

Mit Tools wie pngcrush, pngquant oder zopflipng können Sie die Dateigröße von PNG-Dateien verringern, ohne die Bildqualität zu beeinträchtigen. Mit all diesen Tools lässt sich die PNG-Dateigröße reduzieren, ohne die wahrgenommene Bildqualität zu beeinträchtigen.

Das Tool pngcrush ist besonders effektiv. Dieses Tool durchläuft PNG-Filter und zlib-Parameter (Deflate) und verwendet jede Kombination von Filtern und Parametern, um das Bild zu komprimieren. Anschließend wird die Konfiguration ausgewählt, die die kleinste komprimierte Ausgabe ergibt.

Zum Komprimieren von JPEG-Dateien können Sie Tools wie packJPG und guetzli verwenden.

WebP-Dateiformat verwenden

Anstelle von PNG- oder JPEG-Dateien können Sie auch das Dateiformat WebP für Ihre Bilder verwenden. Das WebP-Format bietet verlustbehaftete Komprimierung und Transparenz wie JPG und PNG und kann eine bessere Komprimierung als JPEG oder PNG bieten.

Sie können vorhandene BMP-, JPG-, PNG- oder statische GIF-Bilder mit Android Studio in das WebP-Format konvertieren. Weitere Informationen finden Sie unter WebP-Bilder erstellen.

Vektorgrafiken verwenden

Mit Vektorgrafiken lassen sich auflösungsunabhängige Symbole und andere skalierbare Medien erstellen. Mit diesen Grafiken können Sie die Größe Ihrer APK-Datei erheblich reduzieren. Vektorgrafiken werden in Android als VectorDrawable-Objekte dargestellt. Mit einem VectorDrawable-Objekt kann aus einer 100 Byte großen Datei ein scharfes Bild in Bildschirmgröße generiert werden.

Das Rendern jedes VectorDrawable-Objekts dauert jedoch deutlich länger und größere Bilder benötigen noch mehr Zeit, bis sie auf dem Bildschirm angezeigt werden. Verwenden Sie diese Vektorgrafiken daher nur, wenn Sie kleine Bilder anzeigen.

Weitere Informationen zum Arbeiten mit VectorDrawable-Objekten finden Sie unter Drawables.

Vektorgrafiken für animierte Bilder verwenden

Verwenden Sie AnimationDrawable nicht, um Frame-by-Frame-Animationen zu erstellen, da Sie für jeden Frame der Animation eine separate Bitmap-Datei einfügen müssen, was die Größe Ihrer APK-Datei drastisch erhöht.

Verwenden Sie stattdessen AnimatedVectorDrawableCompat, um animierte Vektordrawables zu erstellen.

Weniger nativen Code und Java-Code verwenden

Mit den folgenden Methoden können Sie die Größe des Java- und nativen Quellcodes in Ihrer App reduzieren.

Unnötigen generierten Code entfernen

Machen Sie sich mit den Auswirkungen von automatisch generiertem Code vertraut. Viele Protocol Buffer-Tools generieren beispielsweise eine übermäßige Anzahl von Methoden und Klassen, wodurch sich die Größe Ihrer App verdoppeln oder verdreifachen kann.

Aufzählungen vermeiden

Ein einzelnes Enum kann der Datei classes.dex Ihrer App etwa 1,0 bis 1,4 KB hinzufügen. Bei komplexen Systemen oder gemeinsam genutzten Bibliotheken können sich diese Ergänzungen schnell summieren. Verwenden Sie nach Möglichkeit die Annotation @IntDef und Code-Shrinking, um Aufzählungen zu entfernen und in Ganzzahlen zu konvertieren. Bei dieser Typkonvertierung bleiben alle Vorteile von Enums in Bezug auf die Typsicherheit erhalten.

Größe nativer Binärdateien reduzieren

Wenn Ihre App nativen Code und das Android NDK verwendet, können Sie die Größe der Releaseversion Ihrer App auch durch Optimieren des Codes verringern. Zwei nützliche Methoden sind das Entfernen von Debugging-Symbolen und das Nicht-Extrahieren nativer Bibliotheken.

Debug-Symbole entfernen

Die Verwendung von Debugging-Symbolen ist sinnvoll, wenn sich Ihre App in der Entwicklung befindet und noch debuggt werden muss. Verwenden Sie das arm-eabi-strip-Tool, das im Android NDK enthalten ist, um unnötige Debugsymbole aus nativen Bibliotheken zu entfernen. Anschließend können Sie den Release-Build kompilieren.

Extrahieren nativer Bibliotheken vermeiden

Wenn Sie die Release-Version Ihrer App erstellen, packen Sie unkomprimierte .so-Dateien in das APK, indem Sie useLegacyPackaging in der Datei build.gradle.kts Ihrer App auf false setzen. Wenn Sie dieses Flag deaktivieren, wird verhindert, dass PackageManager während der Installation .so-Dateien aus dem APK in das Dateisystem kopiert. Durch diese Methode werden Updates Ihrer App kleiner.

Mehrere schlanke APKs verwalten

Ihr APK enthält möglicherweise Inhalte, die Nutzer herunterladen, aber nie verwenden, z. B. zusätzliche Sprachressourcen oder Ressourcen für bestimmte Bildschirmdichten. Damit Nutzer Ihre App möglichst schnell herunterladen können, sollten Sie sie mit Android App Bundles bei Google Play hochladen. Wenn Sie App Bundles hochladen, kann Google Play optimierte APKs für die Gerätekonfiguration jedes Nutzers generieren und bereitstellen. So laden Nutzer nur den Code und die Ressourcen herunter, die sie zum Ausführen Ihrer App benötigen. Sie müssen nicht mehrere APKs erstellen, signieren und verwalten, um verschiedene Geräte zu unterstützen, und Nutzer erhalten kleinere, optimierte Downloads.

Wenn Sie Ihre App nicht bei Google Play veröffentlichen, können Sie sie in mehrere APKs unterteilen, die sich durch Faktoren wie Bildschirmgröße oder GPU-Texturunterstützung unterscheiden.

Wenn ein Nutzer Ihre App herunterlädt, erhält sein Gerät das richtige APK basierend auf den Funktionen und Einstellungen des Geräts. So erhalten Geräte keine Assets für Funktionen, die sie nicht haben. Wenn ein Nutzer beispielsweise ein hdpi-Gerät hat, benötigt er keine xxxhdpi-Ressourcen, die Sie möglicherweise für Geräte mit Displays mit höherer Pixeldichte einfügen.

Weitere Informationen finden Sie unter Mehrere APKs erstellen und Unterstützung für mehrere APKs.