首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >编译时编辑密钥以删除API- AndroidManifest

编译时编辑密钥以删除API- AndroidManifest
EN

Stack Overflow用户
提问于 2012-12-21 03:22:29
回答 4查看 4.6K关注 0票数 24

我目前正在做一个Android项目,正在学习如何使用git。我被屏蔽是因为git的一个问题:我在我的android-manifest文件中声明了我的Google Maps api密钥:

代码语言:javascript
运行
复制
<meta-data
    android:name="com.google.android.maps.v2.API_KEY"
    android:value="HEREISMYKEY"/>

现在,我想在github中推送我的代码,但我不能推送我的AndroidManifest,因为它包含我的api key (这应该是保密的)。

我想知道是否有一种方法可以在每次推送之前修改它,或者可能在每次编译我的应用程序时修改它?

感谢您的帮助!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-12-21 22:46:54

在res/value(将其命名为api-keys.xml或类似的名称)中创建一个新的*.xml文件。

将您的清单更改为指向此字符串:

代码语言:javascript
运行
复制
 <meta-data
    android:name="com.google.android.maps.v2.API_KEY"
    android:value="@string/GoogleMapsKey"/>

当您第一次将您的更改推送给公众时,放入一个虚拟密钥。

然后使用真实的API密钥编辑该文件。

然后将该文件添加到您的.gitignore文件中,这样它就不会再次被推送。

票数 37
EN

Stack Overflow用户

发布于 2012-12-21 04:03:43

你可以做的就是把你的AndroidManifest.XML文件放在你的.gitignore文件中,这样它就不会和你的其他代码一起被推上去了。然后,只需上传一个自述文件或具有通用AndroidManifest.xml源代码的文件,任何人都必须将其复制并粘贴到AndroidManifest.xml文件中才能构建您的应用程序。这样,你就可以在你的应用程序中进行更改,根据需要构建它,然后不必在每次构建时都进行泛化,并推送到源代码控制中。

票数 1
EN

Stack Overflow用户

发布于 2020-03-29 03:09:48

我建议使用Gradle为不同的构建类型动态加载API密钥,如果没有找到,则加载一个虚拟密钥。这有一个好处,即CI可以在不需要真正的API密钥的情况下构建您的应用程序,但是您团队中的每个新开发人员都必须设置API密钥。

  1. gradle根文件夹中创建属性文件google-maps-api.properties。通过将此行 gradle/google-maps-api.properties 添加到您的.gitignore来忽略该文件,并输入以下两个属性:

代码语言:javascript
运行
复制
googleMapsApiKeyDebug=[YOUR_DEBUG_GOOGLE_MAPS_API_KEY_HERE]
googleMapsApiKeyRelease=[YOUR_RELEASE_GOOGLE_MAPS_API_KEY_HERE]

  1. 接下来在gradle根文件夹中创建以下google-maps-api-config.gradle文件。此Gradle文件将加载您在步骤1中创建的属性文件。

代码语言:javascript
运行
复制
ext {
    googleMapsApiConfig = new GoogleMapsApiConfigLogic(project)
}

/*
Before you run your application, you need a Google Maps API key.

Using these values:

Package name:
at.ict4d.covid19map

SHA-1 certificate fingerprint:
DE:4A:F0:B1:F5:F4:00:88:B6:E0:03:3E:31:1F:11:88:3F:43:0D:8B

Follow the directions here:
https://developers.google.com/maps/documentation/android/start#get-key

Once you have your key (it starts with "AIza") create a file with the name "google-maps-api.properties" in the gradle folder:
gradle/google-maps-api.properties

Put in 2 properties:
googleMapsApiKeyDebug:[THE KEY YOU JUST CREATED]
googleMapsApiKeyRelease:[YOUR RELEASE GOOGLE MAPS KEY] (if you are just developing and not planning to publish then fill in "YOUR_RELEASE_KEY_HERE")

"gradle/google-maps-api.properties" example:
googleMapsApiKeyDebug=AIzaFJKLJKsdLFDDsjlkdfDFJKLdjkf
googleMapsApiKeyRelease=YOUR_RELEASE_KEY_HERE

Sync your project and build.
*/

class GoogleMapsApiConfigLogic {

    public final keyGoogleMapsApiKeyDebug = "googleMapsApiKeyDebug"
    public final keyGoogleMapsApiKeyRelease = "googleMapsApiKeyRelease"
    private final configGoogleMapsApiPropsFileName = "gradle/google-maps-api.properties"

    public final props

    private final project

    GoogleMapsApiConfigLogic(project) {
        this.project = project
        this.props = loadGoogleMapsApiProperties()
    }

    def loadGoogleMapsApiProperties() {

        Properties propertiesObj

        if ((propertiesObj = loadFromProperties("$project.rootDir/$configGoogleMapsApiPropsFileName")) != null) {
            project.logger.quiet("google-maps-api-config: use local properties file for Google Maps API")
            return propertiesObj
        } else {
            propertiesObj = new Properties()
            propertiesObj.put(keyGoogleMapsApiKeyDebug, "YOUR_KEY_HERE")
            propertiesObj.put(keyGoogleMapsApiKeyRelease, "YOUR_KEY_HERE")
        }

        project.logger.quiet("google-maps-api-config: no API key found for Google Maps")
        return propertiesObj
    }

    def loadFromProperties(fileName) {
        Properties props = new Properties()
        File propFile = new File(fileName)

        if (propFile.exists()) {
            props.load(new FileInputStream(propFile))
            if (props.get(keyGoogleMapsApiKeyDebug) != null &&
                    props.get(keyGoogleMapsApiKeyRelease) != null) {
                project.logger.quiet("google-maps-api-config: use $fileName for Google Maps API")
                return props
            }
        } else {
            project.logger.quiet("google-maps-api-config: $propFile does not exist for Google Maps API")
        }
        return null
    }
}

  1. 将以下内容添加到app/build.gradle文件中:

代码语言:javascript
运行
复制
plugins {
    id 'com.android.application'
    id 'kotlin-android'
    id 'kotlin-android-extensions'
    // ...
}

apply from: "$rootDir/gradle/google-maps-api-config.gradle" // handles Google Maps API key

android {

   // ...

   buildTypes {
        release {

            // other config

            resValue "string", "google_maps_key", "\"${googleMapsApiConfig.props.getProperty(googleMapsApiConfig.keyGoogleMapsApiKeyRelease)}\""
        }

        debug {
            // other config

            resValue "string", "google_maps_key", "\"${googleMapsApiConfig.props.getProperty(googleMapsApiConfig.keyGoogleMapsApiKeyDebug)}\""
        }
    }

这将使用密钥google_maps_key和您的API key的值创建一个字符串资源。您可以删除任何其他API密钥引用,例如Android Studio生成以下文件:app/src/debug/res/values/google_maps_api.xmlapp/src/release/res/values/google_maps_api.xml -您可以删除它们。

  1. 将谷歌地图应用编程接口密钥添加到您的清单中:

代码语言:javascript
运行
复制
<application>

        <meta-data
            android:name="com.google.android.geo.API_KEY"
            android:value="@string/google_maps_key" />
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13979049

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档