2014-10-23 9 views
12

Widziałem skrypty, które manipulują zadaniami build gradle i teraz zastanawiam się, czy możliwe jest ustawienie ciągu poza `defaultConfig, ale traktuj to jako domyślny dla wszystkich smaki.Zdefiniuj łańcuch w gradle, a także użyj specyficznego dla smaku applicationId

Zasadniczo mam wiele smaków i wszystkie mają określony identyfikator ApplicationId. Chcę użyć tego id, aby ustawić zasób ciąg znaków, który będzie używany później w moim kodzie java.

defaultConfig { 
    minSdkVersion 11 
    targetSdkVersion 21 
    versionCode 1 
    versionName "1.0" 
} 

productFlavors { 
    one { 
     applicationId "com.my.app.one" 
    } 
    two { 
     applicationId "com.my.app.two" 
    } 
} 

Chcę ustawić ciąg tak:

resValue "string", "authority", applicationId + ".dataprovider" 

Co próbowałem:

  • Jeśli mogę umieścić go w sekcji defaultConfig applicationId nadal jest zerowa, a zatem Otrzymuję nieprawidłowy ciąg
  • Umieszczenie go w sekcji każdego smaku działa, ale ponieważ mam wiele smaków, powstaje wiele powtórzeń kodu

Szukasz alternatywy.

P.S. Używam Androida Studio 0.8.12.

+0

Co powiesz na "buildTypes"? – Blundell

+0

@Blundell wydaje się, że 'applicationId' nie jest tam dostępny, tylko sufiks. – Simas

Odpowiedz

30

Po wielu poszukiwaniach udało mi się znaleźć odpowiedź na to pytanie. Być może ktoś uzna to za przydatne.

productFlavors.all { 
    resValue "string", "authority", applicationId + ".dataprovider" 
} 

Ten prosty fragment ustawia ciąg do wszystkich smaków po ich zmienne invidual zostały ustawione. Jest to trochę jak defaultConfig, ale nie całkiem, ponieważ jest wykonywane po blokach smakowych.


Extra:

Okazuje się, że mogę nawet ustawić applicationId! Mój wynik końcowy jakim jest:

def final String AUTHORITY = '.dataprovider' 

productFlavors.all { 
    applicationId "com.my.app." + name 
    resValue "string", "authority", applicationId + AUTHORITY 
    buildConfigField "String", "AUTHORITY", "\""+applicationId + AUTHORITY+"\"" 
} 

Teraz mogę dostać władzę każdego dostawcy smak poprzez BuildConfig.AUTHORITY i @string/authority, który używam w manifeście i moim pliku klasy odpowiednio:

<provider 
    android:name="com.my.app.DataProvider" 
    android:authorities="@string/authority" 
    android:exported="false" /> 


public class DataProvider extends ContentProvider { 
    public static final String PROVIDER = BuildConfig.AUTHORITY; 
    public static final Uri SEARCH_URI = Uri.parse("content://" + PROVIDER + "/search"); 
} 
+0

Mój sir, twój pomysł dodania stałej do BuildConfig za pomocą dyrektywy buildConfigField zapisał mój dzień! :-) Używam go do propagowania ID aplikacji do stałych klasy AUTHORITY w moich dostawców treści. –

+2

Właśnie zauważyłem, że jest już generowany BuildConfig.APPLICATION_ID, między innymi stałymi, dla typu kompilacji, smaki włącznie. wymiary i informacje o wersji. Niemniej jednak bez twojej odpowiedzi nie widziałbym tych informacji. –

+0

@ arne.jans przyczyną długości tej odpowiedzi jest to, że chciałem mieć uprawnienia specyficzne dla danego smaku, które również są ciągiem zasobów, więc można go użyć w manifeście. Nie można tego zrobić za pomocą 'BuildConfig.APPLICATION_ID'. – Simas

Powiązane problemy