在Android Studio中使用Gradle管理Google Maps API密钥

时间:2014-09-30 15:13:34

标签: android gradle android-studio key google-maps-android-api-2

我知道Gradle功能强大,我想管理用于开发/制作Google地图的API密钥

目前我总是需要手动注释一行并取消注释另一行以使其正常工作。有没有办法在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]" />
-->

4 个答案:

答案 0 :(得分:106)

由于您使用的是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,并根据您的构建类型设置值。希望这会有所帮助。

答案 1 :(得分:24)

您可以使用明确占位符功能实现此目的: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}"/>

对于不同风格的不同键,这是确切的事情,这比使用字符串资源更清晰。

答案 2 :(得分:13)

在Android Studio中(使用版本0.8.11检查),您可以将Google Maps Activity(New-&gt; Google-&gt; Google Maps Activity)添加到您的项目中,Android studio将为您生成必要的文件,您只需要插入你的钥匙。还有生成的指令。在debug / res / values /和release / res / values文件夹中查找google_maps_api.xml文件。

答案 3 :(得分:11)

在Android Studio中,有构建类型和风格的概念,您可以使用它们来获取所需内容。构建类型是应用程序的不同版本,功能相同但在调试代码中可能不同。默认情况下,所有Android Gradle项目都具有调试和发布版本类型。

Flavors是您的应用程序的功能不同的版本;例如,你可以免费和付费。默认情况下,您的Android Gradle项目没有任何风格,但您可以添加它们。

当你进行构建时,构建类型和风格被组合在一起(被称为变体);在这个例子中,你可以有freeDebug,freeRelease,paidDebug和paidRelease构建。

构建系统可让您轻松覆盖每种类型/风味/变体中的许多内容;您可以做的一件事是覆盖AndroidManifest.xml文件的一部分。构建系统在构建特定变体时将不同符合条件的清单合并到一个主清单中。

有了这样的背景,在您的情况下,您可能希望在应用程序的调试版本与发行版本中使用不同的API密钥。调试版本是您在日常开发,调试和测试中使用的版本,发布版本是您部署到用户的版本。

要执行此操作, 将Google Maps API密钥放在src/main中主应用的AndroidManifest.xml文件中;相反,添加两个新文件夹src/debugsrc/release,并在那里添加 存根 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>

重申一点,不要在src/main/AndroidManifest.xml文件中放置任何API密钥。

如果由于某种原因你不想使用构建类型来区分你可以设置dev和prod的味道并将其分开;清单覆盖以同样的方式工作。