App-Größe reduzieren

Nutzer scheuen häufig den Download von Apps, die zu groß erscheinen, insbesondere in Schwellenländern, in denen Geräte mit fehlerhaften 2G- und 3G-Netzen verbunden sind oder an Plänen mit Datenlimits arbeiten. Auf dieser Seite wird beschrieben, wie du die Downloadgröße deiner App reduzieren kannst, damit mehr Nutzer deine 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 bei der Veröffentlichung bei Google Play zu speichern. Android App Bundle ist ein Uploadformat, das den gesamten kompilierten Code und die Ressourcen deiner App enthält, aber die APK-Erstellung und -Signierung bei Google Play 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. Außerdem erhalten die Nutzer kleinere, optimierte Downloads.

Da bei Google Play für Apps, die mit App Bundles veröffentlicht werden, eine Beschränkung für die komprimierte Downloadgröße von maximal 200 MB gilt, empfehlen wir dir, die auf dieser Seite beschriebenen Richtlinien zu beachten, 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 APKs einer App vertraut machen. Eine APK-Datei besteht aus einem ZIP-Archiv, das alle Dateien Ihrer App enthält. 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 von der App 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 Softwareebene 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 die XML-Inhalte aus allen Konfigurationen des Ordners res/values/. Das Paketerstellungstool extrahiert diese XML-Inhalte, kompiliert sie in Binärform und archiviert den Inhalt. 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 gelesen werden kann.
  • AndroidManifest.xml: Enthält die zentrale Android-Manifestdatei. Diese Datei enthält den Namen, die Version, die Zugriffsrechte und die referenzierten Bibliotheksdateien der App. Die Datei verwendet das binäre XML-Format von Android.

Anzahl und Größe von Ressourcen reduzieren

Die Größe Ihres APKs hat Einfluss darauf, wie schnell Ihre App geladen wird, wie viel Arbeitsspeicher sie verwendet und wie viel Energie sie verbraucht. Sie können Ihr APK verkleinern, indem Sie die Anzahl und Größe der darin enthaltenen Ressourcen reduzieren. Insbesondere kannst du Ressourcen entfernen, die deine 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 Ihres APKs zu verringern.

Nicht verwendete Ressourcen entfernen

Das lint-Tool, 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 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, können nicht verwendete Ressourcen enthalten. Gradle kann Ressourcen automatisch für Sie entfernen, wenn Sie shrinkResources in der Datei build.gradle.kts Ihrer Anwendung aktivieren.

Kotlin

