Autor: JD Technology Feng Jianhua
1. Hintergrund
Mit der kontinuierlichen iterativen Aktualisierung des Geschäfts nimmt auch die Größe der App rasant zu, von 2019 bis 2022 überschritt sie einmal 117 Mio. In diesem Zeitraum haben wir auch einige Optimierungen vorgenommen, wie im roten Teil von Abbildung 1 zu sehen ist , stehen wir bei der Optimierung vor neuen Herausforderungen: Inkrementeller Code, die Paketgröße ist weiter gestiegen . Die Paketgröße wirkt sich direkt oder indirekt auf wichtige Indikatoren wie Download-Konvertierungsrate, Installationszeit und Speicherplatz aus, daher ist es notwendig, Energie darauf zu verwenden, eine tiefere Optimierung der Installationspaketgröße zu untersuchen. Laut den internen Daten von Google Store kann jede Reduzierung der APK-Größe um 10 Millionen die Download-Conversion-Rate um durchschnittlich ~1,5 % erhöhen, wie in Abbildung 2 dargestellt:

Abbildung 1 Der Volumenänderungsprozess der JD Finance Android-Version 2019–2022 (der rote Teil ist Teil der Optimierung, die während des Zeitraums durchgeführt wurde, aber er erholte sich bald wieder)
Abbildung 2 Steigerung der Conversion-Rate der Google Store App / 10 Mio. [1]
Daher haben wir ab September 2022 eine spezielle Berichtigung zur Verschlankung des Finanz-APP durchgeführt.Ohne Berücksichtigung der Zunahme der Situation und ohne Löschung des Geschäftscodes haben wir die Verschlankung von 117M auf 74M realisiert.Im Prozess der Verschlankung Diesmal stießen wir beim Installationspaket auf viele Fallstricke, sammelten aber auch einige Erfahrungen, die wir hier mit Ihnen teilen möchten.
2. APK-Analyse
Als nächstes analysieren wir kurz die verschiedenen Komponenten in der Apk und die Standardstruktur der Apk als ZIP, um Datenunterstützung für die Zielsetzung und Aufgabenzerlegung des Pakets zu bieten.
2.1 APK-Inhaltsanalyse

