web-dev-qa-db-fra.com

Crashlytics a trouvé une clé API non valide

Lorsque j'essaie de créer un projet avec value de meta-data tag comme référence de chaîne, les crashlytics échouent avec l'erreur suivante:

Crashlytics found an invalid API key: @string/crashlytics. 
Check the Crashlytics plugin to make sure that the application has been added successfully! 
Contact [email protected] for assistance.

ne fonctionne pas

<meta-data
    Android:name="com.crashlytics.ApiKey"
    Android:value="@string/crashlytics"/>

Fonctionne

<meta-data
    Android:name="com.crashlytics.ApiKey"
    Android:value="1234567890..."/>

Je veux définir différentes clés à l'intérieur de string.xml pour différents productFlavors de mon Android.

Mettre à jour

Après avoir écrit sur le support crashlytics:

Actuellement, nous ne pouvons évaluer le fichier AndroidManifest.xml qu'au moment de la construction, nous ne regardons donc aucune ressource de chaînes, nous ne prenons donc en charge qu'une chaîne codée en dur. Je vais certainement partager cela avec l'équipe qui vous intéresse afin que nous puissions envisager de prendre en charge cela dans une prochaine version.

30
Dmytro Danylyk

Edit: La solution acceptée ne fonctionne que si vous utilisez une ancienne version de Crashlytics (j'utilisais la v1.1.11). Si vous utilisez Fabric SDK, vous remarquerez que les tâches du plugin ont considérablement changé et que le script ci-dessous ne fonctionnera pas. De plus, le secret de l'API n'est plus nécessaire, vous pouvez donc simplement utiliser le <meta> dans le manifeste pour spécifier la clé API avec un espace réservé de manifeste défini dans votre version:

  • dans build.gradle :

    flavor1 {
        ...
        manifestPlaceholders = [crashlyticsApiKey: CRASHLYTICS_API_SECRET_HERE]
        ...
    }
    
  • dans AndroidManifest.xml :

    ...
    <meta-data
        Android:name="com.crashlytics.ApiKey"
        Android:value="${crashlyticsApiKey}" />
    ...
    

Il existe un autre moyen non documenté de spécifier la clé Crashlytics comme noté ici , et c'est d'utiliser le crashlytics.properties (à la racine de votre projet) pour spécifier cette valeur avec le secret de l'API:

apiKey=YOUR_API_KEY
apiSecret=YOUR_API_SECRET

Malheureusement, cela ne vous permettra pas de spécifier simplement un autre crashlytics.properties pour chaque saveur, car il doit être à la racine de votre projet pour être correctement sélectionné par le plugin gradle. Cela signifie que vous devez générer ce fichier dynamiquement . L'idée est d'ajouter les valeurs clés/secrètes dans votre saveur en tant que propriétés personnalisées et de générer le crashlytics.properties au moment de la construction, en utilisant les valeurs de la saveur actuelle pour remplir le fichier.

Le build.gradle à l'intérieur de votre Android devrait ressembler à ceci:

...
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()
        }
    }
}
...

Fondamentalement, le script s'accroche au processus de construction et génère/remplit le fichier de propriétés juste avant que le plugin Crashlytics gradle ne fasse sa magie.

52
a.bertucci

Avec Crashlytics de Fabric 2.6.6. Je peux simplement sélectionner une variante de construction dans le menu (généralement situé à gauche dans Android Studio) et exécuter l'application. Il faut environ une minute pour se propager au tableau de bord Fabric. , mais je n'ai pas eu besoin d'une solution de contournement.

0
marienke