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

Hrk*_*Hrk 49 android key gradle google-maps-android-api-2 android-studio

我知道Gradle很强大,我想管理用于开发/生产Google Maps的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]" />
-->
Run Code Online (Sandbox Code Playgroud)

bon*_*ond 107

由于您使用的是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]"
       }
    }
  }
Run Code Online (Sandbox Code Playgroud)

并在您的AndroidManifest.xml中

<meta-data
            android:name="com.google.android.maps.v2.API_KEY"
            android:value="@string/google_maps_api_key"/>
Run Code Online (Sandbox Code Playgroud)

这样,您只有一个AndroidManifest.xml,并根据您的构建类型设置值.希望这可以帮助.

  • 这个解决方案就像最新Android Studio版本(1.1 Beta 2)的魅力一样!感谢分享. (2认同)
  • 我最终将resValue添加到我的各种产品口味中,并且效果很好. (2认同)

Ily*_*min 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"]
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在清单中:

<meta-data
    android:name="com.google.android.maps.v2.API_KEY"
    android:value="${google_map_key}"/>
Run Code Online (Sandbox Code Playgroud)

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


Oka*_*kas 13

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


Sco*_*rta 11

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

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

当你进行构建时,构建类型和风格被组合(称为变体); 在此示例中,您可以拥有freeDebug,freeRelease,paidDebug和paidRelease构建.

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

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

为此,请不要将Google Maps API密钥放在主应用的AndroidManifest.xml文件中src/main; 相反,添加两个新的文件夹,src/debugsrc/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>
Run Code Online (Sandbox Code Playgroud)

并且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>
Run Code Online (Sandbox Code Playgroud)

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

如果由于某种原因你不想使用构建类型来区分你可以设置dev和prod风格并将其拆分成这样; 清单覆盖以相同的方式工作.