Crashlytics发现了一个无效的API密钥

Dmy*_*lyk 30 android gradle crashlytics android-studio android-gradle-plugin

当我试图与建设项目valuemeta-data标签为字符串参考,crashlytics失败,以下错误:

Crashlytics found an invalid API key: @string/crashlytics. 
Check the Crashlytics plugin to make sure that the application has been added successfully! 
Contact support@crashlytics.com for assistance.
Run Code Online (Sandbox Code Playgroud)

不行

<meta-data
    android:name="com.crashlytics.ApiKey"
    android:value="@string/crashlytics"/>
Run Code Online (Sandbox Code Playgroud)

作品

<meta-data
    android:name="com.crashlytics.ApiKey"
    android:value="1234567890..."/>
Run Code Online (Sandbox Code Playgroud)

我想里面定义不同的密钥string.xml对不同的productFlavors我的Android项目.

更新

写完崩溃支持后:

目前我们只能在构建时评估AndroidManifest.xml,因此我们不查看任何字符串资源,因此我们只支持硬编码字符串.我肯定会与你感兴趣的团队分享这个,所以我们可以在将来的版本中考虑支持这个.

a.b*_*cci 52

编辑:只有在使用旧版本的Crashlytics(我使用的是v1.1.11)时,接受的解决方案才有效.如果您使用的是Fabric SDK,您会注意到插件的任务已经发生了很大变化,下面的脚本将无法使用.此外,不再需要API密钥,因此您只需使用<meta>清单中的API来指定API密钥以及在您的风格中定义的清单占位符:

还有另一种未记录的方法来指定Crashlytics密钥,如此处所述,它是使用crashlytics.properties(在项目的根目录中)指定该值以及API密钥:

apiKey=YOUR_API_KEY
apiSecret=YOUR_API_SECRET
Run Code Online (Sandbox Code Playgroud)

不幸的是,这不允许您crashlytics.properties为每种风格简单地指定不同的风格,因为它需要位于项目的根目录中才能被gradle插件正确选取.这意味着您需要动态生成该文件.我们的想法是将您的风格中的键/密钥值添加为自定义属性,并crashlytics.properties使用当前flavor中的值来生成at buildtime,以填充文件.

build.gradle你的Android模块内部应该是这样的:

...
productFlavors {

    flavor1 {
        ...
        set("crashlyticsApiKey", CRASHLYTICS_API_KEY_HERE)
        set("crashlyticsApiSecret", CRASHLYTICS_API_SECRET_HERE)
        ...
    }
    ...
}

File crashlyticsProperties = new File("${project.projectDir.absolutePath}/crashlytics.properties")
applicationVariants.all { variant ->
    variant.productFlavors.each { flavor ->
        def variantSuffix = variant.name.capitalize()
        def generateResourcesTask = project.tasks.getByName("crashlyticsGenerateResources${variantSuffix}")
        def generatePropertiesTask = task("crashlyticsGenerateProperties${variantSuffix}") << {
            Properties properties = new Properties()
            println "...copying apiSecret for ${variant.name}"
            properties.put("apiSecret", flavor.crashlyticsApiSecret)
            println "...copying apiKey for ${variant.name}"
            properties.put("apiKey", flavor.crashlyticsApiKey)
            properties.store(new FileWriter(crashlyticsProperties), "")
        }
        generateResourcesTask.dependsOn generatePropertiesTask
        def cleanResourcesTask = project.tasks.getByName("crashlyticsCleanupResourcesAfterUpload${variantSuffix}")
        cleanResourcesTask.doLast {
            println "...removing crashlytics.properties"
            crashlyticsProperties.delete()
        }
    }
}
...
Run Code Online (Sandbox Code Playgroud)

基本上,脚本挂钩在构建过程中,并在Crashlytics gradle插件发挥其魔力之前生成/填充属性文件.