2014-09-30 83 views
46

我知道摇篮是强大的,我想以管理为谷歌地图的开发/加工生产时的API密钥管理与摇篮谷歌地图API密钥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 2015-04-29 13:48:46

回答

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 2015-02-02 13:06:15

+2

我最终将resValue添加到了我的各种产品口味中,并且效果很好。 – wapples 2016-01-21 21:10:38

+0

这样存放他们是否安全? – 2016-04-18 20:08:44

13

在Android Studio中(与0.8.11版本检查),你只能添加谷歌地图的活动(新建 - > Google->谷歌地图的活动),以你的项目和Android工作室会为您生成必要的文件,你必须插入您的密钥。还有生成的说明。在debug/res/values /和release/res/values文件夹中查找google_maps_api.xml文件。

+0

是的,这适用于较新版本的Android并使用Android Studio:res> values> google_map_api.xml和一个 Donato 2017-08-11 18:05:58

10

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

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

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

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

有了这种背景,对于您的情况,您可能希望在应用的调试版本与发行版本中拥有不同的API密钥。调试版本是您在日常开发,调试和测试中使用的版本,发布版本是您要部署给用户的版本。

要做到这一点,放在主应用程序的AndroidManifest.xml文件中的谷歌地图API密钥src/main;相反,添加两个新文件夹,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> 

再次重申,不将任何API密钥放入src/main/AndroidManifest.xml文件中。

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

+1

感谢您的所有解释。我已经为你的答案提出了很好的解释,但我发现Okas解决方案更加优雅,因为它避免了清单的重复并将密钥放入XML资源字符串中。我知道这个原则和你的解释一样。 – Hrk 2014-10-01 20:34:56

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}"/> 

这是千真万确的事情对于不同的密钥不同的口味,这是比使用字符串资源更清洁的解决方案。