App-Größe reduzieren

Nutzer laden oft keine Apps herunter, die zu groß erscheinen. Das gilt vor allem in Schwellenländern, in denen Geräte eine Verbindung zu 2G- und 3G-Netzen herstellen oder bei Tarifen mit Datenlimits arbeiten. 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 die kompilierten Ressourcen Ihrer App abrufen, die APK-Erstellung und -Anmeldung bei Google Play jedoch verschieben.

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.

<ph type="x-smartling-placeholder">

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. 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 einer Instanz spezifisch ist. Prozessor. 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 Binärform und archiviert sie. Diese Inhalte enthalten Sprache Zeichenfolgen und Stilen sowie Pfaden zu Inhalten, die nicht direkt im resources.arsc-Datei, z. B. Layoutdateien und Bilder. <ph type="x-smartling-placeholder">
  • classes.dex: enthält die Klassen, die im DEX-Dateiformat kompiliert wurden und von die virtuelle Dalvik- oder ART-Maschine.
  • 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 von 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 lint-Tool – ein Tool zur Analyse von statischem Code in Android Studio enthalten – erkennt Ressourcen im Ordner res/, die Ihr Code nicht auf ihn 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]
<ph type="x-smartling-placeholder">

Bibliotheken, die Sie Ihrem Code hinzufügen, können ungenutzte Ressourcen enthalten. Gradle kann automatisch in Ihrem Namen Ressourcen entfernen, wenn Sie shrinkResources in Ihrem build.gradle.kts-Datei der App.

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 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 (weitere Informationen unter 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

Bei der Entwicklung einer Android-App verwendest du normalerweise externe Bibliotheken, um die Nutzungsfreundlichkeit und Vielseitigkeit. 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 Desktop entwickelt wurde, kann sie viele Objekte und Methoden enthalten, die 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.

<ph type="x-smartling-placeholder">

Decodierung animierter Bilder

In Android 12 (API-Level 31) hat das NDK ImageDecoder API wurde zum Decodieren erweitert Alle Frames und Timing-Daten von Bildern, die das animierte GIF- und das animierte WebP-Dateiformat verwenden.

Verwenden Sie ImageDecoder anstelle von Drittanbieterbibliotheken, um verringere die APK-Größe und profitiere von zukünftigen Updates in Bezug auf Sicherheit und Leistung.

Weitere Informationen zur ImageDecoder API finden Sie in der API reference und die 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 ursprünglich für andere Bildschirmdichten.

Wenn Ihre App nur skalierte Bilder benötigt, können Sie noch mehr Platz sparen, indem Sie eine einzige Variante von ein Bild in drawable-nodpi/. Wir empfehlen, mindestens xxhdpi anzugeben Bildvariante in Ihrer App verwenden.

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 dynamisch zeichnen. zur Laufzeit ausgeführt wird. Drawable Objekte – oder <shape> in XML – kann sehr viel Speicherplatz in Ihrer APK-Datei 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 Bilds einfügen, wie gefärbte, schattierte oder gedrehten Versionen desselben Bildes. Wir empfehlen jedoch, dieselben Ressourcen wiederzuverwenden, und zur Laufzeit nach Bedarf anpassen.

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, bei denen es sich lediglich um ein rotiertes Äquivalent einer anderen Ressource handelt. 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 aapt-Tool kann PNG-Dateien, die bereits komprimiert sind, möglicherweise in die Höhe treiben. Um dies zu verhindern, Dazu können Sie das Flag isCrunchPngs verwenden, um diesen Vorgang für PNG-Dateien zu deaktivieren:
  • Kotlin

        buildTypes.all { isCrunchPngs = false }
        

    Cool

        buildTypes.all { isCrunchPngs = false }
        

PNG- und JPEG-Dateien komprimieren

Mit Tools wie pngcrush pngquant oder zopflipng. Alle diese Tools kann die Größe der PNG-Datei verringern und gleichzeitig die Wahrnehmung der Bildqualität beibehalten.

Das pngcrush-Tool ist besonders effektiv. Dieses Tool durchläuft PNG-Filter und zlib-Parameter (Deflate), bei dem das Bild mithilfe 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 den 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

Sie können Vektorgrafiken verwenden, um auflösungsunabhängige Symbole und andere skalierbare Medien zu erstellen. Sie können diese Grafiken nutzen, um den Platzbedarf Ihres APK deutlich zu verringern. 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 die einzelnen Elemente VectorDrawable-Objekt enthält. Bei größeren Bildern dauert es noch länger, bis sie auf dem Bildschirm erscheinen. Daher sollten Sie diese Vektorgrafiken nur für die Darstellung kleiner Bilder verwenden.

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

Animierte Bilder mit Vektorgrafiken versehen

Nicht verwenden AnimationDrawable um Frame-für-Frame-Animationen zu erstellen, da Sie hierfür eine separate Bitmap für jeden Frame der Animation, was die Größe Ihres APK drastisch erhöht.

Verwenden Sie stattdessen <ph type="x-smartling-placeholder"></ph> AnimatedVectorDrawableCompat zum Erstellen animierter Vektor Drawables.

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.

Aufzählungen vermeiden

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

Größe nativer Binärprogramme 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 aus dem Android-NDK, um unnötige Fehlerbehebungen zu entfernen aus nativen Bibliotheken. Anschließend können Sie Ihren 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 enthält möglicherweise Inhalte, die Nutzer herunterladen, aber nie verwenden, z. B. zusätzliche Sprache oder pro Bildschirmdichte. Damit Ihre Nutzer möglichst wenig herunterladen können, laden Sie Ihre App hier hoch: Google Play mit Android App Bundles 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 xxxhdpi nicht Ressourcen, die Sie für Geräte mit Bildschirmdichten verwenden können.

Weitere Informationen finden Sie unter Erstellen mehrerer APKs und Unterstützung mehrerer APKs