会议室:添加其他功能包/模块

时间:2018-12-01 13:41:22

标签: android structure android-room

问题

我希望为我的项目添加一个基于Room的{​​{1}}的附加功能,但是我不确定这样做的最佳策略。应该在现有模块instantapp下还是在新的单独模块Feature A下提供其他“活动”。由于新代码将取决于Feature B中已经定义的实体和POJO,我可以将这些类提取到Feature A模块中,还是应该设置一个单独的base模块来包含它们?

背景(TL; DR)

我目前对Android项目结构的理解如下。 Android Studio会为新应用程序生成大致两种结构。

  • 传统/标准应用程序是由一个简单的名为database的主模块生成的,其中将所有代码都扔进了该主模块。

  • 即时应用程序会生成一组模块appappbaseFEATURE X。 (注意:这是通过“目标Android设备”表单中指出“包括Android Instant App支持”的复选框启用的)

这些模块的组织方式如下:

  • instantapp-包含与所有其他模块(包括baseapp相同并与其他模块共享的代码和资源。
  • 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,但似乎它支持依赖注入,可以将其用于此目的)?

2 个答案:

答案 0 :(得分:0)

我总是喜欢将数据库集中为一个单独的模块。这样任何人都可以使用数据库表,它们也会被松散耦合,这意味着如果某个人以前使用过sqlite并想要迁移到RoomDatabase,则只能修改1个模块,而所有其他模块都保持不变。这是1个示例架构。 https://github.com/ankitthakur/MobileSecurity-Android

答案 1 :(得分:0)

事实证明,我可以将所有内容提取到base模块中,而无需创建专用的database模块。这是一个新项目,因此没有必要像Ankit Thakur所建议的那样纯粹为数据库创建单独的模块,我将其标记为回答了这个问题。我的结构现在如下:

      base
     /    \
feature  feature
     \    /
 app/instantapp

通过base提供databasequerysetentitiesrepository类。每个功能都处理modelactivity类以及任何fragmentsadapters

陷阱

将类从原始功能转移到base模块的一个诀窍是,尽管feature模块导入Kotlin,基本模块却没有。因此,我只是在基本模块下创建了一个kotlin文件,然后IDe对其进行了选择,应该在base gradle文件中添加kotlin支持,并在gradle构建文件的dependencies部分下添加了以下行。

dependecnies { ... 
   implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
... }

base模块

当前,implementationapi宏是否包含基本模块似乎无关紧要。我将其保留在默认的implementation(":base")上。

每个功能的实体

我会在一段时间内将其扩展为另一个问题(或链接到我发现的任何现有问题)。