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

Crashlytics (Fabric) отдельные организации для вариантов применения (типы конструкций, вкусы продукта)

Это вопрос с ответами на вопрос, чтобы поделиться своими знаниями.

У меня есть проект с несколькими вкусами продукта, и я хочу интегрировать Fabric, используя отдельные организации для каждого продукта.

Я попытался интегрировать Fabric, используя Android Studio Fabric Plugin. Он добавляет

<meta-data
    android:name="io.fabric.ApiKey"
    android:value="DEFAULT_ORGANIZATION_API_KEY" />

в AndroidManifest.xml исходного набора main.

Я решил переписать эту запись в конкретных вариантах набора вариантов приложения:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <application>
        <meta-data
            android:name="io.fabric.ApiKey"
            android:value="SECOND_ORGANIZATION_API_KEY"
            tools:replace="android:value" />
    </application>
</manifest>

Затем я обнаружил, что плагин Fabric Gradle генерирует файл crashlytics.properties с тэгом api secret (секретный код AKA) во время сборки, и я должен включить этот файл в исходный элемент управления. Но этот файл перезаписывается каждый раз, когда я создаю конкретный вариант приложения, потому что секрет api уникален для каждого приложения.

Как я могу интегрировать Fabric, используя отдельные организации для каждого варианта приложения?

4b9b3361

Ответ 1

Во время создания команды fabricGenerateResources вызывается и ищет файл с именем fabric.properties со следующим содержимым:

apiSecret=YOUR_BUILD_SECRET
apiKey=YOUR_API_KEY

Таким образом, нам нужно создать файл fabric.properties до этого.

Я нашел это решение и немного изменил его, чтобы полностью поддерживать варианты приложений не только для создания типов.

Добавьте этот код в android раздел build.gradle:

File crashlyticsProperties = new File("${project.projectDir.absolutePath}/fabric.properties")
applicationVariants.all { variant ->
    variant.productFlavors.each { flavor ->
        def variantSuffix = variant.name.capitalize()
        def generatePropertiesTask = task("fabricGenerateProperties${variantSuffix}") << {
            Properties properties = new Properties()
            properties.put("apiKey", flavor.fabricApiKey)
            properties.put("apiSecret", flavor.fabricApiSecret)
            properties.store(new FileWriter(crashlyticsProperties), "")
        }

        def generateResourcesTask = project.tasks.getByName("fabricGenerateResources${variantSuffix}")
        generateResourcesTask.dependsOn generatePropertiesTask
        generateResourcesTask.doLast {
            println "Removing fabric.properties"
            crashlyticsProperties.delete()
        }
    }
}

Он выполняет итерации по вариантам приложений, и для каждого варианта приложения создает задачу, которая генерирует файл fabric.properties и задачу, которая удаляет этот файл после того, как плагин Fabric Gradle генерирует ресурсы приложения.

Теперь вам нужно определить вкус продукта или тип сборки fabricApiKey и fabricApiSecret:

productFlavors {
    flavor1 {
        ext.fabricApiKey = "FLAVOR1_API_KEY"
        ext.fabricApiSecret = "FLAVOR1_API_SECRET"
    }
}

ext - это объект ExtraPropertiesExtention, предоставляемый каждым ExtensionAware. Он позволяет добавлять новые объекты к существующему объекту. В моем случае flavor1 есть объект ExtensionAware, и его можно расширить с помощью новых свойств, используя синтаксис ext.someProperty = "value", и позже эти свойства могут использоваться как flavor.someProperty, flavor.fabricApiKey.

Также лучше включить fabric.properties в .gitignore.

И не забудьте удалить ext.enableCrashlytics = false из типа сборки отладки, если вы использовали его для отключения Crashlytics во время отладки. Вместо этого вы можете отключить его в Application.onCreate:

Fabric.with(this, new Crashlytics.Builder().core(
    new CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build()).build());

Ответ 2

Если вы не против использования суффикса идентификатора приложения, вам не нужны отдельные организации. Аварии и ответы будут рассматриваться как отдельные приложения.

Например, пусть мой идентификатор приложения io.example

В вашем файле build.gradle:

buildTypes {
  debug {
    applicationIdSuffix ".debug"
  }
  release {
    //options
  }
}

После развертывания отладочной версии на устройстве или эмуляторе на сайте Fabric вы увидите два приложения:

  • io.example
  • io.example.debug

Одна вещь, которая хороша в этом подходе, заключается в том, что вы также можете отслеживать другие варианты сборки: io.exmaple.free, io.exmaple.paid, io.example.exterprise и т.д.