Android Gradle 骚操作,将两个项目合并到一个项目中

1. 前言

在工作中,由于各种原因,导致需要将两个可单独运行的App项目,合并到一个git仓库里,且单独的App项目里还有其他Module模块。
如果只是将两个项目复制到同一个文件夹下,还是得单独打开各个项目,是很不方便的。
而我想到达到的效果是,Android Studio打开两个项目同属的根文件夹,即可加载出两个项目,可以在Android Studio内部切换项目编译运行。

如下图所示,我们现在有两个项目

  • MyProject1 : 里面有依赖MyModule1这个Library
  • MyProject2 : 是一个单独的App,没有依赖其他Library

接下来,我们就以这两个项目为例,通过修改gradle,合并到一个项目中

在这里插入图片描述

2. include 函数用法

首先,我们都知道在Gralde中,include函数可以用来依赖子项目。
比如我们新建的项目,在settings.gradle中,就会有这么一句,用来依赖app模块。

include ":app"

我们点击include,可以发现include其实是一个方法,参数是个可变字符串,可以传入若干个项目的路径,比如:app

default void include(String... projectPaths) {this.include((Iterable)Arrays.asList(projectPaths));
}

那如果项目是在子目录需要怎么办呢 ?
这里的:是用来分割目录的,那么依赖子目录的项目就是:xxxx:yyyy这种形式了

3. 实现步骤

3.1 创建一个新的项目

我们知道了include的用法,那么就可以用include来实现合并。
首先我们先创建一个全新的项目,比如MyProjectTest,并删除其app文件夹下的代码。

在这里插入图片描述

3.2 复制项目到MyProjectTest

MyProject1MyProject2复制到MyProjectTest
在这里插入图片描述

3.3 修改settings.gradle

修改MyProjectTestsettings.gradle
原本是这样两行代码

rootProject.name = "MyProjectTest"
include ':app'

修改为

rootProject.name = "MyProjectTest"
include ':MyProject1:app'
include ':MyProject1:MyModule1'
include ':MyProject2:app'

点击下Sync按钮,会提示报错
在这里插入图片描述
因为在MyProject1中,我们依赖了MyModule1

implementation project(':MyModule1')

所以这里提示找不到了,需要修改为 :MyProject1:MyModule1

implementation project(':MyProject1:MyModule1')

这时我们再点击Sync按钮,可以发现多了两个可运行的项目选项

在这里插入图片描述
选择一个项目,点击运行,可以发现正常安装到手机上了。

4. 进一步优化

到这里,本文的目标基本就完成了,实现了将两个项目合并到一个项目中。
但是,这个时候,我们如果用Android Studio单独打开MyProject1,会发现MyProject1编译报错了。
因为我们将implementation project(':MyModule1')修改为了implementation project(':MyProject1:MyModule1'),与MyProjectTest产生了耦合。
这显然是不合理的,理想的情况,应该是合并两个项目后,单独的项目依旧可以在Android Studio上单独运行。
那应该怎么办呢 ?

4.1 给项目指定路径

其实,我们可以使用project.projectDir ,指定子项目的路径。

修改MyProjectTestsettings.gradle,给MyModule1指定路径。

rootProject.name = "MyProjectTest"include ':MyProject1:app'
include ':MyModule1'
include ':MyProject2:app'project(':MyModule1').projectDir = new File('/MyProject1/MyModule1')

然后将MyProject1下的 implementation project(':MyProject1:MyModule1')依赖修改会implementation project(':MyModule1')

再次点击Sync按钮,点击运行,发现依旧是可以运行的。

而且,这个时候,单独用Android Studio打开MyProject1,也是能够单独运行的。

4.2 给子项目改名

在这里插入图片描述

点击Edit Configurations,我们还可以给子项目改名

在这里插入图片描述
删除名字里的.app,最终效果如下

在这里插入图片描述
至此,我们就完成了将两个项目合并成一个项目的所有操作。

5. 如果还有一个可单独运行的项目 ?

如果MyProject2中还有一个可单独运行的子项目,那需要怎么整合呢 ?
其实也是一样的,在MyProjectTestsettings.gradle中,增加include依赖。

include ':MyProject2:xxxx'

这里的xxxx是这个子项目的名称,然后Sync一下,就可以看到这个子项目单独的运行入口了。

6. 其他

6.1 本文源码

源码下载地址 : Android Studio中,将两个项目合并到一个项目中

6.2 参考

【Android Gradle 插件】settings.gradle 配置文件 ( 配置基本作用 | include 函数用法 | 目录层级配置 | 修改 Module 模块构建脚本名称 )_setting.gradle 构建多项目 设置构建包名称

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/55387.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自然语言处理学习笔记(三)————HanLP安装与使用

目录 1.HanLP安装 2.HanLP使用 (1)预下载 (2)测试 (3)命令行 (4)测试样例 3.pyhanlp可视化 4. HanLP词性表 1.HanLP安装 HanLP的 Python接口由 pyhanlp包提供,其安装…

OSPF综合实验

实验题目如下: 实验拓扑如下: 实验要求如下: 【1】R4为ISP,其上只能配置IP地址: R4与其他所有直连设备间使用公有 【2】R3---R5/6/7为MGRE环境,R3为中心站点 【3】整个OSPF环境IP地址为172.16.0.0/16 【4】所有设备…

Elasticsearchr入门

首先在官网下载elasticsearch8.9版本&#xff0c;以及8.9版本的kibana。 解压&#xff0c;点击es8.9bin目录下的elasticsearch.bat文件启动es 如图所示即为成功。 启动之后打开idea&#xff0c;添加依赖 <dependency><groupId>com.fasterxml.jackson.core</g…

SpringBoot 日志文件

一、日志的作用 日志是程序的重要组成部分&#xff0c;想象一下&#xff0c;如果程序报错了&#xff0c;不让你打开控制台看日志&#xff0c;那么你能找到报错的原因吗 答案是否定的&#xff0c;写程序不是买彩票&#xff0c;不能完全靠猜&#xff0c;因此日志对于我们来说&a…

Flutter游戏引擎Flame系列笔记 - 1.Flame引擎概述

Flutter游戏引擎Flame系列笔记 1.Flame引擎概述 - 文章信息 - Author: 李俊才(jcLee95) Visit me at: https://jclee95.blog.csdn.netEmail: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550263/article/details/132119035 【介绍】…

【笔记】第94期-冯永吉-《湖仓集一体关键技术解读》-大数据百家讲坛-厦大数据库实验室主办20221022

https://www.bilibili.com/video/BV1714y1j7AU/?spm_id_from333.337.search-card.all.click&vd_sourcefa36a95b3c3fa4f32dd400f8cabddeaf

[LitCTF 2023]Http pro max plus

打开环境后提示说&#xff0c;只允许在本地访问&#xff0c;本地访问&#xff0c;还是想到了XFF字段 好家伙的&#xff0c;直接被嘲讽&#xff0c;还是了解太少了&#xff0c;都不知道还有没有其他方式可以控制ip地址信息 经过查看wp&#xff0c;得知一种新的方式 Client-IP …

VL 模型 Open-Set Domain Adaptation with Visual-Language Foundation Models 论文阅读笔记

Open-Set Domain Adaptation with Visual-Language Foundation Models 论文阅读笔记 一、Abstract 写在前面 又是一周周末&#xff0c;在家的时间感觉过得很快呀。今天没得时间写博客&#xff0c;留下个标题&#xff0c;明天搞完。 论文地址&#xff1a;Open-Set Domain Adapta…

PCIe总线详解

一、PCIe简介 PCI Express (peripheral component interconnect express) 简称PCIe&#xff0c;是一种高速、串行、全双工、计算机扩展总线标准&#xff0c;采用高速差分总线&#xff0c;并采用端到端的连接方式&#xff0c;因此在每一条PCIe链路中两端只能各连接一个设备。相对…

Docker安装Mysql、Redis、nginx、nacos等环境

相关系列文章&#xff1a; 1、DockerHarbor私有仓库快速搭建 2、DockerJenkinsHarbor 1、服务器 Ip部署内容说明192.168.88.7Docker、Mysql、redis、nacosnode1192.168.88.8Docker、Mysql、redis、nacosnode2192.168.88.9Docker、redis、nacos、nginxnode3 2、安装PXC8.0 Mys…

【C++】map和set

目录 一、容器补充1.序列式容器与关联式容器2.键值对3.树形结构的关联式容器 二、set1.set的介绍2.set的使用3.multset的介绍4.multset的使用 三、map1.map的介绍2.map的使用3.multimap的介绍4.multimap的使用 一、容器补充 1.序列式容器与关联式容器 我们已经接触过STL中的部…

postgresql之内存池-AllocsetContext

一、简介 postgresql大部分的内存分配管理都是通过MemoryContext进行操作的&#xff0c; 多个相关的MemoryContext构成了一个树型结构&#xff0c; 多个树构成了一个森林。 实现了三种MemoryContext: SlabContextGenerationContextAllocSetContext 使用全局变量CurrentMemo…