Abbildung 3 APK-Struktur
•classes.dex APK kann eine oder mehrere Classes.dex-Dateien enthalten, und der Java/Kotlin-Quellcode in der Anwendung wird schließlich in der Classes.dex-Datei in Form von Bytecode vorhanden sein.
•resources.arsc Das Werkzeug aapt packt einige Ressourcen oder Ressourcenindizes in die Datei resources.arsc, wenn es Ressourcen kompiliert.
•res/ Ressourcendateien mit Ausnahme von Werten im res-Verzeichnis im Quellcodeprojekt, und die Pfade dieser Dateien werden gleichzeitig in resources.arsc aufgezeichnet.
• lib/nativeLibraries, dh die so-Datei im jni-Verzeichnis des Quellcodeprojekts, und das sekundäre Verzeichnis ist die von NDK unterstützte ABI.
•assets/ unterscheidet sich vom Ressourcenverzeichnis res/. Die Ressourcendateien unter assets/ generieren keine Abfrageeinträge in resources.arsc, und das Ressourcenverzeichnis unter assets/ kann vollständig angepasst und über das AssetManager-Objekt im Programm abgerufen werden.
•META-INF/ Dieser Ordner enthält hauptsächlich die Signaturdateien CERT.SF und CERT.RSA sowie die Manifestdatei MANIFEST.MF .
•AndroidManifest.xml-Anwendungsmanifestdatei, die verwendet wird, um die grundlegenden Informationen der Anwendung zu beschreiben, hauptsächlich einschließlich des Anwendungspaketnamens, der Anwendungs-ID, der Anwendungskomponenten, der erforderlichen Berechtigungen, der Gerätekompatibilität usw.
2.2 SDK-Größenanalyse
Durch unsere selbst entwickelte Plattform zur Verbesserung der Energieeffizienz Pandora[7] können wir intuitiv die Größe des SDK erkennen, wie in Abbildung 4 dargestellt:
Abbildung 4 SDK-Größensortierung (einschließlich Versionsnummer)
Abbildung 5 Liste und Größe der im SDK enthaltenen SO-Bibliotheken
Bestimmen Sie anhand der Analyse des SDK und in Kombination mit dem Unternehmen, welches Unternehmen für das Plug-in geeignet ist, und reduzieren Sie dann intuitiv die Paketgröße.
2.3 Analyse der ZIP-Struktur
Sie können den Befehl zipinfo verwenden, um das detaillierte Informationsprotokoll jeder Datei im komprimierten Paket auszugeben, Verwendung: zipinfo -l --t --h test.apk > test.txt
Die Ausgabeprotokolldatei wird wie in Abbildung 6 gezeigt geöffnet. Es gibt eine Zeile mit Komprimierungsinformationen für jede Datei, einschließlich Dateiname, Originalgröße, komprimierte Größe und andere Indikatoren:
Abbildung 6 Die Größe der Dateiinformationen im APK
Analysieren Sie die obigen Protokollinformationen Zeile für Zeile und klassifizieren und zählen Sie sie nach dem entschleierten Dateinamenpfad und Dateityp, und Sie können die Übersichtsinformationen von Apk abrufen, einschließlich der Anzahl der verschiedenen Dateitypen, der Gesamtgröße, der Einzeldateigröße und andere Indikatoren und erstellen Sie einen Dateigrößenindex.
3. Schlankheitspraxis
Der gesamte Implementierungspfad ist in Abbildung 7 dargestellt, der hauptsächlich unterteilt ist in:
1. Herkömmliche technische Lösungen durch das Gradle-Plug-in (kein Code-Eindringen, Automatisierung), um die APP-Verschlankung während der Kompilierung abzuschließen;
2. Fortschrittliche technische Lösungen, wandeln einige Geschäftsbereiche durch Plug-in oder dynamischen SO-Download auf unterschiedliche Weise um.Je mehr Geschäftsumwandlungen, desto höher die Vorteile;
3. Geschäftsoptimierungsplan, basierend auf dem Datenbegräbnispunkt des Geschäftsbereichs, Generierung von Zugangs-UV für das Ranking und Rückmeldung des Geschäftsbereichs mit niedrigerem UV an das Architekturkomitee, um zu bewerten, ob es offline sein oder durch die fortschrittliche technische Lösung transformiert werden kann (2) und dann Paketgröße reduzieren.
Abbildung 7 Gesamtimplementierungspfad
3-1 Herkömmliche technische Lösungen
3-1-1 Bildverarbeitung
Nach der obigen Analyse der APP wird der Schluss gezogen, dass das Bild das größte Volumen einnimmt. Daher werden alle Bilder in der APP, einschließlich des SDK, automatisch durch die Schlankheitsaufgabe während des Kompilierungs- und Verpackungsprozesses optimiert. Das Gesamtoptimierungsschema wird angezeigt in Abbildung 8:
Abbildung 8 Bildoptimierungsschema
1. Multi-DPI-Optimierung:
Um sich an Geräte mit unterschiedlichen Auflösungen oder Modi anzupassen, hat Android Ressourcenpfade für Entwickler mit mehreren Konfigurationen derselben Ressource entworfen.Wenn die App Bildressourcen über Ressourcen bezieht, lädt sie automatisch die angepassten Ressourcen gemäß der Gerätekonfiguration, aber diese Das offensichtliche Problem besteht darin, dass Geräte mit hoher Auflösung nutzlose Bilder mit niedriger Auflösung oder Geräte mit niedriger Auflösung nutzlose Bilder mit hoher Auflösung enthalten.
Unter normalen Umständen wählt die App für den inländischen Anwendungsmarkt zur Reduzierung der Paketgröße einen Satz von dpi mit dem höchsten Marktanteil (Google empfiehlt xxhdpi), um mit allen Geräten kompatibel zu sein. Die meisten Apps, die auf den Anwendungsmarkt in Übersee abzielen, werden verpackt und über AppBundle auf Google Play hochgeladen und können die Funktion der dynamischen Verteilung von dpi nutzen. Mobiltelefone mit unterschiedlichen Auflösungen können Bildressourcen mit unterschiedlichen dpi herunterladen, daher müssen wir mehrere Sätze bereitstellen von dpi, um alle Geräte zufrieden zu stellen. . Im Projekt haben einige unserer Bilder nur einen dpi-Satz und einige haben mehrere dpi-Sätze.Für die beiden oben genannten Szenarien haben wir beim Packen Ressourcen zusammengeführt und kopiert, wodurch die Paketgröße reduziert wurde.
2. In das Webp-Format konvertieren:
WebP ist ein von Google bereitgestelltes Bilddateiformat, das verlustbehaftete und verlustfreie Komprimierung unterstützt und eine bessere Komprimierung als JPEG oder PNG bieten kann. Unterstützt verlustbehaftete WebP-Bilder in Android 4.0 (API-Level 14), verlustfreie und transparente WebP-Bilder in Android 4.3 (API-Level 18) und höher
Deshalb: Wir verwenden das Plug-in, um das Format des Bildes durch das von Google bereitgestellte Shell-Programm während der Kompilierungszeit zu konvertieren, und die Konvertierung löscht erfolgreich das alte Bild, wodurch der Effekt der APK-Verschlankung erreicht wird
3.png-Komprimierung
Pngquant ist ein benutzerfreundliches PNG-Komprimierungstool, ein Befehlszeilentool, das eine verlustbehaftete Bildkomprimierung durchführen kann, sodass Sie nach der Verarbeitung von 1 und 2 Pngquant verwenden können, um eine sekundäre Komprimierung durchzuführen, um eine bessere Bildverschlankung zu erreichen.
3-1-2 R-Datei-Inline-Optimierung
DEX ist die Bytecode-Datei, die aus dem Java/Kotlin-Quellcode kompiliert wurde. Die Optimierung von DEX besteht eigentlich darin, die Bytecode-Datei zu optimieren. DEX enthält eine große Anzahl von Ressourcenindex-R-Dateien. Hier sprechen wir hauptsächlich darüber, wie man die Ressourcen-ID inline durchläuft. Löschen Sie die R-Datei, um den Zweck des APK-Abnehmens zu erreichen:
Machbarkeitsanalyse zum Abnehmen von R-Dateien
In der täglichen Entwicklungsphase Referenzressourcen im Hauptprojekt bis R.xx.xx Nach der Kompilierung werden die den R-Klassenreferenzen entsprechenden Konstanten in die Klasse kompiliert.
setContentView(2131427356);
Diese Änderung wird als Inlining bezeichnet, was ein Mechanismus von Java ist (wenn eine Konstante als statisch final markiert ist, wird die Konstante während der Java-Kompilierung in den Code eingefügt, wodurch die Speicheradressierung von Variablen einmal reduziert wird). Im Nicht-Hauptprojekt wird die Ressourcen-ID der R-Klasse per Verweis in die Klasse kompiliert, und es wird kein Inlining generiert.
setContentView(R.layout.activity_main);
Der Grund für dieses Phänomen wird durch das AGP-Verpackungstool verursacht. Für Details können Sie den Verarbeitungsprozess des Android-Gradle-Plugins in der R-Datei überprüfen. Fazit: Das Programm kann ausgeführt werden, nachdem die R-Klassen-ID eingebunden wurde, aber nicht alle Projekte erzeugen automatisch ein Inline-Phänomen. Wir müssen technische Mittel einsetzen, um die R-Klassen-ID zum richtigen Zeitpunkt in das Programm einzufügen. Wenn Sie sich auf R-Dateien verlassen Auch hier können Sie die R-Dateien löschen, um die Größe des Pakets zu reduzieren, während die Anwendung normal ausgeführt wird.Wie in Abbildung 9 gezeigt, wird nach Abschluss der Kompilierung eine große Anzahl von R-Dateien generiert:

Abbildung 9 Schematische Darstellung der Projekt-R-Dateigenerierung
Das Gesamtschema ist in Abbildung 10 dargestellt:
Abbildung 10 Optimierungsprozess für R-Dateien
Hinweis : In der Ersetzungsphase muss eine sekundäre Prüfung hinzugefügt werden, um zu verhindern, dass die ResourceNotFind-Ausnahme zur Laufzeit erscheint, nachdem die Ersetzung abgeschlossen ist, wie unten gezeigt:
try {
int value = RManager.checkInt(type, name);
}catch (Exception e){
String errorMsg = "resource is not found(I),className="+className+",fieldName="+owner+"."+name;
throw new ResourceNotFoundException(errorMsg);
}
try {
int[] value = RManager.checkIntArray(type, name);
}catch (Exception e){
String errorMsg = "resource is not found(I[]),className="+className+",fieldName="+owner+"."+name;
throw new ResourceNotFoundException(errorMsg);
}
3-1-3 AndResGuard für Ressourcenverwirrung
1. Analyse des Ressourcenladeprozesses
Während des Entwicklungsprozesses verwenden wir die von aapt generierten Konstanten in R.java, um Ressourcen zu verwenden, und die Stellen, an denen die Konstanten nach der Kompilierung verwendet werden, werden durch die konstanten Werte ersetzt, wie unten gezeigt:
final View layout = inflater.inflate(2131165182, container, false);
Das heißt, wir verwenden einen int-Wert, um die Ressource über Resource zu finden. Wie findet Resource bestimmte Ressourcen über int-Werte? Wenn wir die apk entpacken, können wir sehen, dass sich darin eine Datei resources.arsc befindet. Diese Datei wird ebenfalls von aapt generiert. Die Zuordnungsbeziehung zwischen Ressourcen-ID und Ressourcenschlüssel wird in der Datei gespeichert. Ressource findet Ressourcen gemäß dieser Zuordnungsbeziehung .
2.resources.arsc:
Abbildung 11 zeigt die Zuordnungsbeziehung, die in resources.arsc gespeichert ist. resources.arsc kann als Ressourcenzuordnungsdatenbank verstanden werden, und der spezifische Pfad und Name werden gemäß der ID zugeordnet.
Abbildung 11 „resources.arsc“-Analyse
Konvertieren Sie nach dem Dekomprimieren des APK den Namen der Ressourcendatei in eine kurze Kette, z. B. res/layout/hello.xml in r/l/a.xml, und ändern Sie dann den Wert entsprechend resources.arsc, um den gesamten Schlankheitseffekt zu erzielen.
AndResGuard[5] ist ein von WeChat gestartetes Tool zur Ressourcenoptimierung, dessen Grundidee ähnlich der Verschleierung in ProGuard ist, mit der die oben genannten Lösungen realisiert werden können.
3-1-4 7zip-Komprimierung
Erklärung des 7zip-Befehls:
-t: Gibt den Komprimierungstyp an, unterstützt 7z, xz, split, zip, gzip, bzip2, tar, ....
-m: Gibt den Komprimierungsalgorithmus an, der Standardwert ist Deflate
Der konkrete Ablauf ist wie folgt:
Schritt 1: Verwenden Sie den 7z-Befehl, um das unsignierte Paket in das angegebene Verzeichnis zu dekomprimieren: 7za x ${unsigned package} -o${7z decompressed directory}
Schritt 2: Verwenden Sie zuerst den 7z-Befehl, um alle dekomprimierten Verzeichnisse zu komprimieren: 7za a -tzip -mx9 ${target 7z file name} ${7z decompressed directory}
Schritt 3: Erhalten Sie Speichertypdateien und eine Liste von Dateien, deren Komprimierungsmodus Stored ist, über den aapt-Befehl im Android SDK: aapt l -v ${unsigned package}
Schritt 4: Aktualisieren Sie die Speichertypdatei und verwenden Sie den 7z-Befehl, um die Speichertypdatei auf das im zweiten Schritt generierte 7zip-Installationspaket zu aktualisieren: 7za a -tzip -mx0 ${target 7z file name} ${storage type file directory }
3-1-5 Konfigurieren der CPU-Architektur
Erstellen Sie verschiedene Arten von Installationspaketen entsprechend unterschiedlicher CPU-Architekturen. Derzeit sind Mainstream-Geräte 64-Bit-Maschinen, daher veröffentlicht der Android-Markt hauptsächlich Installationspakete, die auf der Grundlage von arm64-v8a kompiliert und erstellt wurden
ndk {
abiFilters arm64-v8a
}
3-1-6 arsc-Kompression
resources.arsc hat einen hohen Volumengewinn für die Komprimierung, aber die Komprimierung wirkt sich auf die Startgeschwindigkeit und die Speichermetriken aus. Der Grund ist: Wenn das System die arsc-Datei lädt und die arsc-Datei nicht komprimiert ist, kann mmap für die Speicherzuordnung verwendet werden; wenn die arsc-Datei komprimiert ist, muss sie dekomprimiert und in den RAM-Puffer eingelesen werden, was zunimmt Speicherauslastung und auch Es wird die Startgeschwindigkeit verlangsamen.
Aus dem gleichen Grund kann der Beamte diese Methode nicht verwenden, um resources.arsc nach targetSdkVersion>=30 zu erzwingen, da sonst die Installation direkt fehlschlägt, sodass dieser Artikel nicht weiter ausgeführt wird.
3-1-7 Internationalisierte Sprachverarbeitung
Die JD Financial App wird derzeit nur auf dem heimischen Markt betrieben, aber Dutzende von Sprachen wurden zu einer großen Anzahl von SDKs hinzugefügt, die verbunden sind , was zu einer größeren Gesamtgröße führt.Nach der Evaluierung können nutzlose Sprachressourcen durch Konfiguration entfernt werden resConfigs.
defaultConfig {
resConfigs "zh","en"
}
3-1-8 schrumpfenRessourcen
ShrinkResources: Wird verwendet, um nutzlose Ressourcendateien während der Kompilierung zu erkennen und zu löschen, d. h. Ressourcen, auf die nicht verwiesen wird
minifyEnabled: Wird verwendet, um das Löschen von nutzlosen Codes zu ermöglichen, z. B. Codes, auf die nicht verwiesen wird. Wenn Sie also wissen müssen, ob auf eine Ressource verwiesen wird, müssen Sie sie in Verbindung mit minifyEnabled verwenden. Nur wenn beide wahr sind, wird es wirklich ungültig löschen Codes und nicht referenzierte Ressourcen das Ziel von.
Seine Funktion besteht darin, nicht referenzierte Ressourcendateien durch eine kleinformatige Datei zu ersetzen (es gibt immer noch einen Fußabdruck, während der Ressourceneintrag beibehalten wird, sodass das Volumen von resources.arsc nicht verringert wird) , auf die über res/raw/ The keep zugegriffen werden kann .xml-Datei konfiguriert den ShrinkMode und die Whitelist.
buildTypes {
release {
// 不显示Log
buildConfigField "boolean", "LOG_DEBUG", "false"
//混淆
minifyEnabled true
// 移除无用的resource文件
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig sign.release
}
}
3-1-9 Codierungsbeschränkungen
• Verwenden Sie Aufzählungstypen so wenig wie möglich, da die Aufzählung viel Volumen nach dem Kompilieren in Bytecode erhöht, wie in Abbildung 12 gezeigt (der Bytecode nach dem Kompilieren von 22 Codezeilen beträgt 86 Zeilen).
Abbildung 12 Vergleich von kompilierten Bytecodes von Aufzählungstypen
• Entfernen Sie unnötige LOG-Ausgaben
3-2 Fortschrittliche technische Lösungen
Der dynamische Download der SO-Bibliothek und die Plug-in-Technologie stellen im Wesentlichen eine Kategorie des dynamischen Downloads dar. Die beiden Lösungen können im Unternehmen über einen langen Zeitraum hinweg kontinuierlich verwendet werden. Die Auswahl im spezifischen Nutzungsprozess ist in Abbildung 13 dargestellt:
Abbildung 13 Wie Unternehmen fortschrittliche Lösungen auswählen
3-2-1 Dynamisches Laden der SO-Bibliothek
Einige Unternehmen in der APP sind nicht für die Plug-in-Transformation geeignet. Nach der Demontage stellt sich heraus, dass die SO-Bibliothek einen großen Anteil ausmacht. Daher kann ein dynamisches Herunterladen für die Transformation in Betracht gezogen werden, um die Größe zu reduzieren.
Zwei Möglichkeiten zum Laden der SO-Bibliothek
Auf die erste Weise können wir die SO-Bibliothek direkt herunterladen und in das angegebene Verzeichnis legen.
Die zweite Möglichkeit besteht darin, die SO-Bibliothek in das Verzeichnis zu laden, das durch die Umgebungsvariable festgelegt wird. Daher müssen wir das angegebene Verzeichnis zur Umgebungsvariablen hinzufügen, um die SO-Bibliothek normal zu laden
System.load("{安全路径}/libxxx.so")
System.load("xxx")
1. So legen Sie den Speicherort der Umgebungsvariablen der SO-Bibliothek in der APP fest (bezogen auf Tinker):
final Field pathListField = ShareReflectUtil.findField(classLoader, "pathList");
final Object dexPathList = pathListField.get(classLoader);
final Field nativeLibraryDirectories = ShareReflectUtil.findField(dexPathList, "nativeLibraryDirectories");
List<File> origLibDirs = (List<File>) nativeLibraryDirectories.get(dexPathList);
if (origLibDirs == null) {
origLibDirs = new ArrayList<>(2);
}
final Iterator<File> libDirIt = origLibDirs.iterator();
while (libDirIt.hasNext()) {
final File libDir = libDirIt.next();
if (folder.equals(libDir)) {
libDirIt.remove();
break;
}
}
origLibDirs.add(0, folder);
final Field systemNativeLibraryDirectories = ShareReflectUtil.findField(dexPathList, "systemNativeLibraryDirectories");
List<File> origSystemLibDirs = (List<File>) systemNativeLibraryDirectories.get(dexPathList);
if (origSystemLibDirs == null) {
origSystemLibDirs = new ArrayList<>(2);
}
final List<File> newLibDirs = new ArrayList<>(origLibDirs.size() + origSystemLibDirs.size() + 1);
newLibDirs.addAll(origLibDirs);
newLibDirs.addAll(origSystemLibDirs);
final Method makeElements = ShareReflectUtil.findMethod(dexPathList, "makePathElements", List.class);
final Object[] elements = (Object[]) makeElements.invoke(dexPathList, newLibDirs);
final Field nativeLibraryPathElements = ShareReflectUtil.findField(dexPathList, "nativeLibraryPathElements");
nativeLibraryPathElements.set(dexPathList, elements);
2. So löschen Sie die angegebene SO-Bibliothek und den gesamten Ladevorgang, wie in Abbildung 14 gezeigt:
Abbildung 14: Löschen und Laden der SO-Bibliothek
3-2-2 Plugin
Was ist ein Plugin:
Plug-in soll eine Apk in verschiedene Sub-Apks (d. h. verschiedene Plug-ins) entsprechend den Geschäftsfunktionen aufteilen. Jede Sub-Apk kann unabhängig kompiliert und gepackt werden, und die integrierte Apk wird schließlich veröffentlicht und gestartet. Wenn Apk verwendet wird, wird jedes Plug-In dynamisch geladen, und Plug-Ins können auch Hotfixes und Hot-Updates erhalten.
•Host: Die Haupt-App kann verwendet werden, um Plugins zu laden und auch ein Host zu werden
• Plug-in: Plug-in-App, die vom Host geladene App, kann die gleiche Apk-Datei wie die normale App sein
Welche Unternehmensform eignet sich für die Plug-in-Transformation:
• Das Geschäft ist relativ unabhängig und vollständig von der Host-App entkoppelt
• Niedrige Renovierungskosten und relativ hohe Einnahmen
• Nimmt ein großes Volumen ein
Nach einer Reihe von Bewertungen erfüllt das Videogeschäft die oben genannten Punkte, und der Effekt nach der Transformation ist in Abbildung 15 dargestellt:
Abbildung 15 Der Effekt der Plug-in-Transformation der Video-Business-Halle
3-3 Geschäftsoptimierungsplan
Mit immer mehr Unternehmen werden einige alte Geschäfts-UVs immer niedriger, daher wurde eine Reihe von Geschäfts-Offline-Optimierungsprozessen formuliert, wie in Abbildung 16 dargestellt:
Abbildung 16 Prozess der Geschäftsoptimierungslösung
4. Kontrolle
Die Umsetzung des Schlankheitsplans ist sehr wichtig, und es ist wichtiger, dass die Folgekontrolle nicht zurückprallt.Während wir die Schlankheits-Governance betreiben, erforschen wir andererseits einen normalisierten Kontrollmechanismus und präzipitieren schließlich eine Reihe von Kontrollnormen und Kontrollmechanismen. Der Zweck von Management und Kontrolle besteht nicht darin, Geschäftswiederholungen oder neuen Code einzuschränken, sondern darin, seine Funktionen in begrenztem Code zu realisieren und das Bewusstsein der Ingenieure für das Abnehmen im täglichen Codieren zu verbessern.
4.1 SDK-Zugriffsspezifikation
Um die ungeordnete Erweiterung des SDK zu verhindern, wurde die SDK-Zugriffsspezifikation formuliert. Unter der Prämisse, die Funktion sicherzustellen, wird die Größe des SDK streng kontrolliert und der Rückprall des APP-Volumens wird weitestgehend kontrolliert.
4.2 Kontrollprozess
Abbildung 17 Steuerungsprozess
Entsprechend den Änderungen von Ressourcendateien wie Hinzufügen von Inhalten, Löschen von Inhalten, Erhöhen von Inhalten, Reduzieren von Inhalten, doppelte Dateien, Codeverwaltung usw. in Kombination mit Governance-Kontrollspezifikationen usw. werden die Verpackung und der Aufbau mit der historischen Version verglichen um den geänderten Inhalt zu erhalten, um zu bewerten, ob es Raum für Optimierung gibt, und um das Optimierungsziel anzugeben und die Verpackungsintegration nach der Optimierung neu zu erstellen.
5. Erfolge und Folgeplanung
5.1 Erfolge
Durch die oben genannten Maßnahmen wurde die Android-Version von JD Finance in zwei Quartalen um fünf Versionen von 117 Mio. auf die aktuellen 74 Mio. iteriert (Abbildung 18) und insgesamt in einem kontrollierbaren Bereich gehalten. Gleichzeitig werden wir in den nächsten Versionsiterationen das APK-Slimming normalisieren und die Paketgröße immer in einem kontrollierbaren Bereich halten.
Abbildung 18 Schlankheitsergebnisse des Finanz-APP
5.2 Nachträgliche Planung
Kontinuierliche Optimierung der technischen Mittel:
Die kontinuierliche Anhäufung und Iteration von Geschäften wird immer einige nutzlose Ressourcen erzeugen, daher sollten diese nutzlosen Dateien und Codes regelmäßig bereinigt werden, um das Installationspaket zu verschlanken;
Überwachen Sie jede Version gut, vergleichen Sie die Unterschiede zwischen den Versionen und stellen Sie fest, dass sie mit technischen Mitteln optimiert werden kann, ohne das Geschäft zu beeinträchtigen.
Aufbau der Online-Verwaltungs- und Steuerungsplattform:
In der Anfangsphase wurden Offline-Verwaltung und -Steuerung verwendet, was etwas zeitaufwändig zu implementieren war. In Zukunft werden wir den Aufbau der Online-Verwaltungs- und Steuerungsplattform verbessern, sie mit der gesamten App-Release- und Konstruktionsplattform integrieren, bilden einen Fließbandmechanismus und leisten gute Arbeit in Management und Kontrolle.
Zusammenfassung : Es ist noch ein langer Weg, um Installationspakete zu verschlanken. Dieser Artikel listet nur einige häufig verwendete Schlankheitslösungen auf. Neben der Optimierung für große Projekte muss auch bei der Governance zwischen Projekten gute Arbeit geleistet werden und optimieren Sie weiterhin die Größe der APP, um die Benutzererfahrung zu verbessern.
【Referenz】
[1] Paketgröße und Installations-Conversion-Rate
https://medium.com/googleplaydev/shrinking-apks-throating-installs-5d3fcba23ce2
[2] ProGuard https://www.guardsquare.com/proguard
[3] R8 https://r8.googlesource.com/r8
[4] Vergleich von ProGuard und R8
https://www.guardsquare.com/blog/proguard-and-r8
[5] AndResGuard https://github.com/shwenzhang/AndResGuard
[6] AGP https://developer.android.com/studio/releases/gradle-plugin
[7] Pandora: Ein Tool zur Verbesserung der Energieeffizienz in F&E- und Testphasen basierend auf dezentraler Technologie