2014-10-23 8 views
12

Ho visto script che manipolano le attività di build di gradle e ora mi chiedo se sia possibile impostare una stringa all'esterno di `defaultConfig ma trattarla come predefinita per tutti sapori.Definire una stringa in gradle e utilizzare anche un'applicazione specifica per il gusto ID

Fondamentalmente ho più sapori e tutti hanno uno specifico ApplicationId. Voglio usare quell'ID per impostare una risorsa stringa da utilizzare successivamente nel mio codice java.

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

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

voglio impostare una stringa come questa:

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

Quello che ho provato:

  • Se lo metto nella sezione defaultConfig l'ApplicationId è ancora nullo, quindi Ottengo una stringa errata
  • La sua collocazione nella sezione di ogni sapore funziona, ma poiché ho più sapori crea molta ripetizione del codice

Alla ricerca di un'alternativa.

P.S. Sto utilizzando Android Studio 0.8.12.

+0

E i tuoi 'buildTypes'? – Blundell

+0

@Blundell sembra che 'applicationId' non sia disponibile lì, solo il suffisso. – Simas

risposta

30

Dopo molte ricerche sono riuscito a trovare la risposta. Forse qualcuno lo troverà utile.

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

Questo semplice frammento di codice imposta una stringa in tutti i sapori dopo sono state stabilite le loro variabili invidual. È un po 'come un defaultConfig ma non abbastanza poiché viene eseguito dopo i blocchi di sapore.


Extra:

Risulta posso anche impostare il applicationId! Il mio risultato finale finora è:

def final String AUTHORITY = '.dataprovider' 

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

Ora posso ottenere l'autorità di ogni fornitore sapore attraverso BuildConfig.AUTHORITY e @string/authority, che io uso nel manifesto e nel mio file di classe, rispettivamente:

<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

My Sir, la tua idea di aggiungere una costante a BuildConfig con la direttiva buildConfigField mi ha salvato la giornata! :-) Lo uso per propagare l'ID dell'applicazione alle costanti della classe AUTHORITY nei miei contentprovider. –

+2

Ho appena notato che è già generato BuildConfig.APPLICATION_ID, tra le altre costanti per tipo di build, incl. dimensioni e informazioni sulla versione. Tuttavia, non avrei visto quelle informazioni senza la tua risposta. –

+0

@ arne.jans il motivo della lunghezza di questa risposta è che volevo avere un'autorità specifica per il gusto, che è anche una stringa di risorse, quindi è utilizzabile nel manifest. Non puoi farlo solo con 'BuildConfig.APPLICATION_ID'. – Simas

Problemi correlati