Modularisierung von Android-Apps

Ein Projekt mit mehreren Gradle-Modulen wird als Projekt mit mehreren Modulen bezeichnet. Dieser Leitfaden enthält Best Practices und empfohlene Muster für die Entwicklung von Android-Apps mit mehreren Modulen.

Das wachsende Problem der Codebasis

Bei einer ständig wachsenden Codebasis nehmen Skalierbarkeit, Lesbarkeit und allgemeine Codequalität im Laufe der Zeit häufig ab. Dies liegt daran, dass die Codebasis größer wird, ohne dass ihre Verwalter aktive Maßnahmen ergreifen, um eine Struktur zu erzwingen, die leicht zu warten ist. Modularisierung ist ein Mittel, um Ihre Codebasis so zu strukturieren, dass die Verwaltbarkeit verbessert und diese Probleme vermieden werden können.

Was ist Modularisierung?

Modularisierung ist ein Verfahren, bei dem eine Codebasis in locker gekoppelten und eigenständigen Teilen organisiert wird. Jeder Teil ist ein Modul. Jedes Modul ist unabhängig und dient einem klaren Zweck. Indem Sie ein Problem in kleinere und leichter zu lösende Teilprobleme unterteilen, reduzieren Sie die Komplexität beim Entwerfen und Verwalten eines großen Systems.

Abbildung 1: Abhängigkeitsdiagramm einer Beispiel-Codebasis mit mehreren Modulen

Vorteile der Modularisierung

Es gibt viele Vorteile der Modularisierung, die jedoch alle auf die Verbesserung der Verwaltbarkeit und Gesamtqualität einer Codebasis abzielen. In der folgenden Tabelle sind die wichtigsten Vorteile zusammengefasst.

Vorteil Zusammenfassung
Wiederverwendbarkeit Die Modularisierung ermöglicht es, Code freizugeben und mehrere Apps auf derselben Grundlage zu erstellen. Module sind quasi die Bausteine. Apps sollten eine Summe ihrer Funktionen darstellen, bei denen die Funktionen als separate Module angeordnet sind. Die Funktionen eines bestimmten Moduls sind möglicherweise in einer bestimmten App aktiviert oder nicht. Beispielsweise kann ein :feature:news Teil der Vollversion von Flavor- und Wear-Apps sein, aber nicht Teil der Demoversion.
Strikte Sichtbarkeitssteuerung Mit Modulen können Sie einfach steuern, was Sie für andere Teile Ihrer Codebasis freigeben. Sie können alles außer Ihrer öffentlichen Schnittstelle als internal oder private markieren, um zu verhindern, dass es außerhalb des Moduls verwendet wird.
Anpassbare Auslieferung Play Feature Delivery nutzt die erweiterten Funktionen von App Bundles, damit Sie bestimmte Funktionen Ihrer App bedingt oder on demand zur Verfügung stellen können.

Die oben genannten Vorteile sind nur mit einer modularisierten Codebasis erreichbar. Die folgenden Vorteile können mit anderen Verfahren erzielt werden, aber durch die Modularisierung können Sie sie noch stärker erzwingen.

Vorteil Zusammenfassung
Skalierbarkeit In einer eng gekoppelten Codebasis kann eine einzelne Änderung eine Kaskade von Änderungen in scheinbar nicht zusammenhängenden Teilen des Codes auslösen. Ein ordnungsgemäß modularisiertes Projekt unterstützt das Prinzip der Trennung der Anliegen und schränkt damit die Kopplung ein. So haben die Mitwirkenden mehr Autonomie.
Eigentumsrechte Module können nicht nur zur Autonomie, sondern auch zur Durchsetzung von Verantwortlichkeit verwendet werden. Ein Modul kann einen eigenen Inhaber haben, der für die Wartung des Codes, das Beheben von Fehlern, das Hinzufügen von Tests und das Überprüfen von Änderungen verantwortlich ist.
Datenkapselung Kapselung bedeutet, dass jeder Teil Ihres Codes über den größtmöglichen Wissensstand in Bezug auf andere Teile verfügen sollte. Isolierter Code ist leichter zu lesen und zu verstehen.
Testbarkeit Die Testbarkeit beschreibt, wie einfach es ist, Ihren Code zu testen. Bei einem testbaren Code können Komponenten leicht isoliert getestet werden.
Build-Zeit Bei einigen Gradle-Funktionen wie inkrementellem Build, Build-Cache oder parallelem Build kann Modularität zur Verbesserung der Build-Leistung genutzt werden.

Häufige Fallstricke

Der Detaillierungsgrad Ihrer Codebasis gibt an, in welchem Umfang sie aus Modulen besteht. Eine detailliertere Codebasis umfasst mehr, kleinere Module. Beim Entwerfen einer modularen Codebasis sollten Sie einen gewissen Detaillierungsgrad wählen. Berücksichtigen Sie dabei die Größe Ihrer Codebasis und deren relative Komplexität. Eine zu eng gefasste Maßnahme macht den Aufwand zu einer Belastung, und ein zu grobes Maß würde die Vorteile der Modularisierung mindern.

Hier einige häufige Probleme:

  • Zu detailliert: Jedes Modul bringt einen gewissen Aufwand in Form von erhöhter Build-Komplexität und Boilerplate-Code mit sich. Eine komplexe Build-Konfiguration erschwert die einheitliche Konfigurationen über mehrere Module hinweg. Zu viel Boilerplate-Code führt zu einer umständlichen Codebasis, die schwer zu verwalten ist. Wenn der Aufwand Auswirkungen auf Verbesserungen der Skalierbarkeit hat, sollten Sie erwägen, einige Module zu konsolidieren.
  • Zu grob: Wenn Ihre Module zu groß werden, könnten Sie jedoch am Ende eine weitere Monolitherstellung haben und die Vorteile der Modularität verpassen. Bei einem kleinen Projekt können Sie beispielsweise die Datenschicht in ein einzelnes Modul einfügen. Mit zunehmender Größe kann es jedoch erforderlich sein, Repositories und Datenquellen in eigenständige Module zu trennen.
  • Zu komplex: Es ist nicht immer sinnvoll, ein Projekt zu modularisieren. Ein entscheidender Faktor ist die Größe der Codebasis. Wenn Sie nicht erwarten, dass Ihr Projekt einen bestimmten Grenzwert überschreitet, gelten die Skalierbarkeit und die Build-Zeit nicht.

Ist Modularisierung die richtige Technik für mich?

Wenn Sie die Vorteile der Wiederverwendbarkeit, eine strikte Sichtbarkeitskontrolle oder die Verwendung von Play Feature Delivery benötigen, ist Modularisierung eine Notwendigkeit für Sie. Wenn Sie dies nicht tun, aber trotzdem von verbesserter Skalierbarkeit, Inhaberschaft, Kapselung oder Build-Zeiten profitieren möchten, ist die Modularisierung etwas wert.

Produktproben