Zmagałem się z tym samym problemem. Najpierw użyłem dwóch gałęzi w mojej kontroli źródła, ale to był ból głowy, utrzymujący je w synchronizacji. Gradle to bardzo elastyczny system kompilacji, ale domyślne konwencje nie zawsze są wystarczające. Oto, jak ostatecznie rozwiązałem to w mojej bazie kodu.
skończyło się zasadniczo w następującej strukturze katalogów (uproszczony):
+ src
+ main
| + res
| | + values
| | - strings.xml
| + java
| ...
+ debug
| + free
| | + res
| | + values
| | - strings.xml
| + paid
| + res
| + values
| - strings.xml
+ free
| + res
| | + values
| | - strings.xml
| + java
| ...
+ paid
+ res
| + values
| - strings.xml
+ java
...
w folderze głównym trzymam wszystko, co jest wspólne dla obu smaków. W wolnym folderze przechowuję wszystko, co jest unikalne w darmowej wersji (to samo dla płatnego). Pliki w folderze smaku zostaną nałożone na wierzch głównego.
Domyślne reguły nakładki będą obsługiwały smaki produktu "za darmo" i "płatne" za pomocą folderów pod "src" o tych samych nazwach. Problem dla mnie zaczął się od nałożenia typów kompilacji.
Jeśli utworzyłem folder debugowania o takiej samej strukturze, co foldery z przyporządkowanymi do niego elementami, zostanie on nałożony na aktualnie używany folder smaku. Doprowadziło to do tej samej nazwy debugowania dla obu smaków, ale chciałem mieć różne nazwy debugowania w zależności od smaku. Po przeprowadzeniu badań wymyśliłem następującą modyfikację mojego pliku kompilacji.
...
android {
buildTypes {
debug {
...
}
release {
...
}
}
productFlavors {
free {}
paid {}
}
}
android.applicationVariants.all { variant ->
if (variant.buildType.name == "release") {
...
}
else if (variant.buildType.name == "debug") {
switch (variant.name) {
case "FreeDebug":
variant.mergeResources.doFirst {
android.sourceSets.debug.setRoot("src/debug/free")
}
break;
case "PaidDebug":
variant.mergeResources.doFirst {
android.sourceSets.debug.setRoot("src/debug/paid")
}
break;
}
}
}
...
Teraz wariant budowy zostanie zbudowany najpierw nakładając następujące foldery:
PaidRelease -> /src/main + /src/paid
PaidDebug -> /src/main + /src/paid + /src/debug/paid
FreeRelease -> /src/main + /src/free
FreeDebug -> /src/main + /src/free + /src/debug/free
A jeśli chcesz tylko zmienić jedną ikonę i nie powielać drzewo zasobów cały? – powder366
src/main/res dotyczy wszystkich kompilacji, więc musisz tylko dodać zasoby, które różnią się między wariantami kompilacji, a wersjami kompilacji danego wariantu. – ianhanniballake
OK, dziękuję! Ale kiedy skonwertowałem projekt z Eclipse do Studio, nie otrzymałem na przykład src/main/java, po prostu src jak zwykle. I na przykład dla sourceSets, muszę mieć główną (jak to domyślam się domyślam). Nie wiem, jak sobie z tym poradzić ... – powder366