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 wird Folgendes 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 sie sofort zu aktivieren. die App-Größe reduzieren, wenn Sie etwas bei Google Play veröffentlichen. 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 zu generieren und bereitzustellen für die Gerätekonfiguration der einzelnen Nutzer, sodass diese nur den Code und die Ressourcen herunterladen, die sie die App ausführen. Sie müssen nicht mehrere APKs erstellen, signieren und verwalten, um verschiedene Geräte zu unterstützen, und Nutzer erzielen kleinere, optimierte Downloads.

Google Play erzwingt einen komprimierten Download Größenbeschränkung von 200 MB für Apps, die mit App Bundles veröffentlicht wurden. Größere Formate sind zwar mit Play Feature Delivery und Play Asset Delivery möglich, sich negativ auf den Erfolg der Installationen auswirken und die Anzahl der Deinstallationen erhöhen. Daher empfehlen wir Ihnen, die Richtlinien beschrieben, 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. Diese Zu den Dateien gehören Java-Klassendateien, Ressourcendateien und eine Datei, die kompilierte Ressourcen enthält.

Ein APK enthält die folgenden Verzeichnisse:

  • META-INF/: enthält die Signatur CERT.SF und CERT.RSA -Dateien sowie die Manifestdatei MANIFEST.MF.
  • assets/: Enthält die Assets der App, die die App mit einem AssetManager -Objekt enthält.
  • res/: enthält Ressourcen, die nicht in resources.arsc.
  • 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. Diese Inhalte enthalten Sprache Zeichenfolgen und Stilen sowie Pfade zu Inhalten, die nicht direkt im resources.arsc-Datei, 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 Hauptmanifestdatei von Android. In dieser Datei sind die Name, Version, Zugriffsrechte und referenzierte Bibliotheksdateien der App. In der Datei wird das binären XML-Format.

Anzahl und Größe der Ressourcen reduzieren

Die Größe Ihres APK wirkt sich darauf aus, wie schnell Ihre App geladen wird, wie viel Speicher sie verwendet und wie verbraucht wird. Sie können Ihr APK verkleinern, indem Sie die Anzahl und Größe der Ressourcen, die sie enthält. Sie können insbesondere Ressourcen entfernen, die Ihre App nicht mehr verwendet, können skalierbare Drawable Objekte in an der Stelle der Bilddateien. In diesem Abschnitt werden diese Methoden und andere Möglichkeiten zur Reduzierung der Ressourcen in Ihrer App, um die Gesamtgröße Ihres 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 wird eine Nachricht 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.

android {
    // Other settings.

    buildTypes {
        getByName("release") {
            minifyEnabled = true
            shrinkResources = true
            proguardFiles(getDefaultProguardFile('proguard-android.txt'), "proguard-rules.pro")
        }
    }
}
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 muss R8 zuerst wird nicht verwendetem Code entfernt. Anschließend entfernt das Android Gradle-Plug-in die nicht verwendeten Ressourcen.

Weitere Informationen über das Verkleinern von Code und Ressourcen sowie andere Möglichkeiten, APK-Größe (siehe App verkleinern, verschleiern und optimieren)

Ab Android-Gradle-Plug-in 7.0 können Sie die Konfigurationen deklarieren, die Ihre App unterstützt. Gradle übergibt diese Informationen mithilfe der Methode resourceConfigurations Flavor-Format und die Option defaultConfig. Das Build-System verhindert dann, dass Ressourcen anderen nicht unterstützten Konfigurationen im APK erscheinen, wodurch die Größe des APK verringert wird. Weitere Informationen finden Sie unter Nicht verwendete Alternative entfernen Ressourcen

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 zum Beispiel auf AndroidX verweisen. um die User Experience auf früheren Geräten zu verbessern. Alternativ können Sie Google Play-Dienste, die abgerufen werden sollen automatische Übersetzungen von Text in Ihrer App.

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 Ihre App benötigt, können Sie der Bibliothek, wenn Sie die Lizenz ändern können. Sie können auch eine Alternative verwenden, Bibliothek, mit der Sie Ihrer App bestimmte Funktionen hinzufügen können.

Decodierung animierter Bilder

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 verringere die APK-Größe und nutze zukünftige Updates in Bezug auf Sicherheit und Leistung.

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 Punktdichten, Sie müssen die Rasterung zu jeder Dichte.

Wenn Sie wissen, dass nur ein kleiner Prozentsatz der Nutzer Geräte mit einer bestimmten Punktdichte besitzt, Überlegen Sie, ob Sie diese Dichten in Ihrer App bündeln müssen. Wenn Sie keine Ressourcen angeben für eine bestimmte Bildschirmdichte, skaliert Android automatisch vorhandene Ressourcen, die für andere Bildschirmdichten.

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 zu Bildschirmdichten finden Sie unter Bildschirmgrößen und -dichten:

