46

So Gradle è potente e vorrei per gestire le chiavi API per lo sviluppo/produciton di Google MapsGestire Google Maps API Key con Gradle in Android Studio

Attualmente ho sempre bisogno di commentare manualmente una linea e rimuovere il commento altro per farlo funzionare. C'è un modo per farlo automaticamente in Gradle con alcune configurazioni di rilascio personalizzate?

<!-- MapView v2 API --> 
<uses-library android:name="com.google.android.maps" /> 
<meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="[MY_DEV_KEY]" /> 
<!-- PROD 
<meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="[MY_PROD_KEY]" /> 
--> 
+0

Amico esattamente quello di cui avevo bisogno, bella domanda. – Radu

risposta

99

Dal momento che si utilizza Gradle è possibile effettuare le seguenti operazioni:

build.gradle

android { 
    .. .. ... 
    buildTypes { 
     debug { 
      resValue "string", "google_maps_api_key", "[YOUR DEV KEY]" 
     } 
     release { 
      resValue "string", "google_maps_api_key", "[YOUR PROD KEY]" 
     } 
    } 
    } 

E nel tuo AndroidManifest.xml

<meta-data 
      android:name="com.google.android.maps.v2.API_KEY" 
      android:value="@string/google_maps_api_key"/> 

In questo modo è solo avere un AndroidManifest.xml e impostare il valore in base al tipo di build. Spero che questo ti aiuti.

+2

Questa soluzione funziona come un fascino con l'ultima versione di Android Studio (1.1 Beta 2)! Grazie per la condivisione. – Superbyte

+2

Ho finito per aggiungere resValue a ciascuno dei miei vari gusti di prodotto e ha funzionato benissimo. – wapples

+0

È sicuro archiviarli in questo modo? –

13

In Android Studio (controllato con la versione 0.8.11) è possibile aggiungere Google Maps Activity (Nuovo-> Google-> Google Maps Attività) al progetto e Android Studio genera file necessari per voi, solo devi inserire le tue chiavi. Ci sono anche istruzioni generate. Cerca i file google_maps_api.xml nelle cartelle debug/res/values ​​/ e release/res/values.

+0

Sì, questo vale per le versioni più recenti di Android e per Android Studio: res> valori> google_map_api.xml e un Donato

10

In Android Studio, c'è il concetto di tipi di build e aromi, e puoi usarli per ottenere ciò che ti serve. I tipi di build sono versioni diverse dell'app che sono identiche dal punto di vista funzionale ma possono differire nel codice di debug. Per impostazione predefinita, tutti i progetti Android Gradle hanno i tipi di build di debug e release.

Gli aromi sono versioni della tua app che sono funzionalmente diverse; puoi avere libero e pagato, per esempio. Per impostazione predefinita, i tuoi progetti Android Gradle non hanno alcun aroma, ma puoi aggiungerli.

I tipi di build e gli aromi vengono combinati (nella cosiddetta variante ) quando si esegue una generazione; in questo esempio, puoi avere build freeDebug, freeRelease, paidDebug e paidRelease.

Il sistema di compilazione consente di ignorare facilmente un numero di elementi in ogni tipo/sapore/variante; una delle cose che puoi fare è sovrascrivere parti del file AndroidManifest.xml. Il sistema di compilazione unisce i diversi bit idonei di manifest in un manifest principale quando crea una variante particolare.

Con lo sfondo in mano, nel tuo caso potresti voler avere una chiave API diversa nella versione di debug della tua app rispetto alla versione di rilascio. La versione di debug è ciò che userai nello sviluppo, debug e test quotidiani, e la versione di rilascio è ciò che distribuiresti agli utenti.

A tale scopo, non lo fanno inserire la chiave API di Google Maps nel file di AndroidManifest.xml dell'app principale src/main; invece, aggiungi due nuove cartelle, src/debug e src/release e aggiungi stub file AndroidManifest.xml lì. Non includere informazioni complete in questi nuovi manifesti, ma solo ciò che è unico su ciò che è necessario per quella particolare variante. I file di origine sarà simile a questo:

Screenshot of project directory structure showing multiple manifest files

Il file src/debug/AndroidManifest.xml conterrà questo:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android"> 
    <meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="[MY_DEV_KEY]" /> 
</manifest> 

e src/release/AndroidManifest.xml avrà questo:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android"> 
    <meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="[MY_PROD_KEY]" /> 
</manifest> 

per ribadire, non lo fanno inserire qualsiasi chiave API nel file src/main/AndroidManifest.xml.

Se per qualche motivo non si desidera utilizzare i tipi di compilazione per differenziare, è possibile impostare i gusti di sviluppo e sviluppo e suddividerlo in questo modo; il manifest overriding funziona allo stesso modo.

+1

Grazie per tutte le spiegazioni. Ho sviato la tua risposta per la grande spiegazione, ma ho trovato la soluzione Okas più elegante in quanto evita la duplicazione di manifest e inserisce la chiave in una stringa di risorse XML. So che il principio è lo stesso della tua spiegazione. – Hrk

23

È possibile raggiungere questo obiettivo con funzione segnaposto manifesta: http://tools.android.com/tech-docs/new-build-system/user-guide/manifest-merger#TOC-Placeholder-support

nel file di build.gradle:

buildTypes { 
    debug { 
     manifestPlaceholders = [ google_map_key:"your_dev_key"] 
    } 
    release { 
     manifestPlaceholders = [ google_map_key:"prod_key"] 
    } 
} 

e quindi in palese:

<meta-data 
    android:name="com.google.android.maps.v2.API_KEY" 
    android:value="${google_map_key}"/> 

Ecco cosa esatta per le diverse chiavi per sapori diversi e questa è una soluzione più pulita rispetto all'utilizzo di risorse stringa.