要用模块化、组件化才能完成 Android 项目中类加载功能的原因:Android项目中的类加载功能是通过Java虚拟机实现的,而JVM是基于Java语言的模块化和组件化设计思想来构建的,如果要完成类加载功能,就需要使用模块化、组件化的方法来组织代码结构和管理资源。
一、要用模块化、组件化才能完成 Android 项目中类加载功能的原因
Android项目中的类加载功能是通过Java虚拟机(JVM)实现的,而JVM是基于Java语言的模块化和组件化设计思想来构建的。因此,在Android项目中,如果要完成类加载功能,就需要使用模块化、组件化的方法来组织代码结构和管理资源,以便让JVM能够更好地识别和加载所需的类文件。
Android工程的组件一般分为两种:
- application组件: 是指该组件本身就可以运行并打包成apk。
- lib组件: 是指该组件属于app的一部分,可以供其它组件使用但是本身不能打包成apk。
正常一个App中可以有多个module(模块),但是一般只会有一个module是设置为application的,其他均设置为library; 组件化开发就是要每个module都可以运行起来,因此在开发期间每个module均设置为application,发布时再进行合并。Android项目中代码量达到一定程度,编译将是一件非常痛苦的事情; 短则一两分钟,长则达到五六分钟;随着app业务的壮大,模块越来越多,代码量超10万是很正常的。这个时候我们会遇到以下问题:
- 稍微改动一个模块的一点代码都要编译整个工程,耗时耗力
- 公共资源、业务、模块混在一起耦合度太高
- 不方便测试
组件化开发可以有效降低代码模块的耦合度,使代码架构更加清晰,同时模块化的编译可以有效减少编译时间,当然总的编译时间是不会减少的,只是App模块化之后开发某个模块时,只需要编译特定模块,可以快速编译调试。通过模块化和组件化,可以将整个应用分解为多个模块或组件,并将其编译成不同的二进制文件,从而实现代码的复用和灵活性。同时,模块化和组件化还能简化开发流程、提高代码质量,并使代码更易于维护和升级。
二、模块化、组件化和插件化简介
在 Android 中,组件化、插件化和模块化都是很常见的架构设计手段,用于提高应用开发的灵活性、扩展性和复用性。组件化、插件化和模块化可以混合使用,根据项目的需求和规模选择合适的方案。
1、模块化
模块化最初的目的是将同一类型的代码整合在一起; 所以模块的功能相对复杂,但都同属于一个业务;不同模块之间也会存在依赖关系; 但大部分都是业务性的互相跳转,从地位上来说它们都是平级的。模块化编程是一种软件设计技术,强调将程序的功能分离为独立的可互换模块,因此每个模块都包含仅执行所需功能的一个方面所需的一切。简单来说就是:模块化是将功能拆分,分成相互独立的模块,以便于每个模块只包含与其自身功能相关的内容。
特点:
- 分属同一功能/业务的代码进行隔离(分装)成独立的模块,可以独立运行; 以页面、功能或其他不同粒度划分程度不同的模块,位于业务框架层,模块间通过接口调用,目的是降低模块间的耦合,由之前的主应用与模块耦合,变为主应用与接口耦合,接口与模块耦合;
- 模块就像有多个USB插口的充电宝,可以和多部手机充电,接口可以随意插拔,复用性很强,可以独立管理; 模块就像是独立的功能和项目(如淘宝:注册、登录、购物、直播…),可以调用组件来组成模块,多个模块可以组合成业务框架。
模块化设计是将整个项目按照功能模块进行拆分,在开发期间更加方便地进行分工协作。和组件化不同,模块化并不是将业务逻辑拆分到不同的组件内部,而是将整个项目按照业务模块进行逻辑的划分。在实现模块化的过程当中,可以采用以下步骤:
- 确定项目中每个模块的职责和功能。
- 使用 Gradle 等自动化工具来管理每个模块的依赖关系。
- 使用业务相关的命名空间来划分代码的功能,从而实现模块化。
- 定义接口或抽象类来规范模块之间的交互,避免相互依赖。
2、组件化
组件化最初的目的是代码重用,功能相对单一或者独立; 在整个系统的代码层次上位于最底层,被其他代码所依赖,所以说组件化是纵向分层。基于组件的软件工程 (CBSE) 也称为基于组件的发展 (CBD),是软件工程的一个分支,它强调在给定软件系统中提供的广泛功能方面的关注点分离。它是一种基于重用的方法,用于定义、实现和组合松散耦合的独立组件到系统中。这种做法旨在为软件本身和赞助此类软件的组织在短期和长期带来同样广泛的利益。简单来说就是:组件化就是基于可重用为目的的,将一个大的软件系统按照分离关注点的形式,拆分多个独立的组件,减少耦合。
组件化的核心思想是将业务拆分成独立的模块,利用模块间的相互独立性,将不同业务模块分割成不同的组件。这样可以提高代码的可复用性、可维护性和可拓展性。在实际开发中,可以采用以下步骤来实现组件化:
- 将项目按照不同的业务模块进行拆分。
- 使用路由框架来实现模块与模块之间的跳转(通常使用 ARouter)。
- 采用组件化设计模式,将组件间的依赖关系进行清晰地规划和管理,包括使用接口或抽象类定义组件的标准、使用消息机制来解耦组件之间的关系等。
- 在代码实现时要注意各个模块之间的耦合度,避免出现相互依赖、难以维护的情况。
特点:
- 把重复的代码提取出来合并成为一个个组件,组件最重要的就是重用(复用),位于框架最底层,其他功能都依赖于组件,可供不同功能使用,独立性强
- 组件就像一个个小的单位,多个组件可以组合成组件库,方便调用和复用,组件间也可以嵌套,小组件组合成大组件
3、插件化
插件化是指将应用程序的一部分功能打包成一个插件,通过动态加载和卸载实现功能的增减。插件化相比于常规的 apk 开发,更加灵活,能够动态的添加功能模块,且不需要重新编译打包整个应用程序,缩小了应用程序的体积。插件化的主要思想就是将应用的某些功能模块以插件的形式动态加载到主工程中,从而实现应用动态化、组件化、灵活化、轻量化等一系列的好处。
插件化的实现步骤如下:
- 开发插件化应用之前,需要先写一套基于插件化框架的核心代码,包括插件的加载、安装、卸载和类加载等逻辑。
- 编写插件模块时,需要将代码写成插件模式,即将代码和资源打包成一个 APK,并且确保插件与主工程是相互独立、互不干扰的。
- 主工程需要能够动态地加载某些插件,并进行跳转和使用。
- 需要考虑插件与主工程之间的数据传递、通信和资源共享等问题,从而实现完整的插件化功能。
特点:
- 宿主和插件分开编译
- 并发开发
- 动态更新插件
- 按需下载模块
- 方法数或变量数爆棚
- 插件无需安装即可运行
延伸阅读1:组件化开发的优点
- 业务模块分开,每个模块可以独立开发编译运行,解耦的同时也降低了项目的复杂度
- 开发单个模块时可以共享资源和工具类
- 可以针对单个模块测试, 开发调试时不需要对整个项目进行编译
- 多人合作时可以只关注自己的业务模块,把某一业务当成单一项目来开发
- 可以灵活的对业务模块进行组装和拆分