Android 在多模块项目中使用Firebase
我有一个多模块多风格的android项目,模块如下: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与
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中,以便使用:-
检查这个
味道不是问题。这是模块造成的。杜威·里德的回答为我解决了这个问题。