gpt4 book ai didi

android - 在多模块项目中使用 Firebase

转载 作者:行者123 更新时间:2023-11-29 00:56:27 25 4
gpt4 key购买 nike

我有一个多模块多口味的android项目,模块如下:

  1. core 模块,这是一个包含通用内容的 android 库,包括库依赖项。
  2. authentication模块,顾名思义,就是一个包含了一堆UI Activity,负责对用户进行认证的模块。它也是具有启动器 Activity 的模块。
  3. user模块,这是另一个android库模块。它负责处理用户配置文件 UI、用户数据以及 Firebase 数据库。但它还必须处理 Firebase 身份验证以获取 Uid,因为它用作数据库中的 key 。
  4. 目前不相关的其他模块

模块 core 对 Firebase 没有任何作用,只是将其作为其他模块的依赖项包含在内。所以我在我的项目 build.gradle 中有这个:

dependencies {
classpath 'com.android.tools.build:gradle:3.2.0'
classpath 'com.google.gms:google-services:4.1.0'
}

我的核心 build.gradle 中也有这个:

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

android {
compileSdkVersion 28
defaultConfig {
minSdkVersion 19
targetSdkVersion 28
versionCode 1
versionName "1.0"
otherstuff
}
otherStuff
}

dependencies {
otherStuff
api 'com.google.android.gms:play-services-base:16.1.0'
api 'com.google.firebase:firebase-core:16.0.6'
api 'com.google.firebase:firebase-auth:16.1.0'
api 'com.google.firebase:firebase-database:16.0.6'
api 'com.google.firebase:firebase-storage:16.0.5'
api 'com.hbb20:ccp:2.2.3'
api 'com.google.android.libraries.places:places:1.0.0'
}

user 模块除了导入core 库之外什么都不做,并立即使用身份验证。所以我的 user build.gradle 中有以下内容:

dependencies {
otherStuff
implementation project(':core')
}

然后我继续在我的类(class)中使用它,如下所示:

FirebaseAuth auth = FirebaseAuth.getInstance();

boolean isLoggedIn()
{
assert(auth != null);
return (auth.getCurrentUser() != null);
}

void uploadUserImpl()
{
assert(isLoggedIn());
db.getReference("users").child(auth.getCurrentUser().getUid()).setValue(this);
}

etc

authentication 模块是定义应用程序名称、启动器 Activity 等的模块。因此,至少在我看来,它也是应该具有 google-services 的模块.json 文件。所以它在 authentication 文件夹下。

它包括coreuser 库,所以在我的authentication build.gradle 我有以下内容:

dependencies {
otherStuff
implementation project(':core')
implementation project(':user')
}

它还会继续使用 Firebase 身份验证来登录和注册用户。

现在的问题:

尝试构建项目时,出现以下错误:

File google-services.json is missing. The Google Services Plugin cannot function without it. 
Searched Location:
/work/mewais/CompanyName/ProjectName/core/src/FlavorName/debug/google-services.json
/work/mewais/CompanyName/ProjectName/core/google-services.json

如果我也尝试复制 core 下的 google-services.json,我会收到以下错误:

No matching client found for package name 'com.companyname.projectname.core'

google-services.json 文件中的应用名称定义为:

"package_name": "com.companyname.projectname.appname"

这显然需要应用名称而不是 core

那么如何在这个设置中包含 Firebase 呢?我想保留在 core 中定义的 firebase 依赖项,因为多个模块将使用它。同时,authentication 是实际定义 appname 的那个,也是我开始使用 Firebase 的启动器 Activity 的那个。我还希望 user 和任何其他模块之后能够使用 Firebase。在 Firebase 中注册所有模块对我来说没有意义(甚至不确定是否可能,因为 Firebase 需要一个应用程序而不是一个库?!)。那么有没有办法解决这个问题?

最佳答案

我设法在不污染主模块的情况下将 firebase 依赖项包装到库模块中。这是我所做的:

google-play-services 插件要求包含它的模块具有 applicationId 及其 JSON 文件(否则将无法编译)。

如果您确定不使用 google-play-services 插件提供的特殊功能,您可以删除它们。

https://developers.google.com/android/guides/google-services-plugin

那么您可以按照本文的说明操作:

https://medium.com/@samstern_58566/how-to-use-firebase-on-android-without-the-google-services-plugin-93ecc7dc6c4

更新:另一个链接

https://firebase.google.com/docs/projects/multiprojects#support_multiple_environments_in_your_android_application

Because this provider is just reading resources with known names, another option is to add the string resources directly to your app instead of using the Google Services gradle plugin.

关于android - 在多模块项目中使用 Firebase,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54473616/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com