2013-08-08 14 views
13

Mam 2 smaki aplikacji, z których każda ma własny klucz mapy google (v1) do debugowania i wydawania (czyli 4 klucze łącznie). Chciałbym wiedzieć, czy mogę określić sourceSets na podstawie buildType i productFlavor. Zasadniczo, zastanawiam się, jak mogę osiągnąć coś takiego:Jak mogę określić dla poszczególnych składników zestawu źródeł buildType?

src 
├── debug 
│   └── flavor1 
│    └── res 
│   └── values 
│    └── gmaps_key.xml 
├── release 
│ └──flavor1 
│  └── res 
│   └── values 
│    └── gmaps_key.xml 

Gdzie Gradle będzie korzystał z src/<currentBuldType>/<currentProductFlavor>/* jako część swojej sourceSet.

Zasadniczo chcę go tak, że jeśli uruchomię gradle assembleFlavor1Debug będzie zawierać wszystko pod src/main/*, src/flavor1/* i src/debug/flavor1/*.

Moja build.gradle jest bardzo prosta:

buildscript { 
    repositories { 
     mavenCentral() 
    } 

    dependencies { 
     classpath 'com.android.tools.build:gradle:0.5.0' 
    } 
} 

apply plugin: 'android' 

android { 
    compileSdkVersion 8 

    productFlavors { 
     flavor1 { 
      packageName 'com.flavor1' 
     } 
     flavor2 { 
      packageName 'com.flavor2' 
     } 
    } 
} 

Wszelkie myśli? A może lepsze podejście do tego?

Odpowiedz

4

dla Google Maps API integracji można sprawdzić mój Gradle przykładowy kod tutaj: https://github.com/shakalaca/learning_gradle_android/tree/master/07_tricks

Zasadniczo zrobić małą sztuczkę w android.applicationVariants.all podczas fazy mergeResources i umieścić klucz API w strings.xml pod innym flaver połączeniu/buildtype teczka.

+0

Akceptuję twoją odpowiedź, ponieważ jest to bardzo podobne do tego, jak skończyłem robić rzeczy. – smoak

11

Zdarzyło mi się, że wróciłem do tego ze względu na komentarz do mojej odpowiedzi i uświadomiłem sobie, że ta odpowiedź jest zbyteczna (wciąż lepsza niż zaakceptowana, która jest jeszcze bardziej). Dla każdego produktuFlavor i buildType już istnieją zestawy kombinacji i pojedynczych źródeł. tj. src/{buildType}, src/{productFlavor} i src/{productFlavor}{buildType} są już dostępnymi folderami źródłowymi.

Zasadniczo wszystko, co było potrzebne dla PO, to umieszczenie zasobów w src/flavor1Debug, co jest równoważne z src/debug/flavor1, które OP przewiduje.

OLD ODPOWIEDŹ: Robiłem coś podobnego z buildConfig ale mam nadzieję, że to powinno działać z sourceSets.

Zasadniczo, definiujesz typowe rzeczy na poziomie productFlavors w zmiennej i dodajesz rzeczy, gdy schodzisz w dół.

productFlavors { 
     def common = 'src/main' 

     flavor1 { 
      def flavor = 'src/main/flavor1' 
      buildTypes { 
       debug { 
        sourceSets { 
         res.srcDirs = [ common + ',' + flavor + ',' + 'src/main/debug' 
        } 
       } 

       release { 
        sourceSets { 
         res.srcDirs = [ common + ',' + flavor + ',' + 'src/main/release' 
        } 

      } 
     } 
} 

Nie testowałem tego. Myślę, że może być konieczne użycie android.sourceSets zamiast tylko sourceSets.

Muszę również zdefiniować oddzielne zasoby dla productFlavors, więc użyłem osobnej instrukcji późno w pliku kompilacji. Tak:

android.sourceSets.flavor1 { 
    res.srcDirs = ['flavor_resources/flavor1/res'] 
} 

Trzeba po prostu być w stanie wykorzystać android.sourceSets.flavor1.debug zamiast jeśli trzeba.

Należy również zauważyć, że zgodnie z Androidem Gradle user guide, użycie srcDir dodaje katalog do domyślnych źródeł i zastępuje je srcDirs.

+0

Jak bym to zrobił dynamicznie? Mam sourceSets.whenObjectAdded {sourceSet -> sourceSet.java.srcDirs = "someDir"}, a następnie zestawy źródeł zdefiniowane dla każdego smaku w następujący sposób: sourceSets {flavor1 {} flavor2 {}}.Chcę zrobić coś takiego: sourceSet.debug.java.srcDirs = "someDir" dla każdego smaku produktu i dla typu buildType. – box

+0

Edytowałem odpowiedź, czy nadal potrzebujesz czegoś bardziej niestandardowego? –

+0

Hy @saad farooq Zdaję sobie sprawę z rozwiązania, które zostało zmienione (dziękuję za opublikowanie go!), Jednak moje smaki produktu są złożonymi i ponownie wykorzystanymi zasobami. Być może będę musiał przemyśleć, co robię, ale dynamiczne rozwiązanie dla mnie byłoby fajniejsze, ponieważ mam 12 smaków produktów i nie chcę tworzyć dodatkowych folderów takich jak ten smak1Release, flavor1Debug, flavor1DebugFull. Doprowadziłoby to do permutacji zbyt wielu folderów, a jej utrzymanie jest czasochłonne. Zadałem też pytanie: http://stackoverflow.com/questions/41589641/gradle-sourcesets-by-productflavor-and-buildtype – box

Powiązane problemy