Guten Morgen! Wir beginnen den Montag mit Material, dessen Übersetzung speziell für Studenten des Kurses
"Android-Entwickler" erstellt wurde. Fortgeschrittenenkurs .
“
Ich habe kürzlich die Android-Codebasis auf
Kure auf AndroidX migriert. Es schien mir, dass dies eine großartige Gelegenheit ist, an der Geschwindigkeit der Montage des Projekts zu arbeiten. Gradle hatte aufgrund der Langsamkeit und des Ressourcenverbrauchs immer einen schlechten Ruf, aber ich war sehr überrascht, dass geringfügige Änderungen an der Baugruppenkonfiguration die Geschwindigkeit erheblich steigern konnten.
Sehen Sie sich die Assembly-Scan-Metriken vor / nach der Optimierung an
vor der Optimierung
nach der Optimierung ️️Von 5,5 Minuten auf
17 Sekunden verringert
? Verrückt werden!Es ist nicht so schwierig, es mit einer Optimierung zu übertreiben, um die Montagezeit weiter zu verkürzen. Um den Beitrag für Anfänger verständlich zu machen, werde ich mich bewusst auf die geringfügigen, schmerzlosen Maßnahmen konzentrieren, die ich ergriffen habe, um diesem Indikator näher zu kommen.
Vor allem!
Bevor Sie mit der Optimierung beginnen, ist es wichtig, unser Projekt zu testen, um herauszufinden, wie lange es dauert, es zu erstellen. Gradle verfügt über eine praktische Scanoption, mit der Sie die Leistung Ihrer Aufgabe analysieren können. Starten Sie das Terminal in Android Studio und führen Sie den folgenden Befehl aus:
./gradlew assembleDebug --scan
Nach erfolgreichem Abschluss der Montage werden Sie aufgefordert, die Nutzungsbedingungen zum Herunterladen der Scanergebnisse zu akzeptieren. Geben Sie
yes ein, um fortzufahren. Nach Abschluss der Veröffentlichung erhalten Sie einen Link zum Terminal, um den Scan zu überprüfen. Öffne es.
Es gibt einige Optionen auf der Website, aber der Kürze halber werden wir nur das berücksichtigen, was am wichtigsten ist.Zusammenfassung zeigt zusammenfassende Informationen zu abgeschlossenen Aufgaben und deren Abschlusszeit an. Was uns hier aber interessiert, ist der Bereich
Performance . Es wird eine detailliertere Aufschlüsselung der gesamten Erstellungszeit vorgenommen, wie unten gezeigt.

Im Abschnitt Leistung gibt es eine Registerkarte
Einstellungen und Vorschläge , die Empfehlungen zur Verbesserung der Erstellungsgeschwindigkeit enthält. Schauen wir sie uns an.

In diesem Abschnitt finden Sie einige einfache Korrekturen zur Verbesserung der Geschwindigkeit. Fahren wir also fort und wenden diese Korrekturen in unserem Projekt an.
Schritt 1: Upgrade-Tools
Das Android-Team verbessert und entwickelt das Build-System ständig weiter. In den meisten Fällen können Sie daher eine erhebliche Verbesserung erzielen, indem Sie einfach die neueste Version des Toolkits installieren.
Während dieses Refactorings befand sich unser Projekt in
Version 3.2.1 des Gradle-Plugins für Android Studio (
mehrere Versionen älter als die letzte Version ).
Sie können
diesem Link folgen, um die neueste Version des Gradle Plugins zu erhalten. Zum Zeitpunkt dieses Schreibens war die neueste
Version 3.4.0.Aber hier gibt es einen Haken, an den wir uns erinnern müssen:
( Hinweis: Bei Verwendung von Gradle Version 5.0 oder höher wird die Standardgröße des Gradle-Dämons von 1 GB auf 512 MB reduziert. Dies kann zu einer schlechten Build-Leistung führen. Um diese Standardeinstellung zu überschreiben, geben Sie die Speichergröße für den Gradle-Dämon in gradle.properties an Ihr Projekt.)https://developer.android.com/studio/releases/gradle-pluginBei Verwendung von Gradle 5.0 und höher müssen wir die Speichergröße explizit erhöhen, damit sich unsere Erstellungsgeschwindigkeit nicht verschlechtert. Wir werden gleich darauf zurückkommen.Öffnen Sie die Datei
build.gradle der obersten Ebene, die Sie im Stammverzeichnis Ihres Projekts finden, und fügen Sie
dem Abhängigkeitsabschnitt die folgende Zeile hinzu:
classpath 'com.android.tools.build:gradle:3.4.0'
Sie müssen auch die
Verteilungs-URL in der Eigenschaftendatei von Gradle Wrapper unter
gradle/wrapper/gradle-wrapper.properties
. Aktualisieren Sie die URL wie folgt.
(
Dieser Link wird auf der Android Gradle-Plugin-Seite verfügbar sein. )
distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip
Bei der Verwendung von Kotlin tritt ein Fehler auf, wenn die Version des Kotlin Gradle-Plugins kleiner als
1.3.0 ist. Verwenden Sie in diesem
Fall den IDE-Tooltip, um das Gradle-Plugin für Kotlin auf die neueste Version zu aktualisieren (zum Zeitpunkt dieses Schreibens ist dies
Version 1.3.31 ).
Ok, lassen Sie uns den Build erneut vom Terminal aus ausführen, um zu sehen, ob wir Verbesserungen vorgenommen haben.

Schritt 2: Konfigurationen aktualisieren
Wir konnten also ungefähr 2,5 Minuten von der Bauzeit einsparen, aber das ist immer noch nicht gut genug. Nachdem ich die Build-Protokolle im Terminal studiert hatte, stieß ich auf eine Zeile, die uns interessieren wird:
(> Aufgabe: App: compileDevelopDebugJavawithJavac
Gradle kann die inkrementelle Kompilierung deaktivieren, da die folgenden Anmerkungsprozessoren nicht inkrementell sind: butterknife-compiler-10.1.0.jar (com.jakewharton: butterknife-compiler: 10.1.0), dagger-compiler-2.9.jar (com.google). Dolch: Dolch-Compiler: 2.9).
Setzen Sie das experimentelle Flag android.enableSeparateAnnotationProcessing-true in der Datei gradle.properties, um die Annotationsverarbeitung in einer separaten Aufgabe zu starten und eine inkrementelle Kompilierung durchzuführen.)Die inkrementelle Kompilierung verhindert grundsätzlich die verschwenderische Kompilierung des gesamten Satzes von Quelldateien und kompiliert stattdessen nur die Dateien, die geändert wurden. Aus den Protokollen geht hervor, dass wir diese Funktion nicht verwenden. Er schlägt vor, dass wir
android.enableSeparateAnnotationProcessing=true
, aber auf keinen Fall sollten wir die Konfiguration
"annotationProcessor" verwenden, da Kotlin in unserem Projekt verwendet wird.
Glücklicherweise bietet
Version 1.3.30 von Kotlin Unterstützung für die schrittweise Verarbeitung von Anmerkungen.
https://kotlinlang.org/docs/reference/kapt.html(Inkrementelle Verarbeitung von Anmerkungen (ab 1.3.30)
Ab Version 1.3.30 unterstützt
kapt
die inkrementelle Annotationsverarbeitung als experimentelle Funktion. Derzeit kann die Annotationsverarbeitung nur inkrementell ausgeführt werden, wenn alle verwendeten Annotationsprozessoren inkrementell sind.
gradle.properties
Sie diese Zeile zur Datei
gradle.properties
hinzu, um die Verarbeitung inkrementeller Anmerkungen zu
gradle.properties
:
kapt.incremental.apt=true
Beachten Sie, dass für die inkrementelle Annotationsverarbeitung auch die
inkrementelle Kompilierung aktiviert sein muss.)
Fangen wir also an:
- 1. Ändern Sie die annotationProcessor- Konfiguration in kapt
- 2. Aktivieren Sie das Flag für die experimentelle Verarbeitung inkrementeller Anmerkungen
Öffnen Sie die Datei
build.gradle
Ihres Moduls und fügen Sie die folgende Zeile oben in die Datei ein:
apply plugin: 'kotlin-kapt'
Ändern Sie dann alle annotationProcessor-Konfigurationen im Abschnitt "Abhängigkeiten", um kapt zu verwenden. Zum Beispiel:
//
annotationProcessor 'com.google.dagger:dagger-compiler:2.9'
//
kapt 'com.google.dagger:dagger-compiler:2.9'
Öffnen Sie nun die Datei
gradle.properties im Stammverzeichnis Ihres Projekts und fügen Sie die folgende Zeile hinzu:
kapt.incremental.apt=true
Lassen Sie uns den Build erneut ausführen.

Nun, es sieht so aus, als hätten wir einige Fortschritte gemacht.
Schritt 3: Gradle-Eigenschaften
Wir sind in der letzten Phase. Erinnern Sie sich an den Trick, auf den wir beim Aktualisieren der Version des Gradle-Plugins gestoßen sind? Es stellt sich heraus, dass neuere Versionen von Gradle die Größe des verwendeten Speichers auf 512 MB reduzieren. Dies soll sicherstellen, dass schwache Maschinen nicht zu viel Speicher belegen. Ich habe einen Computer mit 16 Gigabyte RAM, daher kann ich es mir leisten, dem Gradle-Daemon etwa 2-3 Gigs zuzuführen, aber Ihre Anzahl kann variieren.
Öffnen Sie die Datei
gradle.properties im Stammverzeichnis Ihres Projekts und fügen Sie die folgende Zeile hinzu. Stellen Sie sicher, dass Sie die Größe auswählen, die Ihren Anforderungen und Computerspezifikationen entspricht.
org.gradle.jvmargs=-Xmx3072m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
Lassen Sie uns dabei auch parallele Assemblys und On-Demand-Optimierungen in den Eigenschaften aktivieren.
So
gradle.properties
meine endgültige Version der Datei
gradle.properties
:
org.gradle.jvmargs=-Xmx3072m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 org.gradle.parallel=true org.gradle.configureondemand=true kapt.incremental.apt=true
org.gradle.parallel
- Mit diesem Flag kann Gradle Module innerhalb eines Projekts parallel und nicht nacheinander zusammenstellen. Dies ist nur für Projekte mit mehreren Modulen nützlich.org.gradle.configureondemand
- Dieses Flag konfiguriert nur die Module, die für das Projekt erforderlich sind, und sammelt nicht alle.
Nachdem wir dies getan haben, wollen wir sehen, was wir jetzt die Montagegeschwindigkeitsanzeigen haben:


So!
Schlussbemerkungen
Dies ist keineswegs eine umfassende Abdeckung aller Möglichkeiten zur Optimierung der Montagegeschwindigkeit. Es gibt viele andere Dinge, die ich in diesem Beitrag nicht behandelt habe, wie die Verwendung von minSdk 21 bei Verwendung von MultiDex, das Vorindizieren von Bibliotheken, das Deaktivieren der PNG-Komprimierung usw. sind nur einige davon.
Die meisten dieser Konfigurationen erfordern jedoch ein tieferes Verständnis des Android-Build-Systems und Erfahrung in der Arbeit mit großen Projekten mit mehreren Modulen (bei denen die Vorteile am offensichtlichsten sind). Die oben genannten Schritte können selbst von den Nachwuchsentwicklern problemlos implementiert werden und haben erhebliche Vorteile. Ich hoffe, dies hilft Ihnen dabei, die Build-Geschwindigkeit zu erhöhen!
Bis zum nächsten Mal, Friede sei mit dir!