2016-05-26 14 views
16

Il metodo resValue (o come si chiama) consente di impostare un valore di risorsa in buildTypes o productFlavors. C'è un modo corrispondente per ottenere un valore di risorsa che è stato impostato da resValue?Come ottenere un valore di risorsa in build.gradle?

Sembra che productFlavors viene valutata prima buildTypes, quindi un insieme resValue in buildTypes ha la precedenza. Voglio aggiungere "Debug" al nome dell'app in build di debug, ma ho bisogno di ottenere il valore che è stato impostato nel flavor del prodotto per poterlo aggiungere.

Edit: Ho provato il suggerimento di Marcin Kozinski di utilizzare una variabile, ma tutti sapori dei prodotti vengono valutate prima qualsiasi tipo build. Pertanto, questo non funziona:

android { 
    String appName = "" 

    productFlavors { 
     Foo { 
      appName = "Foo" 
     } 

     Bar { 
      appName = "Bar" 
     } 
    } 

    buildTypes { 
     release { 
      resValue "string", "app_name", appName 
     } 

     debug { 
      resValue "string", "app_name", appName + " Debug" 
     } 
    } 
} 

In buildTypes, appName ha sempre il valore dal sapore del prodotto scorso. Quindi, in questo esempio, tutte le build ricevono il nome "Bar" o "Bar Debug".

Fondamentalmente, ho bisogno di un resValueSuffix analogo a applicationIdSuffix. Apparentemente nessun animale del genere esiste. Il plug-in com.android.application espone tutto ciò che è possibile utilizzare per ottenere questo risultato?

+0

http://stackoverflow.com/questions/17275461/how-to-replace-strings-resources-with-android-gradle –

+0

@TimCastelijns Quel Q & A riguarda le risorse da 'strings.xml'. La mia risorsa è creata con 'resValue'. –

+0

"app_name" è utilizzato nella tua app oltre al manifest? – cyroxis

risposta

21

Se lo sei stai solo provando a impostare l'etichetta app (o altri valori manifest) per risolvere questo problema con segnaposti manifest.

android { 

    productFlavors { 
     Foo { 
      applicationId "com.myexample.foo" 
      manifestPlaceholders = [ appName:"Foo"] 
     } 

     Bar { 
      applicationId "com.myexample.bar" 
      manifestPlaceholders = [ appName:"Bar"] 
     } 
    } 

    buildTypes { 
     release { 
      manifestPlaceholders = [ appNameSuffix:""] 
     } 

     debug { 
      manifestPlaceholders = [ appNameSuffix:".Debug"] 
      applicationIdSuffix ".debug" 
     } 
    } 
} 

Poi, nel tuo Android Manifest è sufficiente utilizzare due segnaposti per il nome dell'applicazione (o altri valori)

<application 
     android:label="${appName}${appNameSuffix}" 
     ... 
</application> 

Questo permetterà di installare tutte le 4 varianti di fianco a fianco su un singolo dispositivo così come dare loro nomi diversi nel cassetto delle applicazioni/launcher.

+0

Eccellente! Grazie. –

+7

Sarei ancora curioso di sapere come si possa rispondere alla domanda degli OP in merito all'ottenere valore delle risorse in gradle ... –

+0

Non so se sia possibile, se è così non sono mai stato in grado di capirlo. – cyroxis

1

Per avere una versione alternativa di una risorsa in build di debug è possibile utilizzare il set di origini di debug.

strings.xml può essere trovato nel seguente percorso src/main/res/values, che significa che è nel set di origine principale. Se crei una nuova directory src/debug/res/values, puoi inserire un nuovo file strings.xml con valori che devono essere sovrascritti nelle build di debug. Per esempio:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <string name="app_name">My Application Debug</string> 
</resources> 

Questo sostituirà qualsiasi valore app_name ha nel file principale. Non devi duplicare tutte le stringhe qui - quelle che non includi qui sono semplicemente prese dal file principale.

+1

La risorsa non è in 'strings.xml'. Lo sto creando con 'resValue' perché prevedo che il numero di varianti di build * sapori del prodotto crescano, e vorrei evitare la necessità di creare un' strings.xml' per ogni combinazione. –

+0

Se si sta creando il valore originale usando 'resValue', non è necessario leggerlo di nuovo dalle risorse. Hai già il valore nel tuo script 'build.gradle'. Assegnalo a una variabile locale e usalo per creare una risorsa per ogni variante. –

+0

Ho provato a inserire la variabile nello scope 'android'. Tutti gli aromi del prodotto vengono eseguiti prima di qualsiasi tipo di build, quindi ogni tipo di build vede il valore assegnato nell'ultimo sapore del prodotto. –

3

È possibile controllare le varianti di build come questo

Definire i valori in Gradle

buildTypes { 
    debug{ 
     buildConfigField "String", "Your_string_key", '"yourkeyvalue"' 
     buildConfigField "String", "SOCKET_URL", '"some text"' 
     buildConfigField "Boolean", "LOG", 'true' 
    } 
    release { 
     buildConfigField "String", "Your_string_key", '"release text"' 
     buildConfigField "String", "SOCKET_URL", '"release text"' 
     buildConfigField "Boolean", "LOG", 'false' 

    } 
} 

E per accedere a tali valori utilizzando costruire varianti:

if(!BuildConfig.LOG) 
     // do something with the boolean value 

O

view.setText(BuildConfig.yourkeyvalue); 
+0

La risorsa in questione è il nome dell'app, quindi deve essere una risorsa. –

Problemi correlati