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-Netzen herstellen oder in denen Pläne mit Datenlimits gelten. Auf dieser Seite wird beschrieben, wie du die Downloadgröße deiner App verringerst, damit mehr Nutzer deine App herunterladen können.

App mit Android App Bundles hochladen

Lade deine App als Android App Bundle hoch, um bei der Veröffentlichung bei Google Play sofort die App-Größe zu sparen. Android App Bundle ist ein Uploadformat, das den gesamten kompilierten Code und die Ressourcen deiner App enthält, die APK-Generierung und -Signatur bei Google Play jedoch verzögert.

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 eine Größenbeschränkung für komprimierte Downloads von 200 MB für Apps, die mit App Bundles veröffentlicht wurden. Mit Play Feature Delivery und Play Asset Delivery ist eine größere App-Größe möglich. Wenn du deine App jedoch vergrößerst, kann sich das negativ auf den Installationserfolg und die Anzahl der Deinstallationen auswirken. Daher empfehlen wir dir, die auf dieser Seite beschriebenen Richtlinien anzuwenden, um die Downloadgröße deiner App so weit wie möglich zu reduzieren.

APK-Struktur verstehen

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. Zu diesen Dateien 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 Paketerstellungstool extrahiert diese XML-Inhalte, kompiliert sie in ein Binärformat und archiviert die Inhalte. 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, das von der virtuellen Dalvik- oder ART-Maschine interpretiert wird.
  • AndroidManifest.xml: Enthält die Hauptmanifestdatei von Android. 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 von Ressourcen reduzieren

Die Größe Ihres APK wirkt sich darauf aus, wie schnell Ihre App geladen wird, wie viel Arbeitsspeicher sie verwendet und wie viel Strom sie verbraucht. Du kannst dein APK verkleinern, indem du die Anzahl und Größe der darin enthaltenen Ressourcen verringerst. Insbesondere können Sie Ressourcen entfernen, die Ihre Anwendung nicht mehr verwendet, und skalierbare Drawable-Objekte anstelle von Bilddateien verwenden. In diesem Abschnitt werden diese Methoden und andere Möglichkeiten erläutert, wie du die Ressourcen in deiner App reduzieren kannst, um die Gesamtgröße des APK zu verringern.

Nicht verwendete Ressourcen entfernen

Das Tool lint, ein statisches Code-Analysetool in Android Studio, erkennt Ressourcen im Ordner res/, 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 in deinem Namen automatisch Ressourcen entfernen, wenn du shrinkResources in der build.gradle.kts-Datei deiner App aktivierst.

Kotlin

