Могу ли я отключить плагин Firebase для определенного вкуса?

В настоящее время я пробую аналитический костюм Firebase, но столкнулся с одной небольшой проблемой: мое приложение распространяется как в магазине Google Play, так и в магазине Amazon (который не поддерживает сервисы Google Play), поэтому для вкуса Amazon я хочу удалить зависимость от Firebase (что я уже знаю, как это сделать), но мне также нужно удалить плагин Firebase, чтобы он не выдавал исключение при сборке.

Это то, что у меня есть на данный момент:

productFlavors {
    google {
        applicationId 'google app id'
    }
    amazon {
        applicationId 'amazon app id'
    }
}

dependencies {
    googleCompile 'com.google.firebase:firebase-analytics:9.0.0'
    amazonCompile 'com.amazonaws:aws-android-sdk-mobileanalytics:2.2.12'
    amazonCompile('com.crashlytics.sdk.android:crashlytics:2.5.1@aar') {
        transitive = true;
    }
}

apply plugin: 'com.google.gms.google-services'

Но мне нужно удалить плагин, только если это вкус амазонки.

Это вообще возможно? Или, по крайней мере, есть что-то близкое, что я могу попробовать?

ОБНОВЛЕНИЕ:

По просьбе Стива я попробовал версию с Firebase на своих планшетах Amazon Kindle, и она работает, даже если на них не установлены службы Google Play.


person Jorge Aguilar    schedule 08.06.2016    source источник


Ответы (5)


Согласно ответу Стива, аналитика Firebase работает даже без сервисов Google Play. Но мы все еще можем отключить плагин служб Google для вкусов.

Попробуйте добавить такой код:

 apply plugin: 'com.google.gms.google-services'

 android.applicationVariants.all { variant ->
     if (!variant.name.contains("flavorName")) {
         project.tasks.each { t ->
             if (t.name.contains("GoogleServices")) {
                 // Remove google services plugin
                 variant.getVariantData().resourceGenTask.getTaskDependencies().values.remove(t);
                 // For latest gradle plugin use this instead
                 // variant.getVariantData().taskContainer.sourceGenTask.getTaskDependencies().getDependencies().remove(t)
             }
         }
     }
 }

Здесь я отключаю сервисы Google для всех вкусов, название которых не содержит «flavorName». Вы должны изменить условия в соответствии с вашими требованиями. И обратите внимание, что это должно быть добавлено после apply plugin: 'com.google.gms.google-services'. Надеюсь, поможет.

person Junyue Cao    schedule 27.09.2016
comment
похоже, это не удаляет разрешения, автоматически добавленные firebase (INTERNET, WAKE_LOCK, C2D_MESSAGE и т. д.). Есть ли что-нибудь еще, что я должен добавить в файл сборки? - person Angel Koh; 29.03.2017
comment
Привет, Ангел, возможно, нам следует удалить зависимости игровых сервисов для этих вариантов и убедиться, что в этих вариантах не используются игровые сервисы. - person Junyue Cao; 31.03.2017
comment
В конце концов, я использовал рекомендуемый здесь метод для удаления игровых сервисов - stackoverflow.com/a/39761871/908821 - person Angel Koh; 31.03.2017
comment
Я вижу первый комментарий к этому ответу, возможно, он не работает. - person Junyue Cao; 06.04.2017

Наконец-то я получил версию для работы с новым градиентом. Протестировано с помощью Gradle 4.6, инструментов сборки 3.0.1, плагина google-services 3.1.1.

apply plugin: 'com.google.gms.google-services'

android.applicationVariants.all { variant ->
    if (variant.name == 'someVariantNameYouDontwantFirebase') {
        project.tasks.getByName('process' + variant.name.capitalize() + 'GoogleServices').enabled = false
    }
}
person Jack Feng    schedule 15.03.2018
comment
Это приводит к тому, что мой вариант сборки не будет собран с нулевой ошибкой градиента, которую я никогда не видел за +3 года SD. - person Chisko; 16.03.2018
comment
Какие у вас версии инструментов gradle/plugin/build? @Чиско - person Jack Feng; 20.03.2018
comment
все последние версии - person Chisko; 21.03.2018
comment
@Chisko Извините, я добавил слишком много знаков равенства. Теперь должно быть хорошо, я думаю - person Jack Feng; 12.04.2018

