App-Größe reduzieren

Nutzer laden oft nicht zu große Apps herunter, insbesondere in Schwellenländern, in denen Geräte eine Verbindung zu fehlerhaften 2G- und 3G-Netzwerken herstellen oder in denen Pläne mit Datenlimits gelten. 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 App-Bereitstellungsmodell von Google Play verwendet dann dein App Bundle, um optimierte APKs für die Gerätekonfiguration der einzelnen Nutzer zu generieren und bereitzustellen, sodass sie nur den Code und die Ressourcen herunterladen, die sie zum Ausführen deiner App benötigen. Du musst nicht mehrere APKs erstellen, signieren und verwalten, um verschiedene Geräte zu unterstützen, und Nutzer erhalten kleinere, optimierte 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 mit einem AssetManager-Objekt abgerufen werden können.
  • res/: enthält Ressourcen, die nicht in resources.arsc kompiliert sind.
  • 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 auch die folgenden Dateien. Nur AndroidManifest.xml ist obligatorisch:

  • resources.arsc: enthält kompilierte Ressourcen. Diese Datei enthält den XML-Inhalt aus allen 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 Ihre App nicht mehr verwendet, 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 erkennt, 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, 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, verschleieren 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 angezeigt werden, und verringert so die Größe des APK. Weitere Informationen zu dieser Funktion finden Sie unter Nicht verwendete alternative Ressourcen entfernen.

Ressourcennutzung durch Bibliotheken minimieren

Bei der Entwicklung einer Android-App verwendest du normalerweise externe Bibliotheken, um die Nutzerfreundlichkeit und Vielseitigkeit der 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 einschließen 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 vorherigen Punktdichten, du musst deine rasterbasierten Assets aber nicht in jede Pixeldichte 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 – oder <shape> in XML – können sehr wenig Speicherplatz in deinem APK belegen. Außerdem erzeugen XML-Drawable-Objekte monochromatische 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 die Bilder manuell rendern. Durch das prozedurale Rendering wird Speicherplatz freigesetzt, da Sie keine Bilddatei mehr in Ihrem APK speichern.

PNG-Dateien bearbeiten

Mit dem aapt-Tool können die in res/drawable/ abgelegten Bildressourcen während des Build-Prozesses mit verlustfreier Komprimierung optimiert werden. Das aapt-Tool kann beispielsweise eine PNG-Datei mit echter Farbe, die nicht mehr als 256 Farben erfordert, in eine 8-Bit-PNG-Datei 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, kannst du diesen Prozess 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. Daher sollten Sie diese Vektorgrafiken nur dann verwenden, wenn Sie kleine Bilder darstellen.

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

Vektorgrafiken für animierte Bilder verwenden

Du solltest AnimationDrawable nicht verwenden, um Frame-für-Frame-Animationen zu erstellen. Dazu musst du für jeden Frame der Animation eine separate Bitmapdatei hinzufügen, was die Größe deines 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-Codebasis und der nativen Codebasis in Ihrer Anwendung 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 sich diese Ergänzungen schnell ansammeln. Verwenden Sie nach Möglichkeit die Anmerkung @IntDef und die Code-Minimierung, um Aufzählungen zu entfernen und in Ganzzahlen umzuwandeln. Bei dieser Typkonvertierung bleiben alle Vorteile der Typsicherheit von Enums 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 Techniken sind das Entfernen von Symbolen zum Debuggen und das Extrahieren nativer Bibliotheken.

Debugsymbole entfernen

Die Verwendung von Debugging-Symbolen ist sinnvoll, wenn sich Ihre App noch in der Entwicklungsphase befindet und noch nicht vollständig frei von Fehlern ist. 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 du dieses Flag deaktivierst, kann PackageManager .so-Dateien während der Installation nicht aus dem APK in das Dateisystem kopieren. Mit dieser Methode werden 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 deine Nutzer möglichst kurz ist, lade deine App mithilfe von Android App Bundles bei Google Play hoch. 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 du deine App nicht bei Google Play veröffentlichst, kannst du sie in mehrere APKs unterteilen, die sich nach 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.