Moja aplikacja ma kilka wersji dla kilku rynków z systemami rozliczeń w aplikacji.
Mam jedną bibliotekę, która udostępnia kod podstawowy dla wszystkich moich projektów. Postanowiłem więc dodać te systemy płatności do tej biblioteki jako smaki produktów.
Pytanie brzmi, czy biblioteka Androida może mieć smaki produktów?
Jeśli tak, w jaki sposób mogę uwzględnić różne smaki w poszczególnych smakach aplikacji?
Szukałem dużo i nie mogłem znaleźć nic na temat tego scenariusza. Jedyną bliską rzeczą, jaką znalazłem, było to w http://tools.android.com/tech-docs/new-build-system/user-guide :
dependencies {
flavor1Compile project(path: ':lib1', configuration: 'flavor1Release')
flavor2Compile project(path: ':lib1', configuration: 'flavor2Release')
}
Zmieniłem konfigurację na inne rzeczy, ale to nie zadziałało!
Używam Android Studio 0.8.2.
3.4.2
wersji i gradle do najnowszej5.5.1
, nadal nie udało się z czasem kompilacji, lub połączenie zasobów nie powiodło się w aapt, lub nie mogę znaleźć symbolu, który wewnątrz biblioteki modułOdpowiedzi:
W końcu dowiedziałem się, jak to zrobić, wyjaśnię to tutaj innym, którzy mają ten sam problem:
Kluczową częścią jest ustawienie parametru PublishingNonDefault na wartość true w bibliotece build.gradle. Następnie należy zdefiniować zależności zgodnie z zaleceniami podręcznika użytkownika.
Cały projekt wyglądałby tak:
Biblioteka build.gradle:
projekt build.gradle:
Teraz możesz wybrać smak aplikacji i panel Warianty kompilacji, a biblioteka zostanie odpowiednio wybrana, a cała kompilacja i uruchomienie zostaną wykonane w oparciu o wybrany smak.
Jeśli masz wiele modułów aplikacji opartych na bibliotece, Android Studio będzie narzekać na konflikt wyboru wariantu, jest ok, po prostu zignoruj.
źródło
Jest jeden problem z odpowiedzią Ali . W naszych wariantach budowy tracimy jeden bardzo ważny wymiar. Jeśli chcemy mieć wszystkie opcje (w moim przykładzie poniżej 4 (2 x 2)), musimy po prostu dodać niestandardowe konfiguracje w głównym pliku build.gradle modułu , aby móc używać wszystkich typów multi-smaków multi-buildType w
Build Variants
. Musimy również ustawić parametr PublishingNonDefault na true w pliku build.gradle modułu biblioteki .Przykładowe rozwiązanie:
Lib build.gradle
Aplikacja build.gradle
źródło
Error:java.lang.RuntimeException: Error: more than one library with package name
, wystąpiłoAktualizacja dla wtyczki Android 3.0.0 i nowszych
Zgodnie z oficjalną dokumentacją systemu Android - Migracja konfiguracji zależności dla modułów lokalnych ,
Więc w odpowiedzi Ali, zmień się
do
Wtyczka automatycznie zajmie się konfiguracjami specyficznymi dla wariantu. Mam nadzieję, że pomoże to innym w uaktualnieniu wtyczki Android Studio do wersji 3.0.0 i nowszej.
źródło
Moja wtyczka do Androida to 3.4.0 i uważam, że nie wymaga teraz konfiguracji.Wystarczy upewnić się, że plik flavourDimensions i productFlavors w aplikacji zawiera jeden produktFlavor o tym samym smakuDimensions and productFlavors w bibliotekach. Przykład:
W kompilacji mylibrary
build.gradle aplikacji:
Po synchronizacji możesz przełączyć wszystkie opcje w oknie wariantów budowania:
źródło
Aby uzyskać smaki działające w bibliotece AAR, musisz zdefiniować defaultPublishConfig w pliku build.gradle modułu Android Library.
Aby uzyskać więcej informacji, zobacz: Publikacja biblioteczna .
źródło
W tej chwili nie jest to możliwe, chociaż jeśli dobrze pamiętam, to jest funkcja, którą chcą dodać. (Edycja 2: link , link2 )
Edycja: Na razie używam
defaultPublishConfig
opcji, aby zadeklarować, który wariant biblioteki zostanie opublikowany:źródło
Wiem, że ten temat został zamknięty, ale tylko aktualizacja z gradle 3.0, zobacz to: https://developer.android.com/studio/build/gradle-plugin-3-0-0-migration.html#variant_aware i grep
matchingFallbacks
imissingDimensionStrategy
. Teraz o wiele łatwiej jest zadeklarować zależności między różnymi rodzajami modułów.... iw tym konkretnym przypadku z gradle3.0, ponieważ smaki mają tę samą nazwę, gradle mapowałoby je magicznie, nie jest wymagana żadna konfiguracja.
źródło
Napotkałem również problem z kompilacją modułów dla różnych opcji.
Co znalazłem:
Wygląda na to, że nie musimy dodawać
publishNonDefault true
dobuild.gradle
pliku lib , ponieważ Gradle 3.0.1 .Po dekompilacji klasy
BaseExtension
znalazłem to:I zamiast:
Powinniśmy użyć:
Jedyną ważną rzeczą jest dodanie
configurations {...}
części do plikubuild.gradle
.Tak więc ostateczny wariant
build.gradle
pliku aplikacji to:Możesz także użyć wariantów filtru, aby ograniczyć warianty kompilacji.
Ps nie zapomnij dołączyć modułów do
settings.gradle
pliku, takich jak:źródło