Подтвердить что ты не робот

Crashlytics обнаружил неверный ключ API

Когда я пытаюсь построить проект с тегом value тега meta-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 [email protected] for assistance.

Не работает

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

Работы

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

Я хочу определить разные ключи внутри string.xml для разных productFlavors моего проекта Android.

Update

После написания команды crashlytics:

В настоящее время мы можем оценить файл AndroidManifest.xml во время сборки, чтобы мы не смотрели на какие-либо ресурсы строк, поэтому мы поддерживаем только строчную кодированную строку. Я определенно расскажу об этом с командой, которая вам интересна, поэтому мы можем заручиться поддержкой этого в будущей версии.

4b9b3361

Ответ 1

Изменить: Принятое решение работает только в том случае, если вы используете старую версию из Crashlytics (я использовал v1.1.11). Если вы используете Fabric SDK, вы заметите задачи плагина значительно изменились, а script ниже не будет работать. Кроме того, секрет API больше не нужен, поэтому вы можете просто использовать <meta> в манифесте, чтобы указать ключ API вместе с манифестным заполнителем, определенным в вашем вкусе:

  • в build.gradle:

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

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

Существует еще один недокументированный способ указать ключ Crashlytics как указанный здесь, и он должен использовать crashlytics.properties (в корне вашего проекта), чтобы указать это значение наряду с секретностью API:

apiKey=YOUR_API_KEY
apiSecret=YOUR_API_SECRET

К сожалению, это не позволит вам просто указать другой crashlytics.properties для каждого аромата, потому что он должен быть в корне вашего проекта, чтобы правильно подобрать плагин gradle. Это означает, что вам нужно генерировать этот файл динамически. Идея состоит в том, чтобы добавить ключевые/секретные значения в свой вкус в качестве пользовательских свойств и сгенерировать crashlytics.properties во время сборки, используя значения из текущего вкуса, чтобы заполнить файл.

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

В основном script перехватывает процесс построения и генерирует/заполняет файл свойств непосредственно перед тем, как плагин Crashlytics gradle делает свою магию.

Ответ 2

С тканью Crashlytics 2.6.6. Я могу просто выбрать вариант сборки из меню (обычно расположенного слева в Android Studio) и запустить приложение. Проходит минутка или около того, чтобы перейти на панель инструментов Fabric, но мне не было необходимости в обходном пути.