Ответ 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 делает свою магию.