Android 我可以为特定的口味禁用Firebase插件吗?

Android 我可以为特定的口味禁用Firebase插件吗?,android,firebase,android-gradle-plugin,gradle-plugin,firebase-analytics,Android,Firebase,Android Gradle Plugin,Gradle Plugin,Firebase Analytics,我目前正在试用Firebase analytics套装,但是,我遇到了一个小问题,我的应用程序同时在google play和amazon store(不支持google play服务)上发布,因此对于amazon风格,我想删除对Firebase的依赖性(我已经知道怎么做),但是,我还需要删除Firebase插件,这样它在构建时不会抛出异常 这就是我目前所拥有的: productFlavors { google { applicationId 'google app id'

我目前正在试用Firebase analytics套装,但是,我遇到了一个小问题,我的应用程序同时在google play和amazon store(不支持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'
但是,我需要删除插件只有当是亚马逊风格

这可能吗?或者至少我可以尝试一些接近的东西

更新:


根据史蒂夫的要求,我在亚马逊Kindle平板电脑上试用了Firebase版本,即使没有安装Google Play服务,Firebase也能正常工作。

尽管Firebase不正式支持没有Google Play服务的设备,事实上,分析应该可以在这样的设备上工作,因此您可能实际上不需要在Amazon构建中禁用Firebase(或删除插件)。你试过了吗?

根据史蒂夫的回答,Firebase analytics即使没有谷歌也能工作 播放服务。但我们仍然可以禁用谷歌服务插件 口味

尝试添加如下代码:

 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)
             }
         }
     }
 }
在这里,我禁用谷歌服务的所有口味,他们的名字 不包含“flavorName”。您应该修改这些条件以适应 你的要求并请注意,这应该添加在
应用插件:“com.google.gms.google服务”
。希望能有帮助


由于某些Google Play服务库仍然需要包含在firebase free flavor中,因此某些firebase相关条目最终可能会包含在最终合并的AndroidManifest.xml中

因此,如果除了删除Google服务插件添加的gradle任务(如曹俊月的回答所述),您还想从最终合并的AndroidManifest中删除Firebase相关的接收者、服务者、提供者、使用权限或其他标记,您可以将其添加到应用程序中的AndroidManifest.xml中,生成配置或生成变量子目录

如果将节点标记设置为“删除”,则最终合并的AndroidManifest.xml中将不存在相应的接收方、服务、提供者、用户权限标记

例如,以下是您可以添加到项目假设的“nofirebase”风格源目录(app/src/nofirebase/)中的AndroidManifest.xml中的内容:


我终于找到了一个新版本,可以与new gradle一起使用。使用Gradle4.6、构建工具3.0.1、谷歌服务插件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 } } 应用插件:“com.google.gms.googleservices” android.applicationVariants.all{variant-> 如果(variant.name=='someVariantNameYouDontwantFirebase'){ project.tasks.getByName('process'+variant.name.capitalize()+'GoogleServices')。enabled=false } }
根据上面的答案,我收到一个错误,任务不存在(?它是在构建过程中生成的?)。对我有效的方法是简单地要求任务自我纠正。在我的例子中,我禁用了UAT构建上的结构

tasks.all {

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

}

我继续尝试了一下,但它没有发送数据,因为它无法生成所需的实例id,从我收集的信息来看,这是因为它需要Google Play服务来生成该实例(默认情况下,所有amazon设备都没有安装该实例,为了使其正常工作,您需要侧载它).这实际上对分析收集没有影响。好的,我今晚会尝试将其插入fiddler,以确保数据正常。谢谢。问题解决了,有没有办法禁用所有其他东西,使其停止尝试生成该实例id?该错误应该是无害的,但可能会在将来的SDK更新中解决。这似乎不会删除firebase自动添加的权限(INTERNET、WAKE_LOCK、C2D_消息等)。还有什么我应该添加到构建文件中的吗?嗨,安吉尔,也许我们应该删除这些风格的播放服务依赖项,并确保这些风格中没有使用任何播放服务。最后,我使用这里推荐的方法删除播放服务-我看到了答案的第一条注释,也许它不起作用。这会导致我的构建变体没有生成一个空的gradle错误,我在+3年的SD中从未见过。你的gradle/plugin/build工具版本是什么@一切都是最新的versions@Chisko对不起,我加了太多的等号。现在应该很好了,我想这是一个很好的观点。无论如何,项目会随着时间的推移而变化,因此最好在
app/build/intermediates/merged_manifests//AndroidManifest.xml
中研究合并的清单,并使用
工具:node=“remove”
将任何firebase/gms/crashlytics项目添加到应用程序的清单中。
tasks.all {

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

}