【问题标题】:Firebase support library dependency conflict for instant apps即时应用的 Firebase 支持库依赖冲突
【发布时间】:2018-01-17 02:55:03
【问题描述】:

我正在尝试将即时应用程序实施到使用 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 value=(com.iamkaan.packagename.firebaseinitprovider) 也存在于 AndroidManifest.xml:33:350- 423 值=(com.iamkaan.packagename.base.firebaseinitprovider)。建议:将 'tools:replace="android:authorities"' 添加到 AndroidManifest.xml:8:9-12:39 的元素以覆盖。应用程序主清单(此文件),第 9 行

最后一个问题在某种程度上与 firebase-core 依赖关系有关,因为当我从

更改我的应用程序 gradle 依赖关系时
implementation project(':app-base')

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

我能够运行该应用程序。但是这一次,我开始在运行时收到以下错误(第一次调用FirebaseDatabase.getInstance()

Default FirebaseApp is not initialized in this process com.iamkaan.packagename. Make sure to call FirebaseApp.initializeApp(Context) first

在即时应用程序实施之前,它确实没有被调用,但无论如何都没有被调用。无论如何,我在第一次 FirebaseDatabase 调用之前将调用添加到各个地方,没有任何帮助。

包名称

  • 应用清单:com.iamkaan.packagename
  • app gradle applicationId: com.iamkaan.packagename
  • 应用基础清单:com.iamkaan.packagename.base
  • app-base gradle 文件没有 applicationId

【问题讨论】:

标签: android firebase firebase-realtime-database android-gradle-plugin android-instant-apps


【解决方案1】:

我遇到了类似的问题,这是由依赖项包含的支持库引起的。需要注意的是,几乎所有的 Google/Android 支持库(CardView、RecyclerView 等)都包含最新的 v4 和 v7 支持库。所以这通常会导致冲突。

你需要做的是:

  1. 在主应用程序中添加基本模块时不要排除任何内容,即仅继续使用implementation project(':app-base')
  2. 使用api 而不是implementation 来支持基本模块的build.gradle 中包含的库,即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,了解如何仅添加支持库中的特定项目。

【讨论】:

  • 排除项可能会导致您的应用程序中有不同版本的支持库。这可能会产生不必要的副作用,因此不推荐。
  • @keyboardsurfer 如果仅对少数依赖项进行排除,则会导致不同的版本。如果全部完成,则可能会导致缺少依赖项编译错误,这可以通过包含它们而不是不同的版本来解决,因为支持库中的所有内容都被明确包含在内。此外,如果没有排除,那么只有 v4 和 v7 占用 2+ MB 的空间,这是允许的 Instant App 限制 (4MB) 大小的 50+%
【解决方案2】:

试试这个。 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'

【讨论】:

    猜你喜欢
    • 2017-05-24
    • 1970-01-01
    • 2018-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多