Intereting Posts
Android. Используйте WebView для оценки строки javascript и возврата значения. Android Wear – начните работу с переносного действия Выберите несколько элементов из списка и измените цвет только выбранного элемента. Сделать первый элемент списка ListView в другом макете Создан BroadcastReceiver, который отображает имя приложения и номер версии при установке / удалении любого приложения? Как запустить сканирование массового режима в zxing Дооснащение и OkHttpClient, тайм-аут соединения catch в методе отказа Как угаснуть край TextView в Android? Как перехватить нагрузки URL в WebView (android)? Android: хронометр как постоянный секундомер. Как установить время начала? Что такое хронометр «База»? Каков правильный способ использования AudioTrack в статическом режиме? Создание активности появляется только один раз, когда приложение запускается Поддержка тестирования модулей Android не работает в библиотечных модулях Android Отображение нелинейной структуры данных, такой как дерево в Android View Скрыть системную панель в Jelly Bean Tablet (Rooted)

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, но мне не нужно было обходного пути.