Управляйте ключом API Google Maps с помощью Gradle в Android Studio

#android #android-studio #google-maps #gradle #build.gradle

Вопрос:

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

В настоящее время мне всегда нужно вручную комментировать одну строку и раскомментировать другую, чтобы она работала. Есть ли способ сделать это автоматически в 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]" />
-->
 

Комментарии:

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

Ответ №1:

Поскольку вы используете 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 и вы устанавливаете значение в зависимости от вашего типа сборки. Надеюсь, это поможет.

Комментарии:

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

2. В итоге я добавил значение для каждого из моих различных вкусов продукта, и это сработало отлично.

3. Безопасно ли хранить их вот так?

4. @GokhanArik, да, хранить его так безопасно.

5. @GokhanArik безопасно с точки зрения предоставления ваших ключей api всем, у кого есть доступ к коду, нет. Безопасно в отношении того, будет ли это работать и ничего не испортится, да.

Ответ №2:

Вы можете добиться этого с помощью функции заполнителя манифеста: 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}"/>
 

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

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

Комментарии:

1. Как мы можем получить доступ к этому google_map_key в действии(файл Java)?

2. Попробуйте это: ApplicationInfo ai = getPackageManager().getApplicationInfo(activity.getPackageName(), PackageManager.GET_META_DATA); String myApiKey = ai.metaData.getString("com.google.android.maps.v2.API_KEY");

3. Для меня это сработало только при определении manifestPlaceholders , android.defaultConfig как описано в документе , по некоторым причинам.

4. пс. Если вы получаете ключи api от бэкенда, вам все равно нужно где-то жестко закодировать свой внутренний URL-адрес и секретный ключ для вызова этого api? Теперь вам нужно где-то сохранить новые учетные данные.

5. @babyishTank это зависит от обстоятельств. Одним из хороших вариантов может быть наличие конечной точки, которая возвращает кратковременные секреты, требующие авторизации (не подходит для каждого приложения). Не каждая служба поддерживает короткие секреты жизни, но ИМО это лучший вариант, чтобы предотвратить злоупотребление вашей учетной записью (- ами) платными услугами. Но определенно с этого момента я бы посоветовал никогда жестко не кодировать какие-либо секреты в приложении, просто извлекайте их из своего бэкенда, если вам это нужно.

Ответ №3:

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

Комментарии:

1. Да, это относится к более новым версиям Android и использованию Android Studio: res > значения >> google_map_api.xml и >>.. И ваш XML-файл макета будет содержать в себе фрагмент.

Ответ №4:

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

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

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

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

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

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

Снимок экрана структуры каталогов проекта, показывающий несколько файлов манифеста

Ваш 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 .

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

Комментарии:

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