Zeichbare Objekte verwenden

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

Ressourcen wiederverwenden

Sie können eine separate Ressource für Varianten eines Bildes einfügen, etwa für gefärbte, schattierte oder gedrehten 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. Sie können dazu die Die Attribute android:tint und tintMode.

Sie können auch Ressourcen auslassen, die nur eine gedrehte Version einer anderen Ressource sind. Die folgenden Code-Snippet zeigt ein Beispiel für eine „Mag ich nicht“ indem wir auf den in der Mitte des Bildes und drehen Sie es 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. Prozedurales Rendering Dadurch wird Speicherplatz freigegeben, da Sie keine Bilddatei mehr in Ihrer APK-Datei speichern.

PNG-Dateien bearbeiten

Mit dem aapt-Tool können die Bildressourcen optimiert werden, die in res/drawable/ platziert sind mit einer verlustfreien Komprimierung während des Build-Prozesses. Das aapt-Tool kann beispielsweise Konvertieren Sie eine farbige PNG-Datei, die nicht mehr als 256 Farben erfordert, in eine 8-Bit-PNG-Datei mit einer Farbe. Farbpalette. 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 im asset/ Ordner.
  • Für Bilddateien dürfen maximal 256 Farben verwendet werden, damit das aapt-Tool optimiert werden kann .
  • Das Tool aapt kann PNG-Dateien, die bereits komprimiert sind, vergrößern. Um dies zu verhindern, Dazu können Sie das Flag isCrunchPngs verwenden, um diesen Vorgang für PNG-Dateien zu deaktivieren:
  •     buildTypes.all { isCrunchPngs = false }
        
        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 durchläuft PNG-Filter und zlib (Deflate), bei dem das Bild mit jeder Kombination aus Filtern und Parametern komprimiert wird. 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

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

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 dargestellt in Android als VectorDrawable Objekte. Mit einem VectorDrawable-Objekt kann eine 100-Byte-Datei ein scharfes Bild generieren, die Größe des Bildschirms.

Es dauert jedoch deutlich länger, bis das System VectorDrawable-Objekt enthält. 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 findest du unter Drawables.

Animierte Bilder mit Vektorgrafiken versehen

Verwenden Sie AnimationDrawable nicht, um Frame-für-Frame-Animationen zu erstellen, da Sie dazu 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.

Reduzierung von nativem Code und Java-Code

Mit den folgenden Methoden können Sie die Größe von Java und nativer Codebasis in Ihrem

Unnötigen generierten Code entfernen

Es ist wichtig, dass Sie den Grundriss jedes automatisch generierten Codes verstehen. Beispiel: viele Protokollpuffer-Tools eine übermäßige Anzahl von Methoden und Klassen generieren, wodurch sich die Größe deiner App verdreifachen.

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. Diese Für komplexe Systeme oder gemeinsam genutzte Bibliotheken können sich schnell Ergänzungen ansammeln. Verwenden Sie nach Möglichkeit die Anmerkung @IntDef und die Code-Minimierung, um Enumerationen zu entfernen und in Ganzzahlen umzuwandeln. Bei dieser Typkonvertierung werden alle Sicherheitsvorteile von Enums.

Größe nativer Binärdateien reduzieren

Wenn deine App nativen Code und das Android-NDK verwendet, kannst du auch die Größe des Release verringern Version Ihrer App durch Optimieren des Codes. Zwei nützliche Techniken sind das Entfernen von Debugging-Symbolen und ohne native Bibliotheken zu extrahieren.

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. Verwenden Sie Das arm-eabi-strip-Tool im Android-NDK, um unnötige Fehlerbehebung zu entfernen aus nativen Bibliotheken. Anschließend können Sie den Release-Build kompilieren.

Native Bibliotheken nicht extrahieren

Beim Erstellen der Release-Version deiner App verpacke unkomprimierte .so-Dateien im APK nach Einstellung useLegacyPackaging in der build.gradle.kts-Datei Ihrer App auf false. Das Deaktivieren dieses Flags verhindert, PackageManager von Kopieren von .so-Dateien vom APK in das Dateisystem während der Installation Diese Methode sorgt dafür, App-Updates kleiner machen.

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. Durch das Hochladen von App Bundles kann Google Google Play generiert und stellt optimierte APKs für die Gerätekonfiguration der einzelnen Nutzer bereit, sodass sie nur herunterladen den Code und die Ressourcen, die sie zum Ausführen Ihrer App benötigen. Sie müssen nicht mehrere APKs zur Unterstützung verschiedener Geräte bieten Nutzern kleinere, optimierte Downloads.

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

Wenn ein Nutzer Ihre App herunterlädt, erhält sein Gerät das richtige APK basierend auf der Funktionen und Einstellungen. So erhalten Geräte keine Assets für Funktionen, die sie nicht haben. 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.