我希望为我的项目添加一个基于Room
的{{1}}的附加功能,但是我不确定这样做的最佳策略。应该在现有模块instantapp
下还是在新的单独模块Feature A
下提供其他“活动”。由于新代码将取决于Feature B
中已经定义的实体和POJO,我可以将这些类提取到Feature A
模块中,还是应该设置一个单独的base
模块来包含它们?
我目前对Android项目结构的理解如下。 Android Studio会为新应用程序生成大致两种结构。
传统/标准应用程序是由一个简单的名为database
的主模块生成的,其中将所有代码都扔进了该主模块。
即时应用程序会生成一组模块app
,app
,base
和FEATURE X
。 (注意:这是通过“目标Android设备”表单中指出“包括Android Instant App支持”的复选框启用的)
这些模块的组织方式如下:
instantapp
-包含与所有其他模块(包括base
或app
相同并与其他模块共享的代码和资源。 instantapp
-用作包含应用程序初始代码的“主”程序包/模块。 (注意:目前所有的代码都位于此处。)feature A
-标准/传统应用程序的构建目标。app
-一个项目提供的“ instantapp”的构建目标。每个模块相互继承如下(由gradle构建文件中的instantapp
行决定)。
implementation ("MODULE")
base
|
V
Feature A
/ \
V V
app instantapp
模块
base
应该生成一个base
文件。也就是说,它创建了一个Android库,可以将其导入其他模块中。从文档看来,最好使用gradle构建文件中的AAR
宏导入此类模块,但是api
的常规构建文件改用Feature A
宏。有这个原因吗?
每个功能的实体
其他框架(例如Django)允许implementation
模块定义它们自己的实体,只需将其包含在主数据库中即可。可以用dagger或可能的Kotlin扩展来完成(我不知道dagger,但似乎它支持依赖注入,可以将其用于此目的)?
答案 0 :(得分:0)
我总是喜欢将数据库集中为一个单独的模块。这样任何人都可以使用数据库表,它们也会被松散耦合,这意味着如果某个人以前使用过sqlite并想要迁移到RoomDatabase,则只能修改1个模块,而所有其他模块都保持不变。这是1个示例架构。 https://github.com/ankitthakur/MobileSecurity-Android
答案 1 :(得分:0)
事实证明,我可以将所有内容提取到base
模块中,而无需创建专用的database
模块。这是一个新项目,因此没有必要像Ankit Thakur所建议的那样纯粹为数据库创建单独的模块,我将其标记为回答了这个问题。我的结构现在如下:
base
/ \
feature feature
\ /
app/instantapp
通过base
提供database
,queryset
,entities
和repository
类。每个功能都处理model
和activity
类以及任何fragments
和adapters
。
陷阱
将类从原始功能转移到base
模块的一个诀窍是,尽管feature
模块导入Kotlin,基本模块却没有。因此,我只是在基本模块下创建了一个kotlin文件,然后IDe对其进行了选择,应该在base
gradle文件中添加kotlin支持,并在gradle构建文件的dependencies部分下添加了以下行。
dependecnies { ...
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
... }
base
模块
当前,implementation
或api
宏是否包含基本模块似乎无关紧要。我将其保留在默认的implementation(":base")
上。
每个功能的实体
我会在一段时间内将其扩展为另一个问题(或链接到我发现的任何现有问题)。