Firebase支持库依赖冲突的解决方法(针对即时应用)

6
我正在尝试将即时应用程序实现到使用Firebase数据库的项目中。我针对SDK版本27进行目标设置,因此支持库的版本为27.0.2
Firebase数据库版本为11.8.0,gms版本为3.1.0。当我尝试同步时,会出现以下错误:
Android dependency 'com.android.support:support-v4' has different 
version for the compile (25.2.0) and runtime (27.0.2) classpath. You 
should manually set the same version via DependencyResolution

我能够通过在安装即应用程序之前显式添加以下依赖项来解决这个问题。

implementation 'com.android.support:support-v4:27.0.2'
implementation 'com.android.support:support-media-compat:27.0.2'

但是使用即时应用程序时,即使我将它们放在特征模块(app-base)中,当我尝试构建实际应用程序(com.android.application)时,我仍然会遇到相同的错误。

我可以通过将那些冲突的依赖项移动到应用程序模块gradle文件中来解决问题,这样同步就成功了,但接下来我又面临另一个问题,这次是与清单合并相关的,这会阻止应用程序找到启动器活动:

来自AndroidManifest.xml:10:13-72的属性provider#com.google.firebase.provider.FirebaseInitProvider@authorities 的值(com.iamkaan.packagename.firebaseinitprovider)也存在于AndroidManifest.xml:33:350-423的值(com.iamkaan.packagename.base.firebaseinitprovider)。 建议:在AndroidManifest.xml:8:9-12:39的元素中添加“tools:replace="android:authorities"”,以覆盖。应用程序主清单(此文件),第9行

最后一个问题与firebase-core依赖关系有关,因为当我从以下更改我的应用程序gradle依赖关系时:

implementation project(':app-base')

to

implementation (project(':app-base')) {
    exclude group: 'com.google.firebase', module:'firebase-core'
}

我成功运行了应用程序。但是在运行时(第一次调用)我开始收到以下错误信息:
Default FirebaseApp is not initialized in this process com.iamkaan.packagename. Make sure to call FirebaseApp.initializeApp(Context) first

实际上,直到应用程序实现“即时应用程序”之前,并没有调用,但是它仍然在工作。无论如何,在第一个FirebaseDatabase调用之前,我在各个地方添加了调用,但没有起作用。

包名

  • 应用程序清单: com.iamkaan.packagename
  • 应用程序gradle应用程序ID: com.iamkaan.packagename
  • 应用程序基础清单: com.iamkaan.packagename.base
  • 应用程序基础gradle文件没有applicationId

这可能与此有关,但即使您成功构建了项目,您可能会遇到更多问题。https://groups.google.com/forum/#!topic/firebase-talk/EAF4KZsB7I0 - Doug Stevenson
你安装的应用程序和即时应用程序在AndroidManifest.xml中的包名是什么? - dazza5000
将以下与编程相关的内容从英语翻译成中文。返回仅已翻译的文本: 在问题末尾添加所有软件包名称。 - iamkaan
请参考这个答案:https://dev59.com/OKXja4cB1Zd3GeqPXNbM#46776897 - dchai
你能否检查一下https://github.com/googlesamples/android-instant-apps/tree/master/analytics,它可能对你有所帮助。 - Prags
当我将目标版本设置为27,添加了支持库27.0.2、Firebase 11.8.0和gms 3.1.0时,并没有出现任何错误。您能提供您的gradle文件依赖项和版本值吗? - TWL
2个回答

2
我遇到了类似的问题,这是由于依赖项包含支持库所致。需要注意的是,几乎所有的Google/Android支持库(CardView、RecyclerView等)都包括最新的v4和v7支持库,因此通常会引起冲突。
你需要做的是:
  1. 在主应用程序中添加基础模块时不要排除任何内容,即仅使用 implementation project(':app-base')
  2. 在基础模块的 build.gradle 中,对包含的支持库使用 api 而不是 implementation,例如 api 'com.android.support:support-v4:27.0.2'
  3. 确保在基础模块中添加的任何库都不会再次添加到主应用程序的 build.gradle 文件中
  4. 最重要的是:对于主应用程序和基础模块的每个项目,在其 build.gradle 文件中都要排除支持库(参见下面的示例)

 

api('com.android.support:support-media-compat:27.0.2') {
    exclude group: 'com.android.support'
}
api('com.android.support:support-v7:27.0.2') {
    exclude group: 'com.android.support'
}

我还建议不要使用com.android.support:support-v7:27.0.2,而是仅使用您需要的支持库中的特定项。请参见Support Library Packages以了解如何仅添加支持库中的特定项。


排除可能会导致应用程序中使用不同版本的支持库。这可能会产生意想不到的副作用,因此不建议这样做。 - Ben Weiss
@keyboardsurfer 排除操作只针对少量依赖项进行时会导致不同的版本。如果应用于所有依赖项,则可能会导致缺失依赖项编译错误,可以通过包含它们来解决,但不能包含不同版本,因为所有支持库中的任何内容都是显式包含的。此外,如果没有进行排除操作,则仅v4和v7就占用了2+ MB的空间,这是允许的即时应用程序限制(4MB)的50%以上的大小。 - adnanyousafch

0

试试这个。 SDK 是28

implementation ('com.google.firebase:firebase-core:16.0.6'){
    exclude module: 'support-media-compat'
    exclude module: 'support-v4'
}
implementation 'com.android.support:support-v4:28.0.0'
implementation 'com.android.support:support-media-compat:28.0.0'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接