Beschleunigen Sie Ihren Build: Nicht-transitive R-Dateien

Nicht-transitive R-Dateien werden in allen AGP 4.2-Modulen verfügbar. Nicht-transitive R-Dateien ermöglichen schnellere Builds und verkleinern Ihr AAB/APK. In diesem Beitrag wird erläutert, wie Sie Ihre App mit nicht-transitiven R-Dateien implementieren und erstellen.

Nicht transitiv was?

In Mathematik, Nichttransitivität eine Eigenschaft binärer Beziehungen, die keine transitiven Beziehungen sind. Dies kann jede Beziehung umfassen, die nicht transitiv ist, oder die stärkere Antitransitivitätseigenschaft, die eine Beziehung beschreibt, die überhaupt nicht transitiv ist.

https://en.wikipedia.org/wiki/Intransitivität

Hilft dieses Mathe-Zitat uns allen? Scheinbar nicht. Versuchen wir Folgendes: Wenn EIN es hängt davon ab B und B es hängt davon ab C, EIN nicht wissen C. In der Android-Welt nicht transitive R-Dateien:

Nicht-transitive R-Klassen ermöglichen das Namespacen jeder Bibliothek in der R-Klasse, sodass ihre R-Klasse nur die von der Bibliothek selbst deklarierten Ressourcen und nichts aus Bibliotheksabhängigkeiten enthält, wodurch die Größe reduziert wird.

In diesem Blogbeitrag geht es nicht darum, wie die R-Datei funktioniert und welche Geschichte damit verbunden ist. Wenn Sie sich für den Hintergrund interessieren, würde ich empfehlen diesen Blogbeitrag hier.

Nicht transitive Module

Wenn Modul EIN es hängt davon ab B und B es hängt davon ab C. Wie können wir über Ressourcen sprechen? Schauen wir uns an:

Modul EIN kann (wie gewohnt) auf eigene Ressourcen verweisen:

R.string.hello_world

Modul EIN Modul referenzieren kann B Ressourcen (vollständig qualifiziertes Paket):

com.my.moduleB.R.string.hello_neighbour

Modul EIN kann nicht auf Modul verweisen CRessourcen.


Sie können nicht-transitive R-Klassen mit dem Android Gradle-Plugin (> 4.2) verwenden, um schnellere Builds für Anwendungen mit mehreren Modulen zu ermöglichen. … Dies führt zu neueren Konstrukten und den entsprechenden Vorteilen der Vermeidung von Kompilierungen.

https://developer.android.com/studio/releases#refactor-nontransitive-rclasses

Vorteile von nicht-transitiven R-Klassen?

  • Reduzieren Sie die Größe von AAB/APK, inkl Anzahl der DEX-Feldreferenzen
  • Verringerte inkrementelle Build-Geschwindigkeit, da bei Änderungen weniger Abhängigkeiten aufgenommen werden können
  • Mit zunehmender Modularität werden Abhängigkeiten offensichtlicher
  • Um die Komplexität zu reduzieren, stammen Ressourcen nicht aus transitiven Abhängigkeiten
  • Reduzieren Sie die Gesamtbauzeit, da nur wenig Code enthalten ist

Lass es uns tun!

Sie können diese Einstellung selbst ändern, indem Sie Ihre bearbeiten /gradle.properties Datei, die Folgendes enthält:

android.nonTransitiveRClass=true

Sie haben vielleicht darüber gelesen android.namespacedRClass in der Vergangenheit. Beachten Sie, dass im August 2020; android.namespacedRClass Eigenschaft umbenannt in android.nonTransitiveRClass. Wie hier gezeigt.

oder

Sie können das automatisierte Refactoring in Android Studio verwenden, es aktiviert die obige Einstellung und durchsucht Ihre Module, um zu versuchen, jede gefundene R-Referenz vollständig zu qualifizieren.

Beachten Sie, dass dieser Refactor zu Android Studio Arctic Fox | hinzugefügt wurde 2020.3.1 „automatisches Refactoring für nicht-transitive R-Dateien“. Wie hier gezeigt.

Android Studio> Umgestalten> Zu nicht-transitiven R-Klassen migrieren…

Dieses Auto-Refactoring ist keine Wunderwaffe, es kann falsche Ressourcenreferenzen haben, dh es fügt den falschen Paketnamen vor der R-Klasse hinzu, oder es kann einen nicht auswählen, oder es kann einen hinzufügen, von dem Ihr Modul keine Abhängigkeit hat. Meiner Erfahrung nach werden diese Probleme zur Build-Zeit aufgegriffen, und Sie können aus den drei folgenden Lösungsschritten wählen, um das zu beenden, was das Refactoring-Tool gestartet hat:

Wenn Sie fertig sind, müssen Sie Ihr Projekt erstellen und die Fehler beheben. Fehler können in verschiedenen Formaten auftreten:

  1. Sie verwenden eine Ressource aus einem anderen Modul.
    heilen: Fügen Sie das vollständig qualifizierte Paket hinzu oder importieren Sie die R-Datei oder verwenden Sie (nur Kotlin) einen Alias.

    // Fully qualifed package
    val foo = com.my.moduleB.R.string.hello_neighbour
    // Import then use string.hello_neighbour
    import com.my.moduleB.R
    // Alias then use RB.string.hello_neighbour
    import com.my.moduleB.R as RB

  2. Sie verwenden eine Ressource aus einem anderen Modul, aber Sie vertrauen diesem Modul nicht.
    heilen: Machen Sie es wie Nr. 1, aber fügen Sie auch ein gewisses Selbstvertrauen hinzu.

    implementation project(":libraries:moduleB")

  3. Sie verwenden eine Ressource aus einem anderen Modul, haben aber keine Abhängigkeit von diesem Modul deklariert und möchten auch keine Abhängigkeit deklarieren.
    heilen: Die Lösung hier ist überall einen Bezug machen und verwenden Sie denselben Namen oder kopieren / erstellen Sie eine neue Ressource, was Sie möchten.
Verweisen Sie auf Ihr Modul, wenn sich die Implementierung in einem anderen “transitiven” Modul befindet.

Fazit

Das ist alles, was ich leicht sagen kann, aber in der Praxis haben Sie je nach Größe Ihres Projekts möglicherweise viele Stunden vor sich, um zu debuggen/herauszufinden, woher Ihre Projekte kommen, Ressourcen und was richtig ist. Name des zu verwendenden Pakets. Ich empfehle es sehr für alle neuen Projekte, an denen Sie arbeiten nonTransitiveRClass bevor Sie sich mit dem Fall der Linie befassen müssen.

Leave a Reply

Your email address will not be published. Required fields are marked *