Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/180.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在多模块项目中使用Firebase_Android_Firebase_Gradle_Android Gradle Plugin_Firebase Authentication - Fatal编程技术网

Android 在多模块项目中使用Firebase

Android 在多模块项目中使用Firebase,android,firebase,gradle,android-gradle-plugin,firebase-authentication,Android,Firebase,Gradle,Android Gradle Plugin,Firebase Authentication,我有一个多模块多风格的android项目,模块如下: coremodule,这是一个android库,包含常用的内容,包括库依赖项 authenticationmodule,顾名思义,是一个包含大量UI活动并负责对用户进行身份验证的模块。它也是具有启动器活动的模块 usermodule,这是另一个android库模块。它负责处理用户配置文件UI、用户数据以及Firebase数据库。但它还必须处理Firebase身份验证以获取Uid,因为它被用作数据库中的密钥 现在不相关的其他模块 模块core与

我有一个多模块多风格的android项目,模块如下:

  • core
    module,这是一个android库,包含常用的内容,包括库依赖项
  • authentication
    module,顾名思义,是一个包含大量UI活动并负责对用户进行身份验证的模块。它也是具有启动器活动的模块
  • user
    module,这是另一个android库模块。它负责处理用户配置文件UI、用户数据以及Firebase数据库。但它还必须处理Firebase身份验证以获取Uid,因为它被用作数据库中的密钥
  • 现在不相关的其他模块
  • 模块
    core
    与Firebase无关,只是将其作为其他模块的依赖项包含。所以我在我的项目中有这个
    build.gradle

    dependencies {
        classpath 'com.android.tools.build:gradle:3.2.0'
        classpath 'com.google.gms:google-services:4.1.0'
    }
    
    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'
    }
    
    dependencies {
        otherStuff
        implementation project(':core')
    }
    
    我的核心
    build.gradle中也有这个:

    dependencies {
        classpath 'com.android.tools.build:gradle:3.2.0'
        classpath 'com.google.gms:google-services:4.1.0'
    }
    
    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'
    }
    
    dependencies {
        otherStuff
        implementation project(':core')
    }
    
    用户
    模块除了导入
    核心
    库并立即使用身份验证之外,什么都不做。因此,在我的用户
    build.gradle中有以下内容:

    dependencies {
        classpath 'com.android.tools.build:gradle:3.2.0'
        classpath 'com.google.gms:google-services:4.1.0'
    }
    
    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'
    }
    
    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
    文件的模块。因此,它将其放在
    身份验证
    文件夹下

    它包括
    核心
    用户
    库,因此在我的身份验证
    构建中,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
    
    No matching client found for package name 'com.companyname.projectname.core'
    
    如果我也尝试复制
    core
    下的
    googleservices.json
    ,我会得到以下错误:

    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
    
    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的启动器活动。我还希望
    user
    和任何其他模块在此之后能够使用Firebase。向Firebase注册所有模块对我来说没有意义(甚至不确定是否可能,因为Firebase需要的是应用程序而不是库?!)。那么,有没有办法解决这个问题

    我成功地将firebase依赖项包装到库模块中,而不会污染主模块。以下是我所做的:

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

    如果您确定没有使用
    googleplayservices
    plugin提供的特殊功能,您可以删除它们

    然后,您可以按照本文的说明进行操作:

    更新:另一个链接

    因为该提供商只是读取具有已知名称的资源,所以另一种选择是直接将字符串资源添加到应用程序中,而不是使用Google Services gradle插件


    您可以将google-services.json文件放在flavor中,以便使用:-

    检查这个


    味道不是问题。这是模块造成的。杜威·里德的回答为我解决了这个问题。