Die Größe ist wichtig! Teil 2 / Sudo Null IT-News

Im vorherigen Artikel haben wir besprochen, wie Sie die Regression der Größe einer Android-Anwendung auf CI im Entwicklungszweig überprüfen können. Und wir haben gelernt, was die Nachteile dieses Ansatzes sein könnten.

Lassen Sie uns nun herausfinden, wie diese Mängel behoben werden können. Wir werden die Regression der App-Größe in der Pull-Anfrage erkennen, nicht im Entwicklungszweig. Denn Probleme zu vermeiden ist besser als sie zu lösen.

Pull-Regressionserkennung (Option 1)

Da der Entwicklungszweig die einzige Quelle der Wahrheit ist (die Größe der Anwendung), werden wir die in der Pull-Anforderung erstellte apk und die im Entwicklungszweig erstellte apk vergleichen.

Aus dem Entwicklungszweig müssen wir apk sammeln und Metriken für jeden Commit in der Entwicklung sammeln, damit wir jederzeit in einem Pull-Request Informationen aus dem Entwicklungszweig erhalten und zum Vergleich verwenden können.

Entwicklungsfluss

1. Wir sammeln das App Bundle anstelle der universellen apk. Wenn wir vorher die universelle (Legacy-)APK über den Gradle-Befehl ./gradlew AssembleRelease gesammelt haben, werden wir das App-Bundle zusammenstellen:

./gradlew BundleRelease

Sie können alle Funktionen des App Bundles in sehen Offizielle Google-Dokumentation. Kurz gesagt, das App-Bundle ermöglicht es Ihnen, apk abhängig von den Konfigurationen (Prozessorarchitektur, Sprache, Bildschirmgröße) eines bestimmten Geräts zu erstellen, wodurch die Größe der resultierenden apk erheblich reduziert werden kann. Das heißt, wenn Sie die Anwendung auf einem Smartphone installieren, benötigen Sie kaum Ressourcen, die für ein Tablet bestimmt sind. Normalerweise wird eine solche APK in Google Play erstellt, Sie müssen nur Ihr App-Bundle hochladen und Google Play erstellt die APK selbst, abhängig vom angeforderten Gerät. Und da wir den Unterschied in der Größe der gelieferten apk so realitätsnah wie möglich brauchen, müssen wir die gleiche Funktionalität implementieren, die Google Play für uns erledigt. Und das wird uns helfen Bundle-Tool von Google.

2. Wir sammeln APK mit Bundletool:

java -jar bundletool.jar build-apks –bundle=bundle-release.aab –output=release.apks –device-spec=device-spec.json –mode=system

Laden Sie die Bundletool-Binärdatei herunter und rufen Sie den Befehl build-apks auf, stellen Sie die Parameter ein und gehen Sie sie durch:

  • –bundle – Ihr erstelltes App-Bundle

  • –output – der Name des Archivs, in dem unsere APKs gesammelt werden (set apk)

  • –device-spec – Gerätekonfiguration, für die Sie apk erstellen werden. Muss im json-Format vorliegen.

Beispiel device-spec.json{ “supportedAbis”: [“armeabi-v7a”]”supportedLocales”: [“en”]”screenDensity”: 640, “sdkVersion”: 27 }

  • –mode – APK-Typ ausgeben (Standard, System, universell, sofort). sofortig – Instant apk (erfordert keine Installation), Universal- – die gleiche universelle apk (enthält Ressourcen für alle Geräte), Ursprünglich – master.apk set + configuration apk (Split-APK-Mechanismus, mit dem Sie APKs sammeln können, abhängig von der Gerätekonfiguration), System – für das Systemabbild (derselbe Standard, nur in einer APK eingefroren, mit Ausnahme von dynamischen Funktionsmodulen). In unserem Fall passen System und Ursprünglich.

3. Wir sammeln Metriken (die Größe der empfangenen APK, den aktuellen Commit-Hash, das Datum usw.) und laden sie in unseren Speicher hoch (es kann alles sein, wir verwenden dieselbe gcloud)

gsutil cp “$build_size_info.json” “gs://custom_folder/build_size_info.json” gsutil cp “$system.apk” “gs://custom_folder/system.apk”

Unser Entwicklungsablauf für jeden Commit sieht folgendermaßen aus:

EntwicklungsflussEntwicklungsfluss

Pull-Request-Flow

Jetzt, da wir immer Daten in der Entwicklung haben, können wir jederzeit auf die Entwicklungsdaten zugreifen und die apk erhalten, die wir zum Vergleich benötigen.

Für jeden Commit in einer Pull-Anfrage werden wir:

1. Wir sammeln das App-Bundle ./gradlew bundleRelease

2. Wir sammeln eine bestimmte apk mit derselben device-spec.json wie in der Entwicklung

3. Entwicklungs-APK herunterladen. Hier müssen Sie verstehen, dass wir apk aus dem letzten tatsächlichen Commit in der Entwicklung benötigen, mit dem eine Synchronisierung durchgeführt wurde. Das heißt, wenn Sie nicht mit der Entwicklung synchronisiert haben (Merge / Rebase), benötigen Sie das Commit, aus dem Ihr Zweig erstellt wurde, und wenn Sie synchronisiert haben, dann das Commit der letzten Zusammenführung / Rebase mit der Entwicklung. Um ein solches Commit zu erhalten, rufen wir einen einfachen Git-Befehl auf:

git merge-base „development“ „feature/task1“

Abhängig von diesem Commit laden wir das erforderliche Apk hoch, gehen zum Repository (gcloud) und fragen nach dem Apk, das gemäß diesem Commit erstellt wurde.

4. Vergleichen Sie die aktuelle PR(Pull Request)-APK und die Entwicklungs-APK. Unter Verwendung des gleichen diffuse Nützlichkeit und in Ihr Repository hochladen:

java -jar diffuse-binary.jar diff $pr-system.apk $dev-system.apk > $report.txt gsutil cp “$report.txt” “gs://custom_folder/report.txt”

5. Das Ergebnis des Vergleichs unserer apk können wir als Kommentar mit einem Link zu report.txt posten, um zu verstehen, was als Größenregression diente.

6. Abhängig vom Ergebnis des Vergleichs können Sie den PR blockieren, um die Zusammenführung in der Entwicklung zu deaktivieren. Wie genau Sie dies tun, bleibt Ihnen überlassen. Wir dachten zuerst daran, absichtlich einen Fehler auszulösen, wenn eine Regression gefunden wurde. Aber dann haben wir uns entschieden, die Github-API zu verwenden (da das Repo in Github ist).

Das heißt, wenn eine Regression festgestellt wird, fordern wir Änderungen zur Überprüfung an, die in PR-Prüfungen angezeigt werden, und bis wir sie genehmigen oder ablehnen, kann PR nicht eingefroren werden. Wenn die Regression durch den nächsten Commit behoben wurde, können wir unsere angeforderten Überprüfungsänderungen automatisch ablehnen. Und wenn trotzdem keine Größenoptimierungen vorgenommen werden können und Sie mit diesen Änderungen zusammenführen müssen, dann können Sie dies manuell ablehnen, indem Sie den Ablehnungsgrund eingeben.

Blockieren/Entsperren von Pull-AnforderungenBlockieren/Entsperren von Pull-Anforderungen

Auch hier liegt die Implementierung der PR-Sperre/-Entsperrung bei Ihnen.

Unser Pull-Request-Workflow sieht folgendermaßen aus:

7. Optimierung – all diese Schritte für jeden Commit in PR durchzuführen, ist sehr teuer, da wir nicht jedes Mal einen Größenvergleich durchführen müssen, wenn eine Codezeile geändert wurde. Daher müssen wir vor dem Start des Vergleichs eine Überprüfung auf geänderte Dateien zu git hinzufügen. Und wenn sich in dieser Dateiliste Dateien befinden, die die Größe der Anwendung erheblich beeinflussen können, führen Sie erst dann den Vergleich durch. Wir haben ein einfaches Shell-Skript geschrieben, das durch Musterabgleich nach geänderten Dateien sucht.

8. Und schließlich, wenn wir die Größe nicht vergleichen müssen, müssen wir die Kompilierung des Release-Codes überprüfen, da es oft vorkommt, dass jemand Code zusammenführt, der die Entwicklungs-Release-Assembly beschädigen kann, und das ist für uns von entscheidender Bedeutung Entwicklungsbaugruppen werden nicht beschädigt, da sie Daten zur tatsächlichen Größe speichern.

./gradlew app:compileReleaseJavaWithJavac

Ergebnis

Als Ergebnis haben wir:

  • Automatisierte Erkennung der Regression der Anwendungsgröße auf Pull-Request-Ebene

  • Vollständige Transparenz bei der Größenänderung von Apps, da wir apk für jeden Commit in der Entwicklung erstellen. Sie können ein schönes Größenänderungsdiagramm erstellen.

Mängel

  1. Das Erstellen einer APK für jeden Commit in der Entwicklung ist gut in Bezug auf die Sichtbarkeit, aber schlecht in Bezug auf die Optimalität. Dies kann abhängig von der Anzahl der in der Entwicklung befindlichen Commits sehr teuer werden.

  2. Aus dem ersten folgt, dass möglicherweise apk in der Entwicklung sind, die für den Vergleich nicht benötigt wurden. Das heißt, wenn am Anfang, in einem Schritt Überprüfen von git geänderten Dateien Wir müssen die Größe in diesem PR nicht überprüfen, dann müssen wir die Entwicklungs-APK nicht hochladen.

Unnötige APK-Build in der EntwicklungUnnötige APK-Build in der Entwicklung

Diese Mängel werden im nächsten Artikel behoben.

Similar Posts

Leave a Reply

Your email address will not be published.