繁体   English   中英

在多模块项目中使用 Firebase

[英]Using Firebase in a multi-module project

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

  1. core模块,这是一个 android 库,其中包含常见的东西,包括库依赖项。
  2. authentication模块,顾名思义,一个包含一堆UI活动的模块,负责对用户进行身份验证。 它也是具有启动器活动的模块。
  3. user模块,这是另一个android库模块。 它负责处理用户配置文件 UI、用户数据以及 Firebase 数据库。 但它还必须处理 Firebase 身份验证才能获取 Uid,因为它在数据库中用作密钥。
  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库之外什么都不做,并立即使用身份验证。 所以我的用户build.gradle有以下build.gradle

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

然后我继续在我的课程中使用它,如下所示:

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

它包括core库和user库,因此在我的身份验证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 ,也是有在我开始使用火力地堡发射活动之一。 我还希望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

由于此提供程序只是读取具有已知名称的资源,因此另一种选择是将字符串资源直接添加到您的应用程序中,而不是使用 Google 服务 gradle 插件。

您可以将 google-services.json 文件放入风味编码中以使用:-

检查此链接

android {
 // set build flavor here to get the right gcm configuration.
    //def myFlavor = "flavor1"
    def myFlavor = "flavor2"

    if (myFlavor.equals("flavor1")) {
        println "--> flavor1 copy!"
        copy {
            from 'src/flavor1/'
            include '*.json'
            into '.'
        }
    } else {
        println "--> flavor2 copy!"
        copy {
            from 'src/flavor2/'
            include '*.json'
            into '.'
        }
    }

    // other stuff
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM