App-Größe reduzieren

Nutzer vermeiden es oft, Apps herunterzuladen, die ihnen zu groß erscheinen, insbesondere in Schwellenländern, in denen Geräte mit unzuverlässigen 2G- und 3G-Netzen verbunden sind oder Tarife mit Datenlimits haben. Auf dieser Seite erfahren Sie, 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 bei der Veröffentlichung bei Google Play sofort zu reduzieren. Android App Bundle ist ein Uploadformat, das den gesamten kompilierten Code und alle Ressourcen Ihrer App enthält. Die Generierung und Signatur des APK wird jedoch an Google Play weitergeleitet.

Das Bereitstellungsmodell von Google Play generiert und liefert dann mit Ihrem App-Bundle optimierte APKs für die Gerätekonfiguration jedes Nutzers, sodass nur der Code und die Ressourcen heruntergeladen werden, die zum Ausführen Ihrer App erforderlich sind. Sie müssen nicht mehrere APKs erstellen, signieren und verwalten, um verschiedene Geräte zu unterstützen, und Nutzer erhalten kleinere, optimiertere Downloads.

Google Play erzwingt für Apps, die mit App-Bundles veröffentlicht werden, eine Größenbeschränkung für komprimierte Downloads von 200 MB. Mit Play Feature Delivery und Play Asset Delivery sind größere Größen möglich. Eine Erhöhung der Größe Ihrer App kann sich jedoch negativ auf den Installationserfolg auswirken und die Anzahl der Deinstallationen erhöhen. 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 Ihrer App enthält. 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 mithilfe eines AssetManager-Objekts 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.

Ein APK enthält außerdem 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 Tool zum Verpacken extrahiert diese XML-Inhalte, kompiliert sie in Binärform und archiviert sie. Dazu gehören Sprachstrings und Stile sowie Pfade zu Inhalten, die nicht direkt in der resources.arsc-Datei enthalten sind, z. B. Layoutdateien und Bilder.
  • classes.dex: Enthält die Klassen, die im DEX-Dateiformat kompiliert wurden und von der Dalvik- oder ART-virtuellen Maschine verstanden werden.
  • AndroidManifest.xml: Enthält die Android-Manifestdatei. In dieser Datei sind der Name, die Version, die Zugriffsrechte und die referenzierten 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 Ihres APK wirkt sich darauf aus, wie schnell Ihre App geladen wird, wie viel Arbeitsspeicher sie benötigt und wie viel Strom sie verbraucht. Sie können Ihr APK verkleinern, indem Sie die Anzahl und Größe der darin enthaltenen Ressourcen reduzieren. Sie können insbesondere 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 beschrieben, wie Sie die Ressourcen in Ihrer App reduzieren können, um die Gesamtgröße Ihrer APK zu verringern.

Nicht verwendete Ressourcen entfernen

Das Tool lint ist ein in Android Studio enthaltener statischer Codeanalysator, der Ressourcen im Ordner res/ erkennt, auf die Ihr Code nicht verweist. Wenn das lint-Tool eine potenziell nicht verwendete Ressource in Ihrem Projekt findet, wird eine Meldung wie die folgende ausgegeben:

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

Bibliotheken, die Sie Ihrem Code hinzufügen, können ungenutzte Ressourcen enthalten. Gradle kann Ressourcen automatisch in Ihrem Namen entfernen, wenn Sie shrinkResources in der build.gradle.kts-Datei 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'
        }
    }
}

Wenn Sie shrinkResources verwenden möchten, müssen Sie die Codeverkürzung aktivieren. Während des Build-Prozesses entfernt R8 zuerst nicht verwendeten Code. Anschließend entfernt das Android Gradle-Plug-in die nicht verwendeten Ressourcen.

Weitere Informationen zum Minimieren von Code und Ressourcen sowie zu anderen Möglichkeiten, wie Android Studio die APK-Größe reduziert, finden Sie unter App minimieren, verschleiert machen und optimieren.

Mit dem 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 an das Build-System, indem es den Flavor resourceConfigurations und die Option defaultConfig verwendet. Das Build-System verhindert dann, dass Ressourcen aus anderen nicht unterstützten Konfigurationen im APK erscheinen, wodurch die Größe des APK reduziert wird. Weitere Informationen zu dieser Funktion finden Sie unter Nicht verwendete alternative Ressourcen entfernen.

Ressourcennutzung durch Bibliotheken minimieren

Wenn Sie eine Android-App entwickeln, verwenden Sie in der Regel externe Bibliotheken, um die Nutzerfreundlichkeit 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 Computer entwickelt wurde, kann sie viele Objekte und Methoden enthalten, die Ihre App nicht benötigt. Wenn Sie nur die Teile der Bibliothek einbeziehen möchten, die für Ihre App erforderlich sind, 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.

Dekodierung von animierten Bildern

In Android 12 (API-Level 31) wurde die NDKImageDecoder API erweitert, um alle Frames und Timing-Daten aus 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 Sicherheits- und Leistungsupdates zu profitieren.

Weitere Informationen zur ImageDecoder API findest du unter API reference und im Beispiel auf GitHub.

Unterstützt nur bestimmte Dichten

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 einbinden müssen. Wenn Sie keine Ressourcen für eine bestimmte Bildschirmdichte einbinden, skaliert Android vorhandene Ressourcen, die ursprünglich für andere Bildschirmdichten entwickelt wurden, automatisch.

Wenn für Ihre App nur skalierte Bilder erforderlich sind, können Sie noch mehr Speicherplatz sparen, indem Sie in drawable-nodpi/ nur eine Variante eines Bildes verwenden. Wir empfehlen, mindestens eine xxhdpi-Bildvariante in Ihre App aufzunehmen.

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

Zeichbare Objekte verwenden

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

Ressourcen wiederverwenden

Sie können eine separate Ressource für Varianten eines Bildes angeben, 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, mit denen Sie die Farbe eines Assets ändern können, entweder mit den Attributen android:tint und tintMode.

Sie können auch Ressourcen auslassen, die nur eine gedrehte Version einer anderen Ressource sind. Im folgenden Code-Snippet wird ein Beispiel dafür gezeigt, wie ein „Mag ich“-Symbol in ein „Mag ich nicht“-Symbol umgewandelt wird, indem es um die Mitte des Bildes herum um 180 Grad 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 das prozedurale Rendering wird Speicherplatz freigesetzt, da Sie keine Bilddatei mehr in Ihrem APK speichern.

PNG-Dateien komprimieren

Mit dem aapt-Tool können die in res/drawable/ abgelegten Bildressourcen während des Build-Prozesses mit verlustfreier Komprimierung optimiert werden. Mit dem Tool aapt können Sie beispielsweise ein True-Color-PNG, das nicht mehr als 256 Farben benötigt, in ein 8-Bit-PNG mit einer Farbpalette konvertieren. Das Ergebnis ist ein Bild mit gleicher Qualität, aber geringerer Arbeitsspeicherbelegung.

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

  • Das aapt-Tool schrumpft keine PNG-Dateien im Ordner asset/.
  • Bilddateien müssen maximal 256 Farben enthalten, damit das aapt-Tool sie optimieren kann.
  • Das Tool aapt kann PNG-Dateien, die bereits komprimiert sind, vergrößern. Um dies zu verhindern, können Sie diesen Vorgang für PNG-Dateien mit dem Flag isCrunchPngs 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 Größe von PNG-Dateien reduzieren, ohne dass die Bildqualität darunter leidet. Mit allen diesen Tools lässt sich die Größe von PNG-Dateien reduzieren, ohne die wahrgenommene Bildqualität zu beeinträchtigen.

Das pngcrush-Tool ist besonders effektiv. Dieses Tool iteriert über PNG-Filter und zlib-Parameter (Deflate) und komprimiert das Bild mit jeder Kombination aus Filtern und Parametern. Anschließend wird die Konfiguration ausgewählt, die die kleinste komprimierte Ausgabe liefert.

Sie können JPEG-Dateien mit Tools wie packJPG und guetzli komprimieren.

WebP-Dateiformat verwenden

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

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

Vektorgrafiken verwenden

Mit Vektorgrafiken können Sie geräteunabhängige Symbole und andere skalierbare Medien erstellen. Mit diesen Grafiken können Sie die APK-Dateigröße erheblich reduzieren. Vektorbilder werden in Android als VectorDrawable-Objekte dargestellt. Mit einem VectorDrawable-Objekt kann eine Datei mit 100 Byte ein scharfes Bild in der Größe des Bildschirms generieren.

Es dauert jedoch deutlich länger, bis das System jedes VectorDrawable-Objekt gerendert hat. Bei größeren Bildern dauert es noch länger, bis sie auf dem Bildschirm erscheinen. Verwenden Sie diese Vektorgrafiken daher nur, wenn kleine Bilder angezeigt werden.

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

Vektorgrafiken für animierte Bilder verwenden

Verwenden Sie AnimationDrawable nicht, um Frame-für-Frame-Animationen zu erstellen, da Sie in diesem Fall für jeden Frame der Animation eine separate Bitmapdatei angeben müssen, was die Größe Ihrer APK drastisch erhöht.

Verwenden Sie stattdessen AnimatedVectorDrawableCompat, um animierte Vektorgrafiken zu erstellen.

Nativen und Java-Code reduzieren

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

Unnötig generierten Code entfernen

Informieren Sie sich über den Footprint von automatisch generiertem Code. Viele Protokoll-Puffer-Tools generieren beispielsweise eine übermäßige Anzahl von Methoden und Klassen, wodurch sich die Größe Ihrer App verdoppeln oder verdreifachen kann.

Vermeiden Sie Aufzählungen.

Ein einzelnes Enum kann die Größe der Datei classes.dex Ihrer App um etwa 1,0 bis 1,4 KB erhöhen. Bei komplexen Systemen oder freigegebenen Bibliotheken können diese Ergänzungen schnell ansteigen. Verwenden Sie nach Möglichkeit die Anmerkung @IntDef und die Code-Minimierung, um Enumerationen zu entfernen und in Ganzzahlen umzuwandeln. Bei dieser Typumwandlung bleiben alle Vorteile der Typsicherheit von Enumerationen 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 reduzieren. Zwei nützliche Methoden sind das Entfernen von Debugsymbolen und das Nichtextrahieren nativer Bibliotheken.

Debugsymbole entfernen

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

Native Bibliotheken nicht extrahieren

Wenn Sie die Releaseversion Ihrer App erstellen, verpacken Sie nicht komprimierte .so-Dateien im APK. Legen Sie dazu in der build.gradle.kts-Datei Ihrer App false für useLegacyPackaging fest. Wenn Sie dieses Flag deaktivieren, wird verhindert, dass PackageManager während der Installation .so-Dateien aus dem APK in das Dateisystem kopiert. Mit dieser Methode werden die Updates Ihrer App kleiner.

Mehrere schlanke APKs verwalten

Ihr APK kann Inhalte enthalten, die Nutzer herunterladen, aber nie verwenden, z. B. zusätzliche Sprachressourcen oder Ressourcen für unterschiedliche Bildschirmdichten. Damit der Download für Ihre Nutzer möglichst klein ist, sollten Sie Ihre App 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 müssen Nutzer nur den Code und die Ressourcen herunterladen, 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. Nutzer erhalten kleinere, optimiertere Downloads.

Wenn Sie Ihre App nicht bei Google Play veröffentlichen, können Sie sie in mehrere APKs segmentieren, 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 für Geräte mit höherer Pixeldichte einschließen könnten.

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