2015-10-23 10 views
10

Voglio creare una variabile globale simile a applicationId. È impostato a valore in build.gradle e verrà utilizzato in manifest. È possibile?Imposta una variabile globale in gradle che può essere utilizzata nel file manifest

+0

gradle è una parte del sistema di build/IDE, non correlato all'app – droidev

+0

se si spiega il caso di utilizzo reale, penso che potremmo essere in grado di aiutare – droidev

+0

possibile duplicato di http://stackoverflow.com/questions/17197636/ is-it-possible-to-declare-a-variable-in-gradle-usable-in-java –

risposta

17

È possibile impostare, ad esempio, sto impostando per diversi sapori di prodotti

productFlavors { 
     production { 
      applicationId = "com.myapp.app" 
      resValue "string", "authority", "com.facebook.app.FacebookContentProvider5435651423234" 
     } 
     development { 
      applicationId = "com.myapp.development" 
      resValue "string", "authority", "com.facebook.app.FacebookContentProvider2134564533421" 
     } 
     qa { 
      applicationId = "com.myapp.qa" 
      resValue "string", "authority", "com.facebook.app.FacebookContentProvider29831237981287319" 
     } 
} 

e utilizzarlo come questo

<provider 
    android:name="com.facebook.FacebookContentProvider" 
    android:authorities="@string/authority" 
    android:exported="true" /> 
+0

Grazie mille. Questa è esattamente la mia situazione. Ho provato a impostare una variabile facebookProdiderId all'interno di build.gradle, quindi riutilizzata all'interno del file manifest Android come $ {facebookProdiderId}, ma non funziona – thanhnd

+0

Contento di poterti aiutare! :) – Marko

+0

possiamo usare lo stesso applicationId con più sapori in questo. –

0

Per utilizzare la stringa in Manifest, è possibile effettuare direttamente in strings.xml. Ti piace questa,

<string name="variable_name">value</string> 
10

Mentre la risposta di Marko sembra per funzionare, attualmente c'è una soluzione migliore che non richiede l'aggiunta di variabili ai file di risorse stringa.

I manifest merger accepts placeholders:

Per i segnaposto personalizzati sostituzioni, utilizzare il seguente DSL per configurare i valori segnaposto:

android { 
    defaultConfig { 
     manifestPlaceholders = [ activityLabel:"defaultName"] 
    } 
    productFlavors { 
     free { 
     } 
     pro { 
      manifestPlaceholders = [ activityLabel:"proName" ] 
     } 
    } 

sostituirà il segnaposto nella seguente dichiarazione:

<activity android:name=".MainActivity" android:label="${activityLabel}" > 

È anche possibile manipolare tali stringhe con funzioni groovy.

+0

Questa è una soluzione più conveniente. Grazie. –

13

Se si desidera utilizzare l'ID applicazione impostato in Gradle nel vostro manifesto, si può utilizzare semplicemente:

$ {ApplicationID}

Per esempio:

<provider 
    android:authorities="${applicationId}.ShareFileProvider" ... > 
    ... 
</provider> 

Se si desidera lo stesso comportamento con le variabili personalizzate, è possibile utilizzare manifestPlaceholders, ad esempio:

android { 
    defaultConfig { 
     manifestPlaceholders = [hostName:"www.example.com"] 
    } 
} 

E nel tuo manifesto:

<intent-filter ... > 
    <data android:scheme="http" android:host="${hostName}" ... /> 
    ... 
</intent-filter> 

Vedi https://developer.android.com/studio/build/manifest-build-variables.html per ulteriori informazioni.