房间:添加附加功能 packages/modules
Room : Adding additional feature packages/modules
问题
我希望为我的项目添加额外的功能,基于 Room
instantapp
,我不确定这样做的最佳策略。是否应该在现有模块 Feature A
或新的单独模块 Feature B
下提供额外的 "activities"。由于新代码将依赖于 Feature A
中已经定义的实体和 POJO,我可以将这些 类 提取到 base
模块中,还是应该设置一个单独的 database
包含它们的模块 ?
背景 (TL;DR)
我目前对Android项目结构的理解如下。 Android Studio 为新应用程序生成大致两种结构。
Traditional/Standard 应用程序由一个名为 app
的主模块生成,并将所有代码放入其中。
即时应用程序生成一组模块 app
、base
、FEATURE X
和 instantapp
。 (注意:这是通过在 "Target Android Devices" 表单中注明 "Include Android Instant App support" 的复选框启用的)
这些模块的组织方式如下:
base
- 包含与 app
或 instantapp
组成的所有其他模块通用和共享的代码和资源。
feature A
- 作为 "main" package/module 包含应用程序的初始代码。 (注意:目前所有的代码都在这里。)
app
- standard/traditional 应用程序的构建目标。
instantapp
- ones 项目提供的 "instantapp" 的构建目标。
每个模块如下相互继承(根据 gradle 构建文件中的 implementation ("MODULE")
行确定)。
base
|
V
Feature A
/ \
V V
app instantapp
好奇心
base
模块
base
应该会生成一个 AAR
文件。也就是说,它创建了一个可以在其他模块中导入的 Android 库。从文档看来,最好在 gradle 构建文件中使用 api
宏导入此类模块,但 Feature A
的库存构建文件使用 implementation
宏代替。这是有原因的吗?
每个特征的实体数
其他框架(例如 Django)允许 Feature X
模块定义它们自己的实体,这些实体通过简单地包含模块来包含在主数据库中。这可以用匕首或可能的 Kotlin 扩展来完成吗(我对匕首一无所知,但它似乎支持可能用于此目的的依赖注入)?
我总是喜欢将数据库集中为一个单独的模块。这样任何人都可以使用数据库表,而且他们将是松散的一对,这意味着如果有人以前使用过 sqlite 并想迁移到 RoomDatabase,那么只能修改 1 个模块,而所有其他模块都保持不变。这是 1 个示例架构。 https://github.com/ankitthakur/MobileSecurity-Android
事实证明,我可以将所有内容提取到 base
模块中,而无需创建专用的 database
模块。这是一个新项目,因此没有必要像 Ankit Thakur 所建议的那样纯粹为数据库创建一个单独的模块,我已将其标记为已回答问题。我的结构现在如下:
base
/ \
feature feature
\ /
app/instantapp
base
提供 database
、queryset
、entities
以及 repository
类。每个功能处理 model
和 activity
类 以及任何 fragments
和 adapters
.
陷阱
将 类 从原始功能转移到 base
模块的一个错误是,虽然 feature
模块导入了 Kotlin,但基础模块没有。所以我只是在基本模块下创建了一个 kotlin 文件,然后 IDe 发现它应该将 kotlin 支持添加到 base
gradle 文件,并在依赖项部分下添加了以下行gradle 构建文件。
dependecnies { ...
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
... }
base
模块
目前,基本模块是否包含在 implementation
或 api
宏中似乎并不重要。我将其保留为默认 implementation(":base")
.
每个特征的实体数
稍后我会将其扩展到另一个问题(或 link 我发现的任何现有问题)。
问题
我希望为我的项目添加额外的功能,基于 Room
instantapp
,我不确定这样做的最佳策略。是否应该在现有模块 Feature A
或新的单独模块 Feature B
下提供额外的 "activities"。由于新代码将依赖于 Feature A
中已经定义的实体和 POJO,我可以将这些 类 提取到 base
模块中,还是应该设置一个单独的 database
包含它们的模块 ?
背景 (TL;DR)
我目前对Android项目结构的理解如下。 Android Studio 为新应用程序生成大致两种结构。
Traditional/Standard 应用程序由一个名为
app
的主模块生成,并将所有代码放入其中。即时应用程序生成一组模块
app
、base
、FEATURE X
和instantapp
。 (注意:这是通过在 "Target Android Devices" 表单中注明 "Include Android Instant App support" 的复选框启用的)
这些模块的组织方式如下:
base
- 包含与app
或instantapp
组成的所有其他模块通用和共享的代码和资源。feature A
- 作为 "main" package/module 包含应用程序的初始代码。 (注意:目前所有的代码都在这里。)app
- standard/traditional 应用程序的构建目标。instantapp
- ones 项目提供的 "instantapp" 的构建目标。
每个模块如下相互继承(根据 gradle 构建文件中的 implementation ("MODULE")
行确定)。
base
|
V
Feature A
/ \
V V
app instantapp
好奇心
base
模块
base
应该会生成一个 AAR
文件。也就是说,它创建了一个可以在其他模块中导入的 Android 库。从文档看来,最好在 gradle 构建文件中使用 api
宏导入此类模块,但 Feature A
的库存构建文件使用 implementation
宏代替。这是有原因的吗?
每个特征的实体数
其他框架(例如 Django)允许 Feature X
模块定义它们自己的实体,这些实体通过简单地包含模块来包含在主数据库中。这可以用匕首或可能的 Kotlin 扩展来完成吗(我对匕首一无所知,但它似乎支持可能用于此目的的依赖注入)?
我总是喜欢将数据库集中为一个单独的模块。这样任何人都可以使用数据库表,而且他们将是松散的一对,这意味着如果有人以前使用过 sqlite 并想迁移到 RoomDatabase,那么只能修改 1 个模块,而所有其他模块都保持不变。这是 1 个示例架构。 https://github.com/ankitthakur/MobileSecurity-Android
事实证明,我可以将所有内容提取到 base
模块中,而无需创建专用的 database
模块。这是一个新项目,因此没有必要像 Ankit Thakur 所建议的那样纯粹为数据库创建一个单独的模块,我已将其标记为已回答问题。我的结构现在如下:
base
/ \
feature feature
\ /
app/instantapp
base
提供 database
、queryset
、entities
以及 repository
类。每个功能处理 model
和 activity
类 以及任何 fragments
和 adapters
.
陷阱
将 类 从原始功能转移到 base
模块的一个错误是,虽然 feature
模块导入了 Kotlin,但基础模块没有。所以我只是在基本模块下创建了一个 kotlin 文件,然后 IDe 发现它应该将 kotlin 支持添加到 base
gradle 文件,并在依赖项部分下添加了以下行gradle 构建文件。
dependecnies { ...
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
... }
base
模块
目前,基本模块是否包含在 implementation
或 api
宏中似乎并不重要。我将其保留为默认 implementation(":base")
.
每个特征的实体数
稍后我会将其扩展到另一个问题(或 link 我发现的任何现有问题)。