![](/img/trans.png)
[英]Declaring flavor dependencies in multi-module project using gradle DSL
[英]Using Firebase in a multi-module project
我有一个多模块多口味的android项目,模块如下:
core
模块,这是一个 android 库,其中包含常见的东西,包括库依赖项。authentication
模块,顾名思义,一个包含一堆UI活动的模块,负责对用户进行身份验证。 它也是具有启动器活动的模块。user
模块,这是另一个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'
}
我的核心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
然后您可以按照本文的说明进行操作:
由于此提供程序只是读取具有已知名称的资源,因此另一种选择是将字符串资源直接添加到您的应用程序中,而不是使用 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.