android {
    // Other settings.

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

Cool

android {
    // Other settings.

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

Aktivieren Sie die Codekomprimierung, um shrinkResources zu verwenden. 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 Verkleinern von Code und Ressourcen sowie zu anderen Möglichkeiten, wie Android Studio die APK-Größe reduziert, findest du unter App verkleinern, verschleiern und optimieren.

Ab Android-Gradle-Plug-in 7.0 kannst du die von deiner App unterstützten Konfigurationen deklarieren. Gradle übergibt diese Informationen mit dem Flavor resourceConfigurations und der Option defaultConfig an das Build-System. 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 diesem Feature 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 früheren Geräten zu verbessern, oder mithilfe der Google Play-Dienste automatische Übersetzungen von Text in Ihrer App abrufen.

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

Decodierung animierter Bilder

In Android 12 (API-Level 31) wird die NDK ImageDecoder API erweitert, um alle Frames und Timingdaten aus Bildern zu decodieren, die das animierte GIF- und das animierte WebP-Dateiformat verwenden.

Verwende ImageDecoder anstelle von Drittanbieter-Bibliotheken, um die APK-Größe weiter zu verringern und von zukünftigen Sicherheits- und Leistungsupdates zu profitieren.

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

Nur bestimmte Dichten unterstützen

Android unterstützt verschiedene Bildschirmdichten, darunter:

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

Android unterstützt zwar die vorherigen Kompaktheitsgrade, du musst deine gerasterten Assets aber nicht in jede Pixeldichte exportieren.

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

Wenn deine App nur skalierte Bilder benötigt, kannst du noch mehr Platz sparen, wenn du in drawable-nodpi/ nur eine einzige Variante eines Bildes verwendest. Wir empfehlen, mindestens eine xxhdpi-Bildvariante in deine App aufzunehmen.

Weitere Informationen zu Bildschirmdichten finden Sie unter Bildschirmgrößen und -dichten.

Drawable-Objekte verwenden

Einige Images benötigen keine statische Image-Ressource. Das Framework kann das Bild stattdessen während der Laufzeit dynamisch zeichnen. Drawable-Objekte – oder <shape> in XML – können sehr viel 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 verwenden, z. B. für gefärbte, schattierte oder gedrehte Versionen desselben Bildes. Wir empfehlen jedoch, dieselben Ressourcen wiederzuverwenden und zur Laufzeit nach Bedarf anzupassen.

Android bietet mehrere Dienstprogramme zum Ändern der Farbe eines Assets. Dazu werden die Attribute android:tint und tintMode verwendet.

Sie können auch Ressourcen auslassen, bei denen es sich lediglich um ein rotiertes Äquivalent einer anderen Ressource handelt. Das folgende Code-Snippet zeigt ein Beispiel für die Umwandlung von „Daumen nach oben“ in „Daumen nach unten“ durch Drehen in der Mitte des Bildes und Drehen um 180 Grad:

<?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. Beim prozedurbezogenen Rendering wird Speicherplatz freigegeben, da die Bilddatei nicht mehr in Ihrem APK gespeichert wird.

PNG-Dateien bearbeiten

Das aapt-Tool kann die in res/drawable/ platzierten Image-Ressourcen durch verlustfreie Komprimierung während des Build-Prozesses optimieren. Das aapt-Tool kann beispielsweise eine PNG-Datei mit echtem Farbumfang, die nicht mehr als 256 Farben erfordert, in eine 8-Bit-PNG-Datei mit Farbpalette konvertieren. Dies führt zu einem Bild von gleicher Qualität, aber mit geringerem Speicherbedarf.

Für aapt gelten die folgenden Einschränkungen:

  • Das aapt-Tool verkleinert keine PNG-Dateien, die im Ordner asset/ enthalten sind.
  • Bilddateien dürfen maximal 256 Farben enthalten, damit das aapt-Tool sie optimieren kann.
  • Das aapt-Tool kann PNG-Dateien, die bereits komprimiert sind, möglicherweise in die Höhe treiben. Um dies zu verhindern, kannst du diesen Prozess für PNG-Dateien mit dem Flag isCrunchPngs deaktivieren:
  • Kotlin

        buildTypes.all { isCrunchPngs = false }
        

    Cool

        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 die Bildqualität zu beeinträchtigen. Mit allen diesen Tools lässt sich die Größe der PNG-Datei reduzieren, ohne die Wahrnehmung der Bildqualität zu beeinträchtigen.

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

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

WebP-Dateiformat verwenden

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

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-Images erstellen.

Vektorgrafiken verwenden

Sie können Vektorgrafiken verwenden, um auflösungsunabhängige Symbole und andere skalierbare Medien zu erstellen. Mit diesen Grafiken können Sie den Platzbedarf Ihres APKs deutlich reduzieren. Vektorbilder werden in Android als VectorDrawable-Objekte dargestellt. Mit einem VectorDrawable-Objekt kann eine 100-Byte-Datei in der Größe des Bildschirms ein scharfes Bild generieren.

Das System benötigt jedoch wesentlich mehr Zeit, um jedes VectorDrawable-Objekt zu rendern. Bei größeren Bildern dauert es noch länger, bis sie auf dem Bildschirm angezeigt werden. Daher sollten Sie diese Vektorgrafiken nur für die Darstellung kleiner Bilder verwenden.

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

Animierte Bilder mit Vektorgrafiken versehen

Du solltest AnimationDrawable nicht verwenden, um Frame-für-Frame-Animationen zu erstellen. Dazu musst du eine separate Bitmapdatei für jeden Frame der Animation einfügen, was die Größe deines APK drastisch erhöht.

Verwenden Sie stattdessen AnimatedVectorDrawableCompat, um animierte Vektor-Drawables zu erstellen.

Reduzierung von nativem Code und Java-Code

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

Unnötigen generierten Code entfernen

Es ist wichtig, dass Sie den Grundriss jedes automatisch generierten Codes verstehen. Beispielsweise generieren viele Protokollpuffertools eine übermäßige Anzahl von Methoden und Klassen, was die Größe Ihrer Anwendung verdoppeln oder verdreifachen kann.

Aufzählungen vermeiden

Eine einzelne Aufzählung kann der classes.dex-Datei Ihrer App etwa 1,0 bis 1,4 KB hinzufügen. Diese Ergänzungen können sich schnell für komplexe Systeme oder gemeinsam genutzte Bibliotheken ansammeln. Wenn möglich, sollten Sie die Annotation @IntDef und die Code-Verkleinerung verwenden, um Aufzählungen zu entfernen und in Ganzzahlen umzuwandeln. Bei dieser Typkonvertierung bleiben alle Vorteile der Typsicherheit von Enums erhalten.

Größe nativer Binärprogramme reduzieren

Wenn deine App nativen Code und das Android-NDK verwendet, kannst du auch die Größe der Release-Version deiner App reduzieren, indem du deinen Code optimierst. Zwei nützliche Techniken sind das Entfernen von Symbolen zum Debuggen und das Extrahieren nativer Bibliotheken.

Symbole zum Debuggen entfernen

Die Verwendung von Symbolen zum Debuggen ist sinnvoll, wenn sich Ihre App noch in der Entwicklung befindet und noch eine Fehlerbehebung erforderlich ist. Verwende das arm-eabi-strip-Tool im Android-NDK, um unnötige Debugging-Symbole aus nativen Bibliotheken zu entfernen. Anschließend können Sie Ihren Release-Build kompilieren.

Native Bibliotheken nicht extrahieren

Wenn du die Release-Version deiner App erstellst, kannst du unkomprimierte .so-Dateien im APK verpacken, indem du useLegacyPackaging in der build.gradle.kts-Datei deiner App auf false setzt. 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 die 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 Ressourcen für Sprache oder Bildschirmdichte. Damit der Download für deine Nutzer möglichst kurz ist, lade deine App mithilfe von Android App Bundles bei Google Play hoch. Wenn du App Bundles hochlädst, kann Google Play optimierte APKs für die Gerätekonfiguration der einzelnen Nutzer generieren und bereitstellen, sodass nur der Code und die Ressourcen heruntergeladen werden, die zum Ausführen deiner App erforderlich sind. Du musst nicht mehrere APKs erstellen, signieren und verwalten, um verschiedene Geräte zu unterstützen, und Nutzer erhalten kleinere, optimierte 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 deine App herunterlädt, erhält sein Gerät je nach den Funktionen und Einstellungen des Geräts das richtige APK. Auf diese Weise erhalten Geräte keine Assets für Funktionen, die die Geräte nicht haben. Wenn ein Nutzer beispielsweise ein hdpi-Gerät hat, benötigt er keine xxxhdpi-Ressourcen, die Sie für Geräte mit Bildschirmen mit höherer Punktdichte hinzufügen könnten.

Weitere Informationen findest du unter Mehrere APKs erstellen und Unterstützung für mehrere APKs.