Tipps für Android-Entwickler zum Reduzieren der APK-Dateigröße
Veröffentlicht: 2015-10-281) ProGuard
Ein Tool zum Verkleinern des Codes wie ProGuard reduziert die Größe der APK-Datei erheblich. Das Tool ist bei sourceforge erhältlich. Beachten Sie, dass es sehr wichtig ist, die gesamte Anwendung nach der Anwendung von ProGuard erneut zu testen, da dies das Anwendungsverhalten manchmal ändern kann. Da ProGuard die Anwendungssymbole ersetzt, um den Code schwer lesbar zu machen, ist es wichtig, dass Sie die Symbolzuordnung beibehalten, damit Sie einen Stack-Trace zurück in die ursprünglichen Symbole übersetzen können, wenn Sie einen Absturz in Ihrer Anwendung untersuchen müssen.
2) Entfernen von Debug-Informationen
Ich empfehle, dass Sie alle debugbezogenen Funktionen aus der Anwendung entfernen. Die Anwendung sieht oder verwendet diese Daten im Allgemeinen nicht, und das Android-Betriebssystem erfordert sie nicht, um die Anwendung auszuführen. Daher verschwenden die Debug-Informationen nur Platz und sollten entfernt werden.
Um dies zu erreichen, müssen alle Debug-bezogenen Funktionen in bedingte Blöcke eingeschlossen werden, wie unten:
statisches abschließendes Debuggen = falsch; wenn (debuggen) { v(TAG, „Debug …“) }
Es ist wichtig, dass das Debug-Flag zur Kompilierzeit gesetzt (dh als statisch final deklariert) wird, damit der Compiler die gesamte Debug-Funktionalität vollständig entfernen kann. Es ist keine gute Idee, eine eigene Debug-Methode wie die unten gezeigte zu erstellen, da der Aufruf von myDebugPrint() nicht von einem Bedingungsblock eingeschlossen ist, was bedeutet, dass der Compiler Informationen über myDebugPrint() in der aufrufenden Klasse behalten muss.
öffentlich void myDebugPrint() wenn (Fehlerbehebung) v(TAG, „Debug …“); } } … meinDebugPrint()
3) Entfernung von Debug-Symbolen aus nativen Bibliotheken Die Verwendung von Debug-Symbolen ist sinnvoll, wenn sich Ihre Anwendung noch in der Entwicklung befindet und noch debuggt werden muss. Wenn beim Kompilieren eines Release-Builds jedoch weiterhin Debug-Symbole angezeigt werden und Sie diese entfernen möchten, empfehlen wir, die Debug-Symbole aus nativen Bibliotheken (.so-Dateien) zu entfernen. Dies erfolgt mit dem Befehl arm-eabi-strip aus dem Android NDK.
4) Empfohlene Medienformate Wenn Ihre Anwendung stark auf Bilder, Audio oder Video angewiesen ist, können Sie die APK-Dateigröße auch durch die Verwendung bestimmter Medienformate reduzieren. Wir empfehlen die Verwendung der folgenden Medienformate für Bilder, Audio und Video:
- Video: Verwenden Sie H264 AVC. Codieren Sie das Video mit einer Auflösung, die nicht größer ist als die Bildschirmauflösung des Zielgeräts (falls bekannt).
- Audio : AAC Audio wird für alle Audioressourcen empfohlen. AAC erreicht eine bessere Komprimierung bei einer bestimmten Qualität im Vergleich zu mp3 oder Ogg Vorbis. Raw-Formate wie WAV sollten niemals verwendet werden. Die gemeinsame Begründung für die Verwendung des WAV-Formats ist, dass das Decodieren komprimierter Audiostreams normalerweise eine hohe Latenz bei der Wiedergabe bedeutet. Android bietet jedoch die Sound Pool API, die es Anwendungen ermöglicht, komprimierte Audiostreams ohne die Strafe einer hohen Latenz zu verwenden.
- Bilder : PNG oder JPEG. Verwenden Sie PNGs; Da es sich um ein verlustfreies Format handelt, eignet es sich sehr gut für Texturen und Grafiken, da durch die Komprimierung keine visuellen Artefakte entstehen. Wenn der Platz begrenzt ist, verwenden Sie JPEGs oder eine Kombination aus PNGs und JPEGs. Ein hochwertiges JPEG-Bild kann gut für große fotorealistische Bilder funktionieren, für die das JPEG-Komprimierungsschema optimiert ist.
- Optimieren Sie PNG-Größen ohne Qualitätsverlust
Wenn Sie das PNG-Format verwenden, können PNG-Bilder ohne Qualitätsverlust in der Dateigröße reduziert werden. Verwenden Sie dazu ein Tool wie OptiPNG oder PNGCrush. Beide eignen sich hervorragend zum Reduzieren der PNG-Dateigröße bei gleichzeitiger Gewährleistung der Bildqualität. PNGcrush ist ein Open-Source-Programm, das PNG-Filter und zlib-Parameter (Deflate) durchläuft, das Bild wiederholt mit jeder Parameterkonfiguration komprimiert und die Konfiguration auswählt, die die kleinste komprimierte Ausgabe (IDAT) ergibt. Auf der anderen Seite führt OptiPNG die Versuche vollständig im Speicher durch und schreibt nur die endgültige Ausgabedatei auf die Festplatte. Darüber hinaus bietet es dem Benutzer mehrere Optimierungsvoreinstellungen.
5) Ungenutzte Ressourcen entfernen Eine weitere potenzielle Gruppe von Platzverschwendern, die Sie zum Entfernen aus Ihrer APK-Datei in Betracht ziehen sollten, sind ungenutzte Ressourcen in Ihrem res-Verzeichnis, wie etwa ungenutzte Layouts, Drawables und Farben. Verwenden Sie das android-unused-resources-Tool, um ungenutzte Ressourcen in Ihrem APK zu erkennen, die möglicherweise entfernt werden können. Android Unused Resources ist eine Java-Anwendung, die Ihr Projekt auf ungenutzte Ressourcen scannt.
6) Vermeidung von Duplizierung Sicherzustellen, dass Ihre Anwendung keine doppelte Funktionalität oder doppelte Assets hat, ist eine offensichtliche Möglichkeit, unnötige Dateien in Ihrem APK zu vermeiden. Es ist wichtig zu verstehen, welche Android-APIs Sie verwenden und welche Funktionen sie jeweils bieten. Es könnte sein, dass eine Android-API bereits die Arbeit einer anderen API erledigt. Duplizierte Assets (Strings, Bitmaps usw.) sind ebenfalls Platzverschwendung und können leicht vermieden werden. In geringerem Maße wird duplizierter Code auch die Größe der gelieferten Binärdatei unnötig erhöhen.
7) Reduzieren Sie die Anzahl Ihrer Methoden Begeisterte Android-Entwickler haben lange mit einem Problem konfrontiert, das Kopfschmerzen bei ihren Apps verursacht. Die Anzahl der Methoden, die eine App haben kann, ist begrenzt. Nun, es war früher begrenzt. Endlich haben die guten Leute von Google im vergangenen Oktober eine Lösung bereitgestellt, aber sie war alles andere als ideal. Obwohl sehr einfach zu implementieren, verkomplizierte die Multidex-Lösung und verlängerte die Kompilierungszeit erheblich. Beginnend mit Lollipop (Android 5.0) wurde die gesamte Android Virtual Machine revolutioniert, um eine viel langlebigere Lösung anzubieten, die sogar die reguläre Kompilierungszeit verbessert. Allerdings ist die Lollipop-Lösung vorerst auch nicht ideal. Es erfordert, dass Entwickler nur gegen Lollipop entwickeln, was problematisch sein könnte, da die meisten Apps mit einem breiteren Publikum kompatibel sein möchten und möglicherweise Angst haben, Funktionen zu verwenden, die in früheren Android-Versionen nicht verfügbar sind. Im Moment ist die Lollipop-Lösung also eine gute zukünftige Android-Lösung, wird aber in absehbarer Zeit möglicherweise keine großen Auswirkungen haben. Was kann man also in der Zwischenzeit tun? Wir sind uns alle einig, dass Sie nicht auf Funktionen und Fähigkeiten verzichten sollten, nur um das 65K-Limit nicht zu erreichen. Aber es besteht kein Zweifel, dass die beste Vorgehensweise immer noch darin besteht, die Anzahl Ihrer Anwendungsmethoden zu reduzieren. Wie können Sie also trotzdem versuchen, die Anzahl Ihrer Methoden zu reduzieren, ohne den kleinen Funken zu verlieren, der Ihre App zu etwas Besonderem macht?
Ein kurzer Überblick: „Wo kommen all diese Methoden her?“
Die Methodenanzahlgrenze liegt ungefähr bei 65.000 Methoden (65.536, um genau zu sein). Das klingt nach einer riesigen Zahl. Wenn Sie ein unerfahrener Android-Entwickler sind, denken Sie vielleicht: „Wie um alles in der Welt können so viele Apps diese Zahl so schnell erreichen?“ Sie haben wahrscheinlich etwas Recht. Es ist nicht einfach, so viele Methoden selbst zu schreiben. Aber App-Entwickler schreiben nicht ihre gesamte App selbst. App-Entwickler verwenden immer mehr Bibliotheken von Drittanbietern (SDKs – Software Development Kits), die ihnen helfen, bestimmte Ziele und Funktionen zu erreichen, die sie sonst komplett selbst entwickeln müssten. Von Anzeigen über GUI-Verbesserungen bis hin zu sozialen Netzwerken, Absturzberichten und vielem mehr bieten SDKs eine breite Palette von Funktionen und APIs, die wertvolle Entwicklungszeit sparen und helfen, Ihre App schneller auf den Markt zu bringen. Aber jedes SDK trägt zu Ihrer Methodenanzahl bei, und einige SDKs leisten sogar mehr als nur das, was Sie erwartet haben. Es ist natürlich nicht unbedingt etwas Schlechtes. Der Gnadenstoß kam jedoch von Google selbst. Ihr Google Play Services Kit ist ein großes SDK mit über 28.000 Methoden. Da das Limit bei 65.000 liegt, ist diese Zahl nicht gerade niedrig. Und viele App-Entwickler würden dieses SDK gerne verwenden, da es die Tür zum magischen Google-Königreich öffnet, eine begehrte Funktion, die der eigenen App viel Wert hinzufügt. In diesem Beitrag werde ich nicht nur erklären, wie Sie die Google Play Services-Pakete selektiv verwenden, sondern Ihnen auch einen Überblick darüber geben, wie viele Methoden jedes dieser Pakete Ihrer App hinzufügt. Also haltet euch gut fest, es wird eine holprige Fahrt.
Der Spielplatz der Google Play-Dienste
Wie viele Methoden fügt Google Play Services also tatsächlich hinzu? Nun, wie bei allem im Leben ist es viel komplizierter als nur eine Zahl unterm Strich. Aber gehen wir einen Schritt nach dem anderen vor. Das Google Play Services SDK enthält tatsächlich 19 verschiedene SDKs. Mit Gradle können Sie selektiv auswählen, welche Sie verwenden möchten. Sie müssen lediglich die folgende Abhängigkeit zur build.gradle -Datei Ihres App-Moduls hinzufügen:
Abhängigkeiten { kompiliere 'com.google.android.gms:play-services:7.5.0' }
Mit 7.5.0 ist dies die neueste GPS-Version, die zu diesem Zeitpunkt veröffentlicht wurde. Es wird im Android SDK Manager als Revision 25 bezeichnet. Um bestimmte Pakete auszuwählen, ersetzen Sie die folgende Zeile durch so viele Abhängigkeitszeilen, wie Sie möchten, und geben Sie bestimmte Pakete an. Angenommen, Sie möchten nur Google Plus, Google Games, Google Ads und Google Maps:
Abhängigkeiten { kompiliere 'com.google.android.gms:play-services-plus:7.5.0' kompiliere 'com.google.android.gms:play-services-games:7.5.0' kompilieren Sie „com.google.android.gms:play-services-ads:7.5.0“ kompiliere 'com.google.android.gms:play-services-maps:7.5.0' }
Nicht zu schwierig, aber hier ist der erste Haken. Eines der glorreichen 19 SDKs heißt Play-Services-Base. Wenn Sie ein Google Play Service-Paket hinzufügen, wird es automatisch ebenfalls hinzugefügt. Wie viele Methoden enthält das Basispaket? Fast 8.000 (genaue Zahl unten).
Und hier ist der zweite Haken. Ich habe nicht nur 3 Pakete in das obige Beispiel aufgenommen. Ich habe nicht einmal nur 4 hinzugefügt, wenn Sie das Basispaket mitzählen. Tatsächlich habe ich 5 Pakete eingeschlossen. Wieso den? Weil das Google Games-Paket das Google Drive-Paket verwendet und dieses ebenfalls importiert wurde (in Wirklichkeit enthält Google Ads auch ein Paket namens Tag Manager, aber ich zähle hier nur die „auswählbaren“ Pakete).
Jetzt beginnen wir also zu verstehen, warum es etwas schwieriger ist, zu zählen, wie viele Methoden jedes Paket der Google Play-Dienste unserer App hinzufügt. Das Einschließen eines Pakets bedeutet nicht zwangsläufig, die anderen auszuschließen.
Hier also die Fakten – welche Pakete Sie hinzufügen können, wie viele Methoden sie hinzufügen und welche anderen Pakete sie mitbringen, um die Party zum Absturz zu bringen. Die Daten beziehen sich auf die neuste Version der Google Play Services (7.5.0 / Revision 25):
Gesamtzahl der Methoden: 28.175. Einige dieser Zahlen, das müssen Sie zugeben, sind wirklich grauenhaft. Wenn Sie nur das Panorama-Paket wollten, können Sie nicht nur neun Methoden bekommen, Sie müssen fast 8.000 bekommen. Kein Wunder, dass so viele Apps dieser Grenze von 65 KB nahekommen oder diese überschreiten.
Einige dieser Zahlen scheinen etwas inkonsistent zu sein, wenn Sie versuchen, sie zu addieren. Das liegt daran, dass die Logik hinter Google Play Services etwas kniffliger ist, als man denkt. Beispielsweise enthält Google Analytics eine einzelne Methode von Google Ads, um die Werbe-ID des Kontos zu erhalten.
Beachten Sie, dass Sie beim Berechnen, wie viel jedes Paket zu Ihrer App hinzufügt, Doppelungen ausschließen (z. B. das Basispaket nicht mehr als einmal zählen).
Sie können nicht alles selektiv hinzufügen
Und hier ist der letzte Stich. Es gibt zwei winzige Pakete in Google Play Services, die nicht selektiv hinzugefügt werden können. Das Suchpaket (das Ihnen Zugriff auf die Google Now-API gewährt) enthält nur 22 Methoden. Wenn Sie es verwenden möchten, haben Sie keine andere Wahl, als die gesamten über 28.000 Methoden, die gesamten Google Play-Dienste, hinzuzufügen. Hoffentlich wird dies in späteren Versionen behoben.
(Ein weiteres „unzugängliches“ Paket ist das Paket appstate , das 111 Methoden enthält, jedoch jetzt zugunsten von SavedGames , das im Paket google-play-games enthalten ist, veraltet ist).