Android模块化开发

Android 跨Module之间的数据通信 目前无论是后端还是客户端,项目的代码结构都在朝着组件化、模块化发展。在一个Android项目中,我们通常会将一个模块的逻辑代码放在一个Module,例如Paylib、Utillib、Pushib等,项目结构如下图所示。我们在主工程(app目录下)下导入Module就能调用Module里封装好的逻辑,会对我们后期的代码扩展、维护等带来非常大的便利,也是目前主流的编程趋势。 阅读详情

一、什么是模块化

那么什么是模块化呢?《 Java 应用架构设计:模块化模式与 OSGi 》一书中对它的定义是:模块化是一种处理复杂系统分解为更好的可管理模块的方式。

上面这种描述太过生涩难懂,不够直观。下面这种类比的方式则可能加容易理解。

我们可以把软件看做是一辆汽车,开发一款软件的过程就是生产一辆汽车的过程。一辆汽车由车架、发动机、变数箱、车轮等一系列模块组成;同样,一款大型商业软件也是由各个不同的模块组成的。

汽车的这些模块是由不同的工厂生产的,一辆 BMW 的发动机可能是由位于德国的工厂生产的,它的自动变数箱可能是 Jatco(世界三大变速箱厂商之一)位于日本的工厂生产的,车轮可能是中国的工厂生产的,最后交给华晨宝马的工厂统一组装成一辆完整的汽车。这就类似于我们在软件工程领域里说的多团队并行开发,最后将各个团队开发的模块统一打包成我们可使用的 App 。

一款发动机、一款变数箱都不可能只应用于一个车型,比如同一款 Jatco 的 6AT 自动变速箱既可能被安装在 BMW 的车型上,也可能被安装在 Mazda 的车型上。这就如同软件开发领域里的模块重用。

到了冬天,特别是在北方我们可能需要开着车走雪路,为了安全起见往往我们会将汽车的公路胎升级为雪地胎;轮胎可以很轻易的更换,这就是我们在软件开发领域谈到的低耦合。一个模块的升级替换不会影响到其它模块,也不会受其它模块的限制;同时这也类似于我们在软件开发领域提到的可插拔。

二、模块化分层设计

模块化后有什么好处呢。

每个Module可以单独调试开发,节省编译时间
单独个模块开发可共享工具类,网络库等
对测试来说可以对单个模块进行快速测试
公司业务繁重可以不断复用模块,节省开发时间

模块化弊端

资源命名重复
引用的库版本不对应,使用冲突
1. 资源名冲突

对于多个 Bussines Module 中资源名冲突的问题,可以通过在 build.gradle 定义前缀的方式解决:

defaultConfig {
…
resourcePrefix “new_house_”
…
}

而对于 Module 中有些资源不想被外部访问的,我们可以创建 res/values/public.xml,添加到 public.xml 中的 resource 则可被外部访问,未添加的则视为私有:



2 .重复依赖

模块化的过程中我们常常会遇到重复依赖的问题,如果是通过 aar 依赖, gradle 会自动帮我们找出新版本,而抛弃老版本的重复依赖。如果是以 project 的方式依赖,则在打包的时候会出现重复类。对于这种情况我们可以在 build.gradle 中将 compile 改为 provided,只在最终的项目中 compile 对应的 library ;

其实从前面的安居客模块化设计图上能看出来,我们的设计方案能一定程度上规避重复依赖的问题。比如我们所有的第三方库的依赖都会放到 OpenSoureLibraries 中,其他需要用到相关类库的项目,只需要依赖 OpenSoureLibraries 就好了。

3 模块化过程中的建议

对于大型的商业项目,在重构过程中可能会遇到业务耦合严重,难以拆分的问题。我们需要先理清业务,再动手拆分业务模块。比如可以先在原先的项目中根据业务分包,在一定程度上将各业务解耦后拆分到不同的 package 中。比如之前新房和二手房由于同属于 app module,因此他们之前是通过隐式的 intent 跳转的,现在可以先将他们改为通过 Router 来实现跳转。又比如新房和二手房中公用的模块可以先下放到 Business Component Layer 或者 Basic Component Layer 中。在这一系列工作完成后再将各个业务拆分成多个 module 。

模块化重构需要渐进式的展开,不可一触而就,不要想着将整个项目推翻重写。线上成熟稳定的业务代码,是经过了时间和大量用户考验的;全部推翻重写往往费时费力,实际的效果通常也很不理想,各种问题层出不穷得不偿失。对于这种项目的模块化重构,我们需要一点点的改进重构,可以分散到每次的业务迭代中去,逐步淘汰掉陈旧的代码。

各业务模块间肯定会有公用的部分,按照我前面的设计图,公用的部分我们会根据业务相关性下放到业务组件层(Business Component Layer)或者基础组件层(Common Component Layer)。对于太小的公有模块不足以构成单独组件或者模块的,我们先放到类似于 CommonBusiness 的组件中,在后期不断的重构迭代中视情况进行进一步的拆分。过程中完美主义可以有,切记不可过度。

以上就是我在模块化探索实践方面的一些经验,不住之处还望大家指出。

2023 Android 模块化完整方案实现 所以,在一开始拆分module时,一定要先理清项目的业务,对于一些公用的业务模块,可以放到业务基础组件中,module拆分也不可能一蹴而就,需要随着业务需求不断的优化调整。在同一进程间通信,EventBus无意非常流行,因为嫌弃EventBus太重,所以就实现了一个简单的moduleEventbus,其实现原理完全照搬EventBus,其使用方法和EventBus也完全一致,分为 定义事件类型,订阅,发布事件,订阅事件处理,解除订阅几个步骤,不过核心代码精简到100多行,具体实现详见代码。 阅读详情

相关推荐

Android 模块化开发实践

一、前言 随着业务的快速发展,现在的互联网App越来越大,为了提高团队开发效率,模块化开发已经成为主流的开发模式。正好最近完成了vivo官网App业务模块化改造的工作,所以本文就对模块化开发模式进行一次全面的介绍,并总结模块化改造经验,帮助兄弟项目避坑。 二、什么是模块化开发 首先我们搞清两个概念,Android客户端开发目前有两种模式:单工程开发模式和模块化开发模式。 单工程开发模式:早期业务少、开发人员也少,一个App对应一个代码工程,所有的代码都集中在这一个工程的一个module里。

1 368

Android设计模式详解之外观模式

外观模式也称门面模式,在开发过程中的运用频率非常高;要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行;门面模式提供一个高层次的接口,使得子系统更易于使用;为一个复杂子系统提供一个简单接口;外观模式可以提供一个简单统一的接口,对外隐藏子系统的具体实现、隔离变化;需要构建一个层次结构的子系统时,使用门面模式定义子系统中每层的入口点;如果子系统之间是相互依赖的,你可以让他们仅通过门面接口进行通信,从而简化它们之间的依赖关系;UML类图:系统对外的统一接口,系统内部系统地工作;子系统接口;

故不积跬步无以至千里 468

android studio模块化开发

当多个人同时开发一个中大型的安卓项目   为了分工明确  避免代码的耦合性   就要进行模块化开发  在模块化开发的过程中  我们项目组遇到了很多的问题  接下来我将一一阐述以及说明解决方法 1:首先要做架构   建立几个模块 主模块:项目的核心模块  由它来主导程序的走向以及引入各个子模块 接口模块:作为主模块和子模块的交互存在的模块 各个子模块:通用工具类,以及项目的各个部分功能都可

sarasara_的博客 1582

Android组件化架构解析总结

前面说到,组件化的核心就是解耦,所以组件和组件之间是不能有依赖的,例如在首页模块点击购物车按钮需要跳转到购物车模块的购物车页面,两个模块之间没有依赖,所以不能在使用Activity的显示跳转来跳转页面了 ,虽然隐式启动是可以实现跳转的,但是隐式 Intent 需要通过 AndroidManifest 配置和管理,协作开发显得比较麻烦。建议创建一个lib_core的公共功能模块组件,将常用的与业务无关的功能封装到此模块中,例如图片加载功能,网络请求功能,日志管理功能等,这些功能可以被所有的app通用。

XBlithe的博客 2206

Android 开发:由模块化到组件化(一)

当你看到这的时候,想必心理一阵恶寒:模块化?组件化?到底是什么鬼?有啥区别. 有这种感觉才是对的,模块化和组件化本质思想是一样的,都是"大化小",两者的目的都是为了重用和解耦,只是叫法不一样.如果非要说区别,那么可以认为模块化粒度更小,更侧重于重用,而组件化粒度稍大于模块,更侧重于业务解耦.

Floating Cat 6万+

Android应用模块化开发深入实践

模块化开发具有以下优点:提高开发效率,因为团队成员可以并行工作,互不干扰;降低维护成本,模块化后的代码结构清晰,便于定位问题和优化;易于扩展和更新,单个模块的修改和替换不会影响整个应用,从而使得应用具备良好的扩展性。模块化(Modularity)是指在系统设计中将一个复杂的系统分解成若干个简单且功能独立的模块的过程。这些模块是自包含的,并且可以通过清晰定义的接口与其他模块交互。模块化设计的核心原则包括:单一职责原则(Single Responsibility Principle)

weixin_29940495的博客 599

[Android开发]推荐一个模块间通信框架

ModuleCommunication 旨在解决模块间的通信需求,可以让模块间的代码在依旧存在于其自己的模块的前提下,实现能够互相访问而不需要下沉到公共模块。以此来解决公共模块因为各个模块下沉代码而导致的不断膨胀的问题 ,[灵感来源-微信Android模块化架构重构实践](https://mp.weixin.qq.com/s/6Q818XA5FaHd7jJMFBG60w)

u013077428的博客 1109

【Qt】Window环境下搭建Qt6、MSVC2022开发环境(无需提前安装Visual Studio)

本文介绍 Windows 环境下无需安装 Visual Studio,搭建 Qt6 与 MSVC2022 开发环境的方法,以节省磁盘空间。核心步骤包括:用中科大镜像提速 Qt6 在线安装,需勾选 Qt Creator 17.0.1、MSVC 2022 x64 等组件;配置环境变量,添加 mingw_64、msvc2022_64 及 Qt Creator 的二进制目录;安装 MSVC 2022 编译器与 Windows 10 SDK 并记录版本;配置 Qt Creator 构建套件,可选设置 vcvarsal

油炸自行车的博客 2940

关于Android模块化开发介绍及使用

模块化浅谈: 1、安卓模块化开发介绍: 模块化开发思路就是:单独开发每个模块,用集成的方式把他们组合起来,就能拼出一个app。app可以理解成很多功能模块的组合,而且有些功能模块是通用的,必备的,像自动更新,反馈,推送,都可以提炼成模块,和搭积木很像,由一个壳包含很多个模块。 2、模块化开发的好处: 我们的应用在更新的时候有时候并不需要整个应用一起更新,这样为了一个很小的更新,却要动辄修改整个项...

怪咖小白的博客 3134

2 海康视觉平台VisionMaster 上手系列:大纲及准备

海康视觉平台VisionMaster 大纲,课前准备 快速入门 工业机器视觉 机器视觉

HuangGong2022的博客 1万+

从零搭建智能车竞赛卡丁车:自动驾驶科目中的锥桶识别与路径规划实战教程

本文提供了一份从零搭建智能车竞赛卡丁车的实战教程,重点解析了自动驾驶科目中的核心环节:锥桶识别与路径规划。内容涵盖硬件选型、传感器部署、基于单目视觉的识别算法,以及适用于嵌入式平台的轻量级路径规划与跟踪策略,旨在帮助参赛者与爱好者系统掌握关键技术,完成稳定可靠的自动驾驶系统搭建。

lg888的博客 1167

安卓开发之模块化、组件化设计

/ 执行跳转 } });if (rootProject.ext.isModule) { apply plugin: 'com.android.application' //指定为独立运行的应用 } else { apply plugin: 'com.android.library' //库 } defaultConfig { if (rootProject.ext.isModule) { applicationId "com.ls.fuser"//如果独立运行 需要提供applicationId } }

qq_62618558的博客 1489

Ubuntu 20.04下Cube-Studio云原生平台单机部署全攻略(附避坑指南)

本文详细介绍了在Ubuntu 20.04系统上单机部署Cube-Studio云原生平台的完整流程,包括环境准备、Docker配置、Rancher与Kubernetes集群部署以及Cube-Studio核心组件安装。特别提供了官方文档未涵盖的实战技巧和常见问题解决方案,帮助开发者高效完成部署并避免常见陷阱。

weixin_29313423的博客 465

Android 模块化开发

概述 单独开发每个模块,用集成的方式把他们组合起来,拼出一个app。如通用的模块,自动更新的模块,反馈模块,推送模块都可以单独以模块来开发,最后进行集成。我们可以通过一个壳来包含很多个模块。 好处 可以单独升级模块。耦合度低。同时,也很好地解决了“牵一发而动全身”的问题。方便分工。与其他团队合作时,如外包的团队,可以很好的地将核心代码与外包部分隔离开,不用和他们分享核心代码,让他们去做独立的功能,...

weixin_40763897的博客 3988

Python 爬虫实战:爬取去哪儿网酒店评价,提取住宿体验关键词

本文介绍了基于去哪儿网酒店评价数据的爬取与分析方法。首先通过分析网页结构和数据加载机制,定位到评价数据的JSON接口及关键参数。然后使用Python搭建爬虫环境,实现多页评价数据的批量采集与存储,并通过反爬策略确保数据获取的稳定性。在文本分析环节,采用jieba分词和TF-IDF算法提取高频关键词,结合词云可视化展示用户关注点。分析结果显示位置、服务、卫生是核心关注维度,同时识别出好评与差评的关键驱动因素。该方法为酒店服务优化和消费者决策提供了数据支持,并可通过扩展实现更深入的情感分析和竞品对比。

2503_91057718的博客 1000

【虚幻引擎UE】UE5 四步骤实现AI漫游与对话行为(含工程源码)

【虚幻引擎UE】UE5 四步骤实现AI漫游与对话行为(含工程源码)

灵境引路人 3227

推荐文章:探索未来安卓开发新境界 —— Android模块化的深度实践《关于Android模块化我有一些话不知当讲不当讲》

推荐文章:探索未来安卓开发新境界 —— Android模块化的深度实践《关于Android模块化我有一些话不知当讲不当讲》 随着移动应用的日益复杂,开发者们越来越关注如何让代码更加高效、维护更便捷。而Android平台上的模块化实践,无疑是通往这一目标的重要途径之一。今天,我们要深入探讨的是一个以此为核心理念的开源项目——《关于Android模块化我有一些话不知当讲不当讲》,由开发者“Liushu...

gitblog_00527的博客 970

NVIDIA A100驱动及CUDA安装指南

NVIDIA A100驱动及CUDA安装指南:详细介绍了在Ubuntu系统下安装A100显卡驱动和CUDA工具包的完整流程,包括环境准备、驱动安装、CUDA配置及性能优化建议。特别推荐猿界算力平台提供开箱即用的A100算力租赁服务,具备专业团队支持、灵活租期和实惠价格等优势。文末通过PyTorch测试验证了A100设备的可用性,展示了80GB显存的强大计算能力。

2401_89353317的博客 1511

安卓模块化开发

上一篇讲了这4年来对安卓兼各种容性的看法及解决方法,下面讲一下安卓项目的架构。 注明:这里说的架构只是项目级别的不涉及代码 这个开发框架适用于中大型项目基于模块式开发,各个模块相互独立互相不影响。 在思想上主要分三步: 抽离公共数据抽离公共View抽离功能模块 公共数据(CommonLib)包含BaseActivity BaseModel BaseFragement Base

taojinsha的专栏 441

RT-Thread littefs控制GD32F4xx片内Flash

GD32F4xx RT-Thread下使用littefs 控制片内flash 调试记录

madao1234的博客 995

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Android简单的模块化开发

1.为什么要模块开发      1.解耦性强:随着业务的增多,代码变的越来越复杂,每个模块之间的代码耦合变得越来越严重,解耦问题急需解决。      2. 编译时间大大减少:以为业务场景对,代码越来越大,同时编译时间也会越来越长。      3.提高团队协同开发:  团队协同开发存在较多的冲突.不得不花费更多的时间去沟通和协调,影响开发效率 。    模块化的定义:        Mod...

yuan381119866的博客 7055

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

安卓APP模块化开发指南

本文讨论手机开发的模块化问题,模块化的优点与缺点,是否适合我们等。

红孩儿编程大师 774

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Android应用模块化开发指南

Android 模块化指南,模块化优点、模块化原则、模块类型及最佳实践。

虎哥LoveDroid 1850

Android模块化开发架构

安卓模块化开发架构

Manly_Ford 1257
上一篇: 接入SopFix遇到的一些问题
下一篇: Android studio instant run导致的classNotFoundException
崔星星
博客等级 码龄10年 24粉丝 80原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值