4

简短的问题

如何更改库模块中调试发布构建类型的包名称?

上下文

在具有 MVP + Clean 架构的 Android 项目中,我们在库模块中有存储库模式。我们希望在具有两个环境(开发和生产)的库中包含 Firebase。

我已经在 Firebase (com.example.comcom.example.com.dev) 中创建了项目,然后将相应的项目下载google-services.json到 src/main 和 src/debug 文件夹。

Gradle google-services插件使用google-services.json中定义的客户端 ID 验证模块包名称,但 Android 限制applicationId在库中更改(我找不到技术原因)

我尝试过的事情

  • 有两个具有不同包属性的 AndroidManifest.xml。com.example.com在 src/main 和com.example.com.devsrc/debug/ 但第二个它只是被忽略
  • manifest.srcFile在 Gradle sourceSets 中设置。运行时文件在列表中,./gradlew sourceSets但包名没有改变
  • 库模块中有两种不同的风格,并为每种风格设置不同的清单。无论如何,包装不会改变。

目前我只有两个合适的解决方案: 1. 将 Firebase 设置和实现保留在存储库之外的 app 模块中。2. Firebase 只有一个环境。

非常感谢任何帮助或建议。

编辑

考虑到我需要在模块(库)中修改包,而不是在应用程序中。由于某些奇怪的原因,当我尝试使用applicationIdSuffixapplicationId在模块中时,Gradle 会显示此错误:

错误:库项目无法设置 applicationIdSuffix。

4

2 回答 2

1

库项目不能设置 applicationId。

这是 Android Library 项目的设计行为。

库模块中有两种不同的风格,并为每种风格设置不同的清单。无论如何,包装不会改变。

可能您需要将Build Variants更改为特定的风味/构建类型,然后您才能看到更新的包名称生效。

请参见下面的屏幕截图。

在此处输入图像描述

于 2018-10-04T05:22:04.113 回答
0

我花了一些时间调查并尝试不同的替代方案,以在库模块中为每种风格或构建类型实现两个不同的包名称,我的简短回答是:你不能,至少不做一些棘手和肮脏的事情。

有些人建议使用参数applicationIdSuffixor applicationId,该选项不起作用,因为库模块的设计将这些参数限制在应用程序模块中。在库中,必须在清单中定义包。

该限制将选项限定为风味,但是,清单中的 package 属性未合并,并且当 and 具有不同的包名称时会出现scr/main/AndroidManifest.xml错误src/flavor/AndroidManifest.xml

一个棘手的解决方案是从任务名称中获取当前选择的风格,然后更改 sourceSets 中的主清单。

sourceSets {
    main {
        manifest.srcFile "src/$flavor_name/AndroidManifest.xml"
    }
}

这个 hack 有效,但总的来说是个坏主意,我更喜欢改变我的架构设计,并以不同的方式为两个 Firebase 变体实现存储库。

Gradle 插件:3.2.0

于 2018-10-05T16:32:47.993 回答