Хотя Firebase официально не поддерживает устройства без сервисов Google Play, на самом деле Analytics должна работать на таких устройствах, поэтому вам может не понадобиться отключать Firebase (или удалять плагин) в вашей сборке Amazon. Вы уже пробовали?

person Steve Ganem    schedule 08.06.2016
comment
Я пошел дальше и все равно попробовал, и ему не удается отправить данные, потому что он не может сгенерировать идентификатор экземпляра, который ему нужен, и из того, что я понимаю, это потому, что для создания этого экземпляра ему нужны службы Google Play (которые все amazon устройства не установлены по умолчанию, вам нужно загрузить его, чтобы заставить его работать). - person Jorge Aguilar; 08.06.2016
comment
На самом деле это никак не влияет на сбор аналитики. - person Steve Ganem; 08.06.2016
comment
Хорошо, сегодня вечером я попробую подключить его к скрипачу, чтобы убедиться, что данные проходят через него. Спасибо. - person Jorge Aguilar; 09.06.2016
comment
это прошло, есть ли способ отключить все остальные вещи, чтобы он перестал пытаться генерировать этот идентификатор экземпляра? - person Jorge Aguilar; 09.06.2016
comment
Эта ошибка должна быть безобидной, но, скорее всего, она будет устранена в будущем обновлении SDK. - person Steve Ganem; 09.06.2016

Возможно, поскольку некоторые библиотеки сервисов Google Play еще необходимо включить в версию без firebase, некоторые записи, связанные с firebase, попадут в окончательный объединенный файл AndroidManifest.xml.

Таким образом, если в дополнение к удалению задач gradle, которые были добавлены плагином Google Services (как описано в ответе Junyue Cao), вы хотите удалить приемник, службу, поставщика, разрешение на использование или другие теги, связанные с Firebase, из окончательного объединенного AndroidManifest, вы можете добавить маркеры узлов в AndroidManifest.xml. находится в подкаталоге варианта приложения, конфигурации сборки или варианта сборки.

Если для маркеров узлов задано значение «удалить», соответствующие теги получателя, службы, поставщика и разрешений использования не будут присутствовать в окончательном объединенном файле AndroidManifest.xml.

Например, вот что вы можете добавить в AndroidManifest.xml в гипотетический исходный каталог проекта «nofirebase» (app/src/nofirebase/):

    <receiver
        android:name="com.google.firebase.iid.FirebaseInstanceIdInternalReceiver"
        tools:node="remove" />

    <receiver
        android:name="com.google.android.gms.measurement.AppMeasurementReceiver"
        tools:node="remove" />

    <receiver
        android:name="com.google.android.gms.measurement.AppMeasurementInstallReferrerReceiver"
        tools:node="remove" />

    <receiver
        android:name="com.google.firebase.iid.FirebaseInstanceIdReceiver"
        tools:node="remove" >
    </receiver>

    <service
        android:name="com.google.android.gms.measurement.AppMeasurementService"
        tools:node="remove" />

    <service
        android:name="com.google.firebase.iid.FirebaseInstanceIdService"
        tools:node="remove"/>

    <provider
        android:name="com.google.firebase.provider.FirebaseInitProvider"
        android:authorities="com.you.yourapp.firebaseinitprovider"
        tools:node="remove"/>
person albert c braun    schedule 15.06.2017
comment
Хорошая точка зрения. В любом случае элементы со временем меняются, поэтому лучше изучите объединенный манифест в app/build/intermediates/merged_manifests/<variant>/AndroidManifest.xml и добавьте любые элементы firebase/gms/crashlytics в манифест приложения с помощью tools:node="remove". - person Pointer Null; 15.10.2019

С ответами выше я получал сообщение об ошибке, что задача не существует (она была сгенерирована во время сборки?). Что сработало для меня, так это просто попросить задачи исправить себя. В моем случае я отключал Fabric в сборках UAT.

tasks.all {

        if (it.name.contains("Uat") && (
                it.name.contains("GoogleServices") ||
                it.name.contains("fabric"))
        ){
            it.enabled = false
        }

}
person robotoaster    schedule 03.05.2018