android {
    // Other settings.

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

Groovig

android {
    // Other settings.

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

Aktivieren Sie die Codereduzierung, 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 und zu anderen Möglichkeiten, wie Android Studio die APK-Größe reduziert, finden Sie unter App verkleinern, verschleiern und optimieren.

In 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 mit dem Flavor resourceConfigurations und der Option defaultConfig an das Build-System. Das Build-System verhindert dann, dass Ressourcen von anderen nicht unterstützten Konfigurationen im APK angezeigt werden, wodurch die APK-Größe reduziert wird. Weitere Informationen zu diesem Feature 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 Sie können Google Play-Dienste verwenden, um automatische Übersetzungen von 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 einschließen möchten, die für Ihre Anwendung erforderlich sind, können Sie die Dateien der Bibliothek bearbeiten, wenn Sie mit der Lizenz Änderungen an der Bibliothek vornehmen können. Du kannst auch eine alternative, für Mobilgeräte optimierte Bibliothek verwenden, um deiner App bestimmte Funktionen hinzuzufügen.

Native animierte Bilddecodierung

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

Verwende ImageDecoder anstelle von Bibliotheken von Drittanbietern, 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 unter API reference und im Beispiel auf GitHub.

Nur bestimmte Dichten unterstützen

Android unterstützt unterschiedliche Bildschirmdichten, wie zum Beispiel:

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

Obwohl Android die oben genannten Dichten unterstützt, müssen Sie Ihre Raster-Assets nicht für jede Dichte exportieren.

Wenn du weißt, dass nur ein kleiner Prozentsatz deiner Nutzer Geräte mit bestimmten Dichten hat, überlege, ob du diese Dichten in deiner App bündeln musst. Wenn du keine Ressourcen für eine bestimmte Bildschirmdichte einfügst, skaliert Android automatisch vorhandene Ressourcen, die ursprünglich für andere Bildschirmdichten entwickelt wurden.

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

Weitere Informationen zu den Bildschirmdichten findest du unter Bildschirmgrößen und -dichten.

Drawable-Objekte verwenden

Einige Images erfordern keine statische Image-Ressource. Das Framework kann das Bild stattdessen zur Laufzeit dynamisch zeichnen. Drawable-Objekte – oder <shape> in XML – können in deinem APK nur sehr wenig Speicherplatz einnehmen. Darüber hinaus 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 hinzufügen, z. B. für eingefä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, entweder mithilfe der Attribute android:tint und tintMode.

Ressourcen, die nur rotiert sind, können auch weggelassen werden. Das folgende Code-Snippet zeigt ein Beispiel für das Umwandeln eines Daumens nach oben in einen Daumen nach unten durch Schwenken der Bildmitte und 180-Grad-Drehung:

<?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 verringern, indem Sie Ihre Bilder prozedur rendern. Durch das prozedurale Rendering wird Speicherplatz freigegeben, da du keine Bilddatei mehr in deinem APK speicherst.

Crunch-PNG-Dateien

Das aapt-Tool kann die in res/drawable/ platzierten Bildressourcen während des Build-Prozesses mit einer verlustfreien Komprimierung optimieren. Das aapt-Tool kann beispielsweise eine PNG-Datei mit echter Farbe, die nicht mehr als 256 Farben benötigt, in eine 8-Bit-PNG mit einer Farbpalette konvertieren. Das führt zu einem Bild von gleicher Qualität, aber mit einem geringeren Speicherbedarf.

Für aapt gelten die folgenden Einschränkungen:

  • Das aapt-Tool verkleinert keine PNG-Dateien im Ordner asset/.
  • Bilddateien dürfen für das aapt-Tool maximal 256 Farben verwenden, um sie zu optimieren.
  • Das aapt-Tool kann bereits komprimierte PNG-Dateien 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 }
        

    Groovig

        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 können Sie die PNG-Dateigröße reduzieren, ohne die Bildqualität zu beeinträchtigen.

Das pngcrush-Tool ist besonders effektiv. Dieses Tool iteriert über 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 liefert.

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

WebP-Dateiformat verwenden

Statt PNG- oder JPEG-Dateien können Sie auch das Dateiformat WebP für Ihre Bilder verwenden. Das WebP-Format bietet eine verlustbehaftete Komprimierung und Transparenz, wie JPG und PNG, und bietet eine bessere Komprimierung 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-Bilder erstellen.

Vektorgrafiken verwenden

Mit Vektorgrafiken können Sie auflösungsunabhängige Symbole und andere skalierbare Medien erstellen. Sie können diese Grafiken nutzen, um Ihren APK-Speicherplatz deutlich zu reduzieren. Vektorbilder werden in Android als VectorDrawable-Objekte dargestellt. Mit einem VectorDrawable-Objekt kann eine 100-Byte-Datei ein scharfes Bild der Bildschirmgröße generieren.

Allerdings braucht das System deutlich mehr Zeit, um jedes VectorDrawable-Objekt zu rendern, und größere Bilder benötigen noch länger, bis sie auf dem Bildschirm angezeigt werden. Daher sollten Sie diese Vektorgrafiken nur bei der Anzeige kleiner Bilder verwenden.

Weitere Informationen zum Arbeiten mit VectorDrawable-Objekten findest du unter Drawables.

Vektorgrafiken für animierte Bilder verwenden

Verwende AnimationDrawable nicht, um Frame-für-Frame-Animationen zu erstellen, da du dafür eine separate Bitmapdatei für jeden Frame der Animation hinzufügen musst. Dadurch wird die Größe deines APK drastisch erhöht.

Verwende stattdessen AnimatedVectorDrawableCompat, um animierte Vektor-Drawables zu erstellen.

Nativen Code und Java-Code reduzieren

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

Unnötigen generierten Code entfernen

Machen Sie sich mit dem Fußabdruck des automatisch generierten Codes vertraut. Viele Protokollpuffertools generieren beispielsweise eine übermäßige Anzahl von Methoden und Klassen, wodurch die Größe Ihrer Anwendung verdoppelt oder verdreifacht werden kann.

Aufzählungen vermeiden

Eine einzelne Aufzählung kann etwa 1,0 bis 1,4 KB der classes.dex-Datei Ihrer App hinzufügen. Bei komplexen Systemen oder gemeinsam genutzten Bibliotheken können sich diese Ergänzungen schnell ansammeln. Ziehen Sie nach Möglichkeit die Annotation @IntDef und eine Code-Reduzierung in Betracht, um Aufzählungen zu entfernen und in Ganzzahlen umzuwandeln. Bei dieser Typkonvertierung bleiben alle Sicherheitsvorteile von „enum“-Typen erhalten.

Größe nativer Binärprogramme reduzieren

Wenn deine App nativen Code und den 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 in der Entwicklung befindet und noch eine Fehlerbehebung erforderlich ist. Verwenden Sie das im Android-NDK bereitgestellte Tool arm-eabi-strip, um unnötige Debug-Symbole aus nativen Bibliotheken zu entfernen. Danach können Sie Ihren Release-Build kompilieren.

Native Bibliotheken nicht extrahieren

Verpacken Sie beim Erstellen der Release-Version Ihrer App unkomprimierte .so-Dateien im APK, indem Sie useLegacyPackaging in der build.gradle.kts-Datei Ihrer App auf false setzen. Wenn dieses Flag deaktiviert ist, kann PackageManager während der Installation keine .so-Dateien aus dem APK in das Dateisystem kopieren. Bei dieser Methode werden die Aktualisierungen Ihrer App reduziert.

Mehrere schlanke APKs verwalten

Ihr APK kann Inhalte enthalten, die Nutzer herunterladen, aber nie verwenden, z. B. zusätzliche Sprach- oder Ressourcen für die Bildschirmdichte. Lade deine App mithilfe von Android App Bundles bei Google Play hoch, um die Downloads für deine Nutzer so gering wie möglich zu halten. Durch das Hochladen von App Bundles kann Google Play optimierte APKs für die Gerätekonfiguration jedes Nutzers 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. Nutzer erhalten kleinere, besser 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 die Bildschirmgröße oder die Unterstützung von GPU-Texturen unterscheiden.

Wenn ein Nutzer Ihre App herunterlädt, erhält sein Gerät das richtige APK entsprechend den Funktionen und Einstellungen des Geräts. 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 du für Geräte mit höherer Dichte verwenden könntest.

Weitere Informationen finden Sie unter Mehrere APKs erstellen und Unterstützung mehrerer APKs.