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

Когда я пытаюсь создать проект с тегом value of meta-data в качестве строковой ссылки, сбой выдает ошибку со следующей ошибкой:

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.

Обновлять

После записи в службу поддержки crashlytics:

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


person Dmytro Danylyk    schedule 06.09.2014    source источник
comment
Сделать это непросто, stackoverflow.com/questions/17465353/   -  person Yuraj    schedule 06.09.2014


Ответы (2)


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

  • # P2 #
    flavor1 {
        ...
        manifestPlaceholders = [crashlyticsApiKey: CRASHLYTICS_API_SECRET_HERE]
        ...
    }
    
  • # P3 #
    ...
    <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()
        }
    }
}
...

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

person a.bertucci    schedule 06.09.2014
comment
Спасибо за ответ, но это огромный обходной путь. Я бы предпочел создать AndroidManifest файл для всех вкусов с разными meta-data. - person Dmytro Danylyk; 07.09.2014
comment
Я думаю, вам не хватает основного момента: конечно, вы можете определить несколько манифестов, но вы можете определить там только ключ api. Вы вынуждены поместить секрет API в файл crashlytics.properties, который, к сожалению, находится в корне проекта, поэтому вы не можете определять его несколько раз. Также обратите внимание, что решение, которое я предложил, не является огромным обходным путем, но это именно то, что парень, который работает в Crashlytics, предложил мне сделать несколько месяцев назад. Надеюсь, они скоро изменят свой плагин gradle, так что мы сможем избежать этого ада, но до тех пор у нас нет других вариантов. - person a.bertucci; 07.09.2014
comment
Это все еще работает с последней версией плагина? У меня это не сработало. - person Islam Mustafa; 27.10.2014
comment
это очень хорошо. но вы можете просто определить ключ и секрет crashlytics в своем градиенте как глобальные переменные и использовать их для всех вариантов. - person Mars; 02.02.2015
comment
Вы правы, @Mars, для простого сценария вы можете избежать создания файла для каждого аромата, но это решение предназначено для перехвата более сложной конфигурации. - person a.bertucci; 02.02.2015
comment
для тех, кто использует Fabric, убедитесь, что вы изменили имена задач на Fabric, то есть: crashlyticsGenerateResources в fabricGenerateResources. хотя не смог найти ни одной задачи fabricCleanupResourcesAfterUpload ... любая идея, почему? - person idanakav; 28.04.2015
comment
@idaNakav, если вы используете Fabric, этот ответ устарел. Вам не нужно подключаться к задачам crashlytics, потому что файл свойств больше не нужен (учитывая, что секрет больше не является обязательным). - person a.bertucci; 02.05.2015
comment
@idaNakav Я только что обновил ответ выше, чтобы сообщить об изменениях в SDK Fabric и предложить решение, которое с этим работает. - person a.bertucci; 02.05.2015

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

person marienke    schedule 03.02.2017