如何最好地将大型应用程序划分为模块?

sto*_*fln 9 android code-analysis gradle

构建我正在开发的应用程序需要花费很多时间.它是我工作过的最大的一个.我试图调整gradle设置,这有帮助,但仍然构建很慢.

由于应用程序是在没有模块的情况下构建的,它只是一大堆软件包,现在我想知道如何"提取"它们中的一些并将它们放入单独的模块中.AFAIK模块不应该依赖于app模块,所以我想知道是否有一种工具或技术可以让我分析代码并帮助我找到正确的包来提取,因为它是很多代码.

你会如何解决我的问题?

spa*_*lug 8

这主要是一个设计问题.正如您所说,项目中已有大量代码,一种方法是分析整个项目结构的UML图.目标是识别体系结构的区域,其中交互在几个类之间紧密耦合,也可以基于哪些类具有相同的外部依赖性来形成组.

使用这种方法,可以降低大型项目的复杂性,将类从外部依赖项中解耦,而这些依赖项在大型项目中不会使用.将项目拆分为的invididual模块将具有更快的构建时间.然后,您将项目拆分为的模块可以在主项目中作为依赖项引用.另外一个好处是,每次进行更改时,只会重建主项目中的已修改模块.

这篇Stack Overflow文章讨论了Android Studio的许多UML图生成器插件.Code Iris是一个很好的选择,你可以通过Android Studio插件菜单安装.例如,以下是示例FaceTrackerAndroid应用程序中 Code Iris的输出(单击图表放大):

在此输入图像描述

此图显示了包和项目的分组.您可以看到不同的项目被分成单独的绿色框,在这些框中,是包的框,然后是最后的类和交互.通过分析UML,您可以首先确定如何最好地对类进行分组并创建单个项目.将主项目拆分为模块后,可以再次使用Code Iris在对结构进行更改后可视化交互.


Gho*_*ani 6

您的问题是软件工程中的源代码模块化。它是软件中的新课题,关于它的参考文献很少。源代码模块化是在源代码上重铸集群概念。

在此参考资料中(参见参考资料 1

软件模块化过程的目标是将软件系统划分为子系统,以提供软件系统架构的抽象视图 ,其中子系统由一组软件工件组成,这些工件彼此协作以实现高level 属性或为软件系统的其余部分提供高级服务。

然而,对于大型复杂的软件系统,由于不同工件之间的大量交互以及源代码的庞大规模,无法手动完成软件模块化。因此,需要完全自动化或半自动化的工具来执行软件模块化。

源代码模块化有很多技术(算法)参见参考资料 1):

  1. 分层技术:

    • 单联、全联、平均联
    • 病房法、中值法、质心法
    • 组合和加权组合方法
  2. 基于搜索的技术:

    • 爬山,多次爬山 (HC)
    • 模拟退火 (SA)
    • 遗传算法 (GA)

请注意,您也可以找到具有此名称的其他聚类技术。但是模块化有点不同。它们被重铸为源代码模块化。

整体源码模块化流程如下图所示:

在此处输入图片说明


您可以使用 许多工具。您可以在模块化过程中使用它们:

  1. 静态源代码分析工具(获取 ADG 格式等)请参阅此处的参考-(如理解、NDepend 等)
  2. 可视化工具-(图形可视化)请参阅此处的列表 (如Tom Sawyer Visualization

例如小项目,如果您的项目结构(使用静态分析工具从源代码生成)是这样的:

在此处输入图片说明

结果可能是这样的(应用模块化过程后):

在此处输入图片说明