2013-10-28 28 views
12

Bir süredir gradyan ve derleme varyantlarıyla uğraşıyorum.Tabaka oluşturma varyantları için klasör adlandırma kuralı

  • ayıklama
  • bırakma

Ve bunlar tatlar:

  • ücretsiz
0 ödenen ben

bu tanımlanmış türleri oluşturmak

Belirli bir yapı türü için benzersiz kaynakları ve varlıkları nasıl tanımlarım? FreeDebug? Örneğin, yapı türüne bağlı olarak dört farklı uygulama adı ve her bir varyant için farklı bir simge istiyorum.

cevap

12

Aynı sorunla uğraşıyorum. İlk başta kaynak kontrolümde iki dal kullandım, ama bu onları bir arada tutan bir baş ağrıyordu. Gradle çok esnek bir yapı sistemidir, ancak varsayılan kurallar her zaman yeterli değildir. Sonunda kod tabanımda bunu nasıl çözdüm. Her iki tatlar için ortak olan her şeyi tutmak

+ 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 
     ... 

ana klasöründe:

I (basitleştirilmiş) esasen aşağıdaki dizin yapısı ile sona erdi. Ücretsiz klasörde ücretsiz sürüm için benzersiz olan her şeyi saklıyorum (ücretli olarak aynı). Lezzet klasöründeki dosyalar ana üzerine yerleştirilir.

Varsayılan yer paylaşımlı kurallar, "src" altındaki klasörleri aynı ada sahip olan "ücretsiz" ve "ücretli" ürün lezzetlerini işleyecektir. Benim için sorun, yapı tiplerinin bindirilmesiyle başlar.

Lezzet klasörleriyle aynı yapıya sahip bir hata ayıklama klasörü oluşturmuş olsaydım, o anda kullanılan aroma klasörünün üzerine yerleştirilirdi. Bu, her iki tat için de aynı hata ayıklama ismine yol açtı, ancak lezzetine bağlı olarak farklı hata ayıklama isimleri istedim. Bazı araştırmalardan sonra derleme dosyamda aşağıdaki değişikliklerle karşılaştım.

... 

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; 
     } 
    } 
} 

... 

Şimdi yapı varyantı önce aşağıdaki klasörleri kaplayan tarafından inşa edilecek:

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 
11

Gradle Sourcesets and Dependencies guide'a göre, her bir Yapı Varyantı için belirli öznitelikleri özelleştirmek için src/freeDebug/res veya src/paidRelease/res vb. Yeni bir klasör ekleyebilirsiniz.

+0

mevcut böylece ana klasörden silinen Ve sadece tek bir simgeyi değiştirmek değil isterseniz bütün kaynak ağacını çoğaltmak edilir? – powder366

+2

src/main/res tüm yapılara uygulanır, böylece derleme varyantları arasında değişiklik gösteren kaynaklar eklemeniz yeterlidir. – ianhanniballake

+0

Ok teşekkürler! Ama bir projeyi Eclipse'den Studio'ya dönüştürdüğümde, örneğin bir src/main/java almadım, sadece normal olarak src aldım. Ve örneğin sourceSets için bir ana olmalı (varsayılan olarak tahmin ediyorum). Bunu nasıl halledeceğinden emin değilim ... – powder366

1

klasör yapısı olmalıdır varyantları inşa oluştururken:

app 
    | 
    ->src 
     | 
     ->buildvariantname1(as defined in gradle) 
          | 
          ->java (follow the same structure here, as in main folder) 
          ->res (follow the same structure here, as in main folder)  

Şimdi belirli seçilmesiyle ilgili varyant, buildVariantname1debug gibi, bu değişken altında res klasöründe yazılan değişiklikler seçilecektir.

Uygulama adı, her bir yapı varyantının altındaki xml değerine bağlı olarak uygulama adının getirilebilmesi için res-> değerler klasörü altında string.xml altında tanımlanmalıdır. Aynı uygulama simgeleri için de geçerli.

İlk görüntü oluşturma çeşitlemeleri (farklı paket adlarıyla tatlar)
enter image description here

ikinci görüntü gösterileri, nasıl proje yapısı her lezzet, farklı bir kod, drawables sahip olmak istiyorsanız benziyor ve ilan etmek nasıl gösterir aynı zamanda tezahür eder. Zihin MainActivity tutun her yapı varyantı

enter image description here

İlgili konular