Multi-Flavour-App basierend auf der Multi-Flavour-Bibliothek in Android Gradle
Lesezeit: 7 Minuten
Ali
Meine App hat mehrere Varianten für In-App-Abrechnungssysteme für mehrere Märkte.
Ich habe eine einzige Bibliothek, die den Basiscode für alle meine Projekte teilt. Also beschloss ich, diese Zahlungssysteme als Produktvarianten zu dieser Bibliothek hinzuzufügen.
Die Frage ist, kann die Android-Bibliothek Produktaromen haben?
Wenn ja, wie kann ich verschiedene Geschmacksrichtungen in die jeweilige Geschmacksrichtung der App einbeziehen?
Ich habe die Konfiguration auf verschiedene Dinge geändert, aber es hat nicht funktioniert!
Ich verwende Android Studio 0.8.2.
Nach vielen Suchen habe ich keine Möglichkeit gefunden, dies zu erreichen, selbst wenn ich das Android-Plugin auf das neueste aktualisiere 3.4.2 Version und Gradle auf den neuesten Stand 5.5.1, es ist immer noch mit der Kompilierzeit fehlgeschlagen, oder Ressourcenverknüpfung fehlgeschlagen in aapt, oder kann das Symbol nicht finden das im Bibliotheksmodul
– VinceStyling
12. Juli 19 um 3:50 Uhr
Ali
Endlich habe ich herausgefunden, wie das geht, ich werde es hier für andere erklären, die das gleiche Problem haben:
Der Schlüsselteil besteht darin, publishNonDefault in der Bibliothek build.gradle auf true zu setzen. Dann müssen Sie Abhängigkeiten definieren, wie im Benutzerhandbuch vorgeschlagen.
Jetzt können Sie das App-Flavor und das Build-Varianten-Bedienfeld auswählen, und die Bibliothek wird entsprechend ausgewählt, und alle Build- und Ausführungsvorgänge werden basierend auf dem ausgewählten Flavor durchgeführt.
Wenn Sie mehrere App-Module haben, die auf der Bibliothek basieren, beschwert sich Android Studio über Konflikte bei der Variantenauswahl. Es ist in Ordnung, ignorieren Sie es einfach.
Danke fürs Teilen, jetzt kann ich meine defaultPublishConfig-Problemumgehung loswerden.
– Delblanco
31. Juli 14 um 14:01 Uhr
Wenn Sie AS 1.1.0 ausführen, scheint die obige Lösung immer noch zu funktionieren, aber 1) die Auswahl von Debug-/Release-Builds geht verloren, und ich scheine weiterhin Probleme mit AIDL zu haben, die in der Bibliothek gefunden werden, die sehr oft den entsprechenden Code nicht erzeugt. Irgendwelche Gedanken dazu?
– 3c71
02.03.15 um 21:20 Uhr
@IgorGanapolsky buildTypes hat damit nichts zu tun. Jeder Flavor hat alle Build-Typen (normalerweise Debug und Release) und alle arbeiten mit diesem Ansatz.
– Ali
3. April 15 um 20:32 Uhr
@An-droid definiert die Bibliothek, die für den Markt1-Flavor verwendet werden soll!
– Ali
5. April 16 um 15:53 Uhr
Warum ist der Build-Typ “Release” eingestellt? Wird der Build-Typ „Release“ während Debug-Builds ausgewählt?
– Windreiter
26. September 16 um 10:20 Uhr
AppiDevo
Es gibt ein Problem mit der Ali-Antwort. Wir verlieren eine sehr wichtige Dimension in unseren Build-Varianten. Wenn wir alle Optionen haben wollen (in meinem Beispiel unten 4 (2 x 2)), müssen wir nur hinzufügen benutzerdefinierte Konfigurationen in Hauptmodul build.gradle Datei, um alle Multi-Flavor Multi-BuildType in verwenden zu können Build Variants. Wir müssen auch einstellen publishNonDefault wahr in dem Bibliotheksmodul build.gradle Datei.
Mit der variantenbewussten Abhängigkeitsauflösung müssen Sie keine variantenspezifischen Konfigurationen wie freeDebugImplementation mehr für lokale Modulabhängigkeiten verwenden – das Plugin erledigt das für Sie
Stattdessen sollten Sie Ihre Abhängigkeiten wie folgt konfigurieren:
dependencies {
// This is the old method and no longer works for local
// library modules:
// debugImplementation project(path: ':library', configuration: 'debug')
// releaseImplementation project(path: ':library', configuration: 'release')
// Instead, simply use the following to take advantage of
// variant-aware dependency resolution. You can learn more about
// the 'implementation' configuration in the section about
// new dependency configurations.
implementation project(':library')
// You can, however, keep using variant-specific configurations when
// targeting external dependencies. The following line adds 'app-magic'
// as a dependency to only the "debug" version of your module.
debugImplementation 'com.example.android:app-magic:12.3'
}
Und das Plugin kümmert sich automatisch um variantenspezifische Konfigurationen. Ich hoffe, es hilft anderen, das Android Studio Plugin auf 3.0.0 und höher zu aktualisieren.
JiajiaGu
Mein Android-Plugin ist 3.4.0, und ich finde, dass es jetzt keine Konfigurationen benötigt. Alles, was Sie brauchen, ist sicherzustellen, dass die FlavorDimensions und ProductFlavors in der Anwendung ein ProductFlavor mit den gleichen FlavorDimensions und ProductFlavors in Bibliotheken enthalten.Zum Beispiel:
Nach der Synchronisierung können Sie alle Optionen im Fenster „Build Variants“ umschalten:
Damit die Varianten in einer AAR-Bibliothek funktionieren, müssen Sie defaultPublishConfig in der Datei build.gradle Ihres Android-Bibliotheksmoduls definieren.
Standardmäßig veröffentlicht eine Bibliothek nur ihre Release-Variante. Diese Variante wird von allen Projekten verwendet, die auf die Bibliothek verweisen, egal welche Variante sie selbst bauen. Dies ist eine vorübergehende Einschränkung aufgrund von Gradle-Einschränkungen, an deren Entfernung wir arbeiten. Sie können steuern, welche Variante veröffentlicht wird:
android { defaultPublishConfig “debug” }
Beachten Sie, dass dieser Veröffentlichungskonfigurationsname auf den vollständigen Variantennamen verweist. Release und Debug sind nur anwendbar, wenn keine Flavors vorhanden sind. Wenn Sie die veröffentlichte Standardvariante ändern möchten, während Sie Flavors verwenden, würden Sie schreiben:
Android { defaultPublishConfig “flavor1Debug” }
Sergio
Ich bin auch auf ein Problem beim Kompilieren von Modulen für verschiedene Optionen gestoßen.
Was ich gefunden habe:
Es sieht so aus, als müssten wir nicht hinzufügen publishNonDefault true in libs build.gradle Datei, da Klasse 3.0.1.
Nach dem Dekompilieren einer Klasse BaseExtension Ich habe es gefunden:
public void setPublishNonDefault(boolean publishNonDefault) {
this.logger.warn("publishNonDefault is deprecated and has no effect anymore. All variants are now published.");
}
Außerdem können Sie verwenden Varianten filtern Build-Varianten einzuschränken.
Ps vergessen Sie nicht, Module in die einzufügen settings.gradle Datei, wie:
include ':app'
include ':lib'
project(':lib').projectDir = new File('app/libs/lib')
Im Moment ist es nicht möglich, obwohl, wenn ich mich richtig erinnere, es eine Funktion ist, die sie hinzufügen möchten. (Änderung 2: Verknüpfung, link2 )
Edit: Im Moment verwende ich die defaultPublishConfig Option zum Deklarieren, welche Bibliotheksvariante veröffentlicht wird:
Nach vielen Suchen habe ich keine Möglichkeit gefunden, dies zu erreichen, selbst wenn ich das Android-Plugin auf das neueste aktualisiere
3.4.2
Version und Gradle auf den neuesten Stand5.5.1
, es ist immer noch mit der Kompilierzeit fehlgeschlagen, oder Ressourcenverknüpfung fehlgeschlagen in aapt, oder kann das Symbol nicht finden das im Bibliotheksmodul– VinceStyling
12. Juli 19 um 3:50 Uhr