24

我目前正在做一个 Android 项目,并学习如何使用 git。由于 git 的问题,我被阻止了:我在我的 android-manifest 文件中声明了我的 Google Maps api 密钥:

<meta-data
    android:name="com.google.android.maps.v2.API_KEY"
    android:value="HEREISMYKEY"/>

现在,我想在 github 中推送我的代码,但我无法推送我的 AndroidManifest,因为它包含我的 api 密钥(应该保密)。

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

感谢您的帮助 !

4

4 回答 4

39

在你的 res/values 中创建一个新的 *.xml 文件(调用它api-keys.xml或类似的东西)。

更改清单以指向此字符串:

 <meta-data
    android:name="com.google.android.maps.v2.API_KEY"
    android:value="@string/GoogleMapsKey"/>

当您第一次向公众推送您的更改时,请输入一个虚拟密钥。

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

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

于 2012-12-21T14:46:53.860 回答
1

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

  1. google-maps-api.properties在根文件夹中创建一个属性文件gradle通过将此行添加gradle/google-maps-api.properties到您的 .gitignore并输入以下 2 个属性来忽略该文件:
googleMapsApiKeyDebug=[YOUR_DEBUG_GOOGLE_MAPS_API_KEY_HERE]
googleMapsApiKeyRelease=[YOUR_RELEASE_GOOGLE_MAPS_API_KEY_HERE]
  1. google-maps-api-config.gradle接下来在您的根文件夹中创建以下文件gradle。此 Gradle 文件将加载您在步骤 1 中创建的属性文件。
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文件中:
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 密钥的密钥和值创建一个字符串资源。您可以删除任何其他 API 密钥引用,例如 Android Studio 生成以下文件:app/src/debug/res/values/google_maps_api.xml并且app/src/release/res/values/google_maps_api.xml- 您可以删除它们。

  1. 将 Google Maps API 密钥添加到您的清单中:
<application>

        <meta-data
            android:name="com.google.android.geo.API_KEY"
            android:value="@string/google_maps_key" />
于 2020-03-28T19:09:47.570 回答
0

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

于 2012-12-20T20:03:42.907 回答
0

我过去处理类似问题的方法是使用我的 git 存储库中的特定分支进行公共推送。

假设您在清单中有一个本地主分支,其中包含您的密钥。当您准备好推送到 github(或其他任何地方)时,您可以创建一个没有历史记录的新“发布”分支。您可以在这里看到更多相关信息:如何在没有历史的情况下推送新分支 git branch --orphan release。删除所有私人信息后,提交所有文件并仅将该分支推送到 github git push origin release

这个问题是你不会有提交历史,也许其他人可以想出更好的东西。

于 2012-12-20T20:09:07.643 回答