Intereting Posts
Как проверить загрузку и выгрузку скорости Wi-Fi / 3g? Почему элемент управления Spinner все еще отображает информацию о подсказке, даже если событие setOnItemSelectedListener после setSelection? Предупреждение: этот <FrameLayout> можно заменить тегом <merge> Просмотр кеширования для верхних и нижних колонтитулов в виде списка ImageView – нарисовать полупрозрачный цвет сверху для его сфокусированного состояния? Как кэшировать android.graphics.path или Bitmap при использовании Overlays? Содержимое для чтения / загрузки Android EPUBLIB CardView для Android не импортирует Sugar ORM listAll () не показывает никаких данных Запустить скрипт как root через ADB Интеграция Android Studio (Beta v0.8.6) и SQLCipher (v3.1.0) GetWritableDatabase, называемая рекурсивно Как запустить метод в одно и то же время на 2 устройствах Как создавать файловые каталоги и папки в файловой системе данных данных / данных / проекта Android Отображать подпункты и заголовки ListView

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 support@crashlytics.com 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.

Обновить

После написания справки:

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

Solutions Collecting From Web of "Crashlytics обнаружил неверный ключ API"

Изменить: принятое решение работает только в том случае, если вы используете старую версию Crashlytics (я использовал v1.1.11). Если вы используете Fabric SDK, вы заметите, что задачи плагина значительно изменились, а сценарий ниже не будет работать. Кроме того, секрет 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 в 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() } } } ... 

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

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