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.rhkb.cn/news/73436.html

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

相关文章

CCL 2023 电信网络诈骗案件分类评测-第一名方案

1 任务内容 1.1 任务背景 2022年12月1日起,新出台的《反电信网络诈骗犯罪法》正式施行,表明了我国治理当前电信网络诈骗乱象的决心。诈骗案件分类问题是打击电信网路诈骗犯罪过程中的关键一环,根据不同的诈骗方式、手法等将其分类&#xff…

Leetcode每日一题:141. 环形链表、142. 环形链表 II、143. 重排链表(2023.7.29、30、31 C++)

目录 141. 环形链表 问题描述: 实现代码与解析: 快慢指针: 原理思路: 142. 环形链表 II 问题描述: 实现代码与解析: 快慢指针 原理思路: 143. 重排链表 题目描述: 实现…

分布式系统的 38 个知识点

天天说分布式分布式,那么我们是否知道什么是分布式,分布式会遇到什么问题,有哪些理论支撑,有哪些经典的应对方案,业界是如何设计并保证分布式系统的高可用呢? 1. 架构设计 这一节将从一些经典的开源系统架…

基于ASP.NET MVC开发的、开源的个人博客系统

推荐一个功能丰富、易于使用和扩展的开源博客,可以轻松地创建和管理自己的博客。 项目简介 基于.Net Framework 4.5开发的、开源博客系统,具有丰富的功能,包括文章发布、分类、标签、评论、订阅、统计等功能,同时也可以根据需要…

Stable Diffusion如何生成高质量的图-prompt写法介绍

文章目录 Stable Diffusion使用尝试下效果prompt的编写技巧prompt 和 negative promptPrompt格式Prompt规则细节优化Guidance Scale 总结 Stable Diffusion Stable Diffusion是一个开源的图像生成AI系统,由Anthropic公司开发。它基于 Transformer模型架构,可以通过文字描述生成…

TypeScript 【type】关键字的进阶使用方式

导语: 在前面章节中,我们了解到 TS 中 type 这个关键字,常常被用作于,定义 类型别名,用来简化或复用复杂联合类型的时候使用。同时也了解到 为对象定义约束接口类型 的时候所使用的是 Interfaces。 其实对于前面&#…

安装金蝶云星空出错 T_META FORMENUMITEM

找不到对象"T_META FORMENUMITEM”,因为它不存在或者你没有所需的权限 解决方案 如果出现以下问题

Tomcat虚拟主机

Tomcat虚拟主机 部署 [rootlocalhost webapps]# cd ../conf [rootlocalhost conf]# pwd /usr/local/tomcat/conf [rootlocalhost conf]# vim server.xml #增加虚拟主机配置&#xff0c;添加以下&#xff1a; <Host name"www.a.com" appBase"webapps"u…

MySQL和Oracle区别

由于SQL Server不常用&#xff0c;所以这里只针对MySQL数据库和Oracle数据库的区别 (1) 对事务的提交 MySQL默认是自动提交&#xff0c;而Oracle默认不自动提交&#xff0c;需要用户手动提交&#xff0c;需要在写commit;指令或者点击commit按钮 (2) 分页查询 MySQL是直接在SQL…

OpenHarmony开源鸿蒙学习入门 - 基于3.2Release 应用开发环境安装

OpenHarmony开源鸿蒙学习入门 - 基于3.2Release 应用开发环境安装 基于目前官方master主支&#xff0c;最新文档版本3.2Release&#xff0c;更新应用开发环境安装文档。 一、安装IDE&#xff1a; 1.IDE安装的系统要求 2.IDE下载官网链接&#xff08;IDE下载链接&#xff09; …

无人机自动返航的关键技术有哪些

无人机的广泛应用使得无人机自动返航技术变得至关重要。在各种应对意外情况的背景下&#xff0c;无人机自动返航技术的发展对确保无人机的安全&#xff0c;以及提高其应用范围具有重要意义。接下来&#xff0c;便为大家详细介绍无人机自动返航所运用到的关键技术。 一、定位与导…

ChatGPT辅助写论文:提升效率与创造力的利器

写作是人类最重要的交流方式之一&#xff0c;也是学术研究中不可或缺的环节。然而&#xff0c;写作并不是一件容易的事情&#xff0c;尤其是对于科研人员来说&#xff0c;他们需要花费大量的时间和精力来撰写高质量的论文&#xff0c;并且面临着各种各样的挑战&#xff0c;如语…

前端Web实战:从零打造一个类Visio的流程图拓扑图绘图工具

前言 大家好&#xff0c;本系列从Web前端实战的角度&#xff0c;给大家分享介绍如何从零打造一个自己专属的绘图工具&#xff0c;实现流程图、拓扑图、脑图等类Visio的绘图工具。 你将收获 免费好用、专属自己的绘图工具前端项目实战学习如何从0搭建一个前端项目等基础框架项…

2023年电赛---运动目标控制与自动追踪系统(E题)关于网友的问题回复

前言 &#xff08;1&#xff09;各位私信问问题之前&#xff0c;看看自己的问题是不是在这个里面再问&#xff01; &#xff08;2&#xff09; <1>2023年8月3日&#xff0c;10点25分。增加第三问的细节回答。 <1>2023年8月3日&#xff0c;10点45分。更新关于舵机安…

掌握Python的X篇_16_list的切片、len和in操作

接上篇掌握Python的X篇_15_list容器的基本使用&#xff0c;本篇进行进一步的介绍。 文章目录 1. list的索引下标可以是负数2. 切片&#xff08;slice&#xff09;2.1 切片基础知识2.2 如何“取到尽头”2.3 按照步长取元素2.4 逆序取值 3. len函数获取lis的元素个数4. in操作符…

时间复杂度接近O(n)的三种排序算法

1.桶排序 桶排序&#xff0c;顾名思义&#xff0c;会用到“桶”&#xff0c;核心思想是将要排序的数据分到几个有 序的桶里&#xff0c;每个桶内的数据再单独进行排序。桶内排完序之后&#xff0c;再把每个桶内的数据按照顺序依次 取出&#xff0c;组成的序列就是有序的了。 …

C语言-------函数栈帧的创建和销毁------剖析描骨

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; &#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382;…

小程序原生实现左右锚点联动

效果 wxml <view classbox><scroll-view scroll-y scroll-with-animation style"width:25%"><view classnav><view wx:for"{{navList}}" wx:keyindex class"title {{index active ?select:}}"data-index{{index}} bin…

Babel编译与Webpack

目录 Babel初识BabelBabel 使用方式使用 Babel 前的准备工作 WebpackWebpack介绍Webpack初体验Webpack核心概念入口&#xff08;entry&#xff09;出口&#xff08;output&#xff09;加载 (loader)插件&#xff08;plugins&#xff09; Babel Babel官网: https://babeljs.io/…

【ASP.NET MVC】动态与静态网站(3)

一、区别 静态网页&#xff08;站&#xff09; 用户通过浏览器提交访问需求&#xff0c;需求可以是默认首页或者指定的网站中的某个页面&#xff0c;WEB服务器查找对应的网页&#xff0c;通过HTTP协议发送到客户端&#xff0c;完成访问。 特点&#xff1a;每次访问、不同角色…