46

Я знаю Gradle силен, и я хотел бы управлять ключами API для разработки/produciton из Google MapsУправление Google Maps API Key с Gradle в Android Studio

В настоящее время я всегда нужно вручную прокомментировать одну строку и раскомментировать другой, чтобы заставить его работать. Есть ли способ сделать это автоматически в Gradle с помощью какой-либо пользовательской конфигурации выпуска?

<!-- 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

Чувак именно то, что мне было нужно, хороший вопрос. – Radu

ответ

99

Поскольку вы используете Gradle вы можете сделать следующее:

build.gradle

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

И в вашем AndroidManifest.xml

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

Таким образом, вы только есть один AndroidManifest.xml и вы устанавливаете значение на основе вашего типа сборки. Надеюсь это поможет.

+2

Это решение работает как прелесть с последней версией Android Studio (1.1 Beta 2)! Спасибо, что поделился. – Superbyte

+2

Я закончил тем, что добавил resValue к каждому из моих различных вкусов продукта, и он отлично поработал. – wapples

+0

Можно ли хранить их вот так? –

13

В Android Studio (проверено с версией 0.8.11), вы можете добавить Google Maps активность (New-> Google-> Google Maps Activity) для вашего проекта и Android-студия создаст необходимые файлы для вас, вы только вам нужно вставить свои ключи. Также есть инструкции. Найдите файлы google_maps_api.xml в папках debug/res/values ​​/ и release/res/values.

+0

Да, это относится к более новым версиям Android и Android Studio: res> values> google_map_api.xml и Donato

10

В Android Studio есть концепция типов сборки и вкусов, и вы можете использовать их, чтобы получить то, что вам нужно. Типы сборки - это разные версии приложения, которые функционально идентичны, но могут отличаться от кода отладки. По умолчанию все проекты Android Gradle имеют варианты отладки и выпуска.

Ароматизаторы - это версии вашего приложения, которые функционально отличаются друг от друга; например, у вас могут быть бесплатные и оплаченные. По умолчанию у ваших проектов Android Gradle нет вкусов, но вы можете их добавить.

Виды сборки и ароматизаторы объединены (в так называемом варианте ), когда вы делаете сборку; в этом примере вы можете иметь freeDebug, freeRelease, paidDebug и paidRelease.

Система сборки позволяет легко переопределить ряд вещей в каждом типе/вкусе/варианте; одна из вещей, которую вы можете сделать, - это переопределить части файла AndroidManifest.xml. Система сборки объединяет различные допустимые бит манифеста в один мастер-манифест, когда он создает конкретный вариант.

С учетом этого фона в вашем случае вы можете захотеть иметь другой ключ API в отладочной версии вашего приложения по сравнению с версией выпуска. Отладочная версия - это то, что вы будете использовать в своей повседневной разработке, отладке и тестировании, а версия выпуска - это то, что вы хотите развернуть для пользователей.

Чтобы сделать это, не положил ключ API Карт Google в файле AndroidManifest.xml главного приложения в src/main; вместо этого добавьте две новые папки, src/debug и src/release и добавьте stub Файлы AndroidManifest.xml. Не включайте полную информацию в эти новые манифесты, но только то, что уникально в том, что необходимо для этого конкретного варианта. Ваши файлы будут выглядеть следующим образом:

Screenshot of project directory structure showing multiple manifest files

Файл src/debug/AndroidManifest.xml будет содержать это:

<?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> 

и src/release/AndroidManifest.xml будет иметь это:

<?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> 

Повторим, не поместите любой ключ API в файл src/main/AndroidManifest.xml.

Если по какой-то причине вы не хотите использовать типы построения для дифференциации, вы можете настроить ароматы dev и prod и разбить их таким образом; Подобным образом работает манифеста.

+1

Спасибо за все объяснение. Я получил ответ на большое объяснение, но я нашел решение Okas более элегантным, поскольку оно позволяет избежать дублирования манифеста и поместить ключ в строку ресурсов XML. Я знаю, что принцип такой же, как и ваше объяснение. – Hrk

23

Вы можете добиться этого с явной функцией заполнителя: http://tools.android.com/tech-docs/new-build-system/user-guide/manifest-merger#TOC-Placeholder-support

в build.gradle файл:

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

, а затем в манифесте:

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

Это точная вещь для различных ключей для разные вкусы, и это более чистое решение, чем использование строковых ресурсов.