Android组件化开发实践(六):老项目实施组件化

简介: 比较早期的时候,我们开发APP都是采用单一工程模式,随着业务的发展,APP越来越庞大,开发人员越来越多,所以必然面临着将老项目进行组件化的过程。在将老项目进行组件化的过程中,会面临很多的问题,以我自己的经验为例,主要有以下点:代码年久失修,文档缺失,不敢随意修改,否则会牵一发而动全身,引起现有正常业务的运行;进行组件化重构需要花费比较长的时间,业务不可能停下来等着你去重构;组件化重构后,需要全量回归测试,测试比较花费时间;相信每个人都会碰到这些问题,组件化重构势在必行,但是老板不可能专门给你几个月,啥业务都不做就让你进行代码重构。

比较早期的时候,我们开发APP都是采用单一工程模式,随着业务的发展,APP越来越庞大,开发人员越来越多,所以必然面临着将老项目进行组件化的过程。

在将老项目进行组件化的过程中,会面临很多的问题,以我自己的经验为例,主要有以下点:

  1. 代码年久失修,文档缺失,不敢随意修改,否则会牵一发而动全身,引起现有正常业务的运行;
  2. 进行组件化重构需要花费比较长的时间,业务不可能停下来等着你去重构;
  3. 组件化重构后,需要全量回归测试,测试比较花费时间;

相信每个人都会碰到这些问题,组件化重构势在必行,但是老板不可能专门给你几个月,啥业务都不做就让你进行代码重构。那怎么办呢,我这里讲讲自己的一些经验,供大家参考。

1. 优先集成路由框架

首先,在老项目中引入路由框架,不管是自己简单设计的也好,还是采用第三方框架,新开发的功能页面跳转一律采用路由,老的页面跳转逐步替换。这样做的目的是尽量减少代码耦合,为后面进行模块拆分打下基础。

2. 业务模块拆分

一个老项目必然经过很多人的手,你不一定要对所有代码都很熟悉,但是你必须要基本了解所有的业务功能,在此基础上对所有业务进行初步的模块划分。这个业务模块划分,粒度可以粗一点,原则上一个业务模块只是实现某一个子功能。

以我自己为例,我会采用xmind或类似工具,将所拆分的业务画出来,就像一个公司的组织架构一样:公司由若干个大的事业部组成,每个事业部包含若干个二级部门,二级部门又有可能包含三级部门。将你的项目划分成几个大的业务,每个大的业务再细化成若干个小的业务,业务层次划分不必太细,一般保持2层即可,否则设计的组件太多,实施起来会更加繁琐。

img_a85efefbd755d3378b4fce7cb80f5272.png

总之,最后你一定要有一张你的整体业务架构图,如上图所示,它仅仅是你对APP所有业务的模块划分。

3. 尝试抽取出一个基础的业务组件

罗马不是一天造成的,人不能一口吃成一个胖子。同样,你也不可能一下子将所有的业务,都进行组件化剥离出来。万事开头难,特别是老项目在进行组件化重构时,往往我们会有无从下手的感觉。回顾一下上一节中你整理出来的业务架构图,从中找出一个你觉得最核心最基础的业务,也就是你觉得这个业务必须最先进行组件化重构。通常情况下,我会选择“注册/登录”这个业务模块,在我们的应用里,很多业务都是需要用户登录的。

首先,新建一个工程,不管三七二十一,把老工程里的注册、登录相关的代码拷贝过来,包括Activity类、布局xml文件、图片文件等,其他的暂时不要考虑。这个时候,你会发现新的工程里,到处都是红色的警告错误,要么依赖的某个类不存在,要么依赖的某个资源文件不存在,根本无法编译运行。不能运行就对了,显然这种粗暴的方式行不通,如果你尝试去解决,你会发现类似这样的依赖路径:A -> B -> C ->D,你得把所有依赖的类或资源拷贝到新工程里,这可能会形成一颗巨大的依赖树,实施起来难度太大了,基本不现实。

显然,想直接把老工程的代码原样复制过来,期望一次性成功,大部分情况下都不会成功。那么我们要怎么做呢,现在又会有一种无从下手的感觉了。

4. 画出代码的依赖关系图

我们把老工程的代码复制过来之后,发现依赖的资源太多了,压根没法编译运行。既然我想把“注册、登录”这个业务模块做成一个独立的组件,那么这个业务模块里所依赖的其他资源,是不是也得是个独立的组件。同样,采用xmind画出“注册、登录”这个业务所依赖的其他资源,如下图所示:

img_45b2d70a7fbac780b9e5730648b1b2d4.png

通过查看新工程里报错的地方,大概可以总结出“注册、登录”业务需要依赖上图所示的这些资源。

5. 抽取出基础功能组件

当我们把“注册、登录”所有依赖的资源列举出来之后,我们先把这些依赖的东西,从老工程中抽取出来,做成单独的组件。

  • 日志记录
    打印或者记录程序运行时日志。
  • 网络请求
    请求服务端接口用到的网络框架,例如OkHttp、Retrofit等,或者是自己封装的框架。
  • 数据库等数据存储
    用户登录后,需要保存登录信息到本地,采用数据库或者SharedPreference等存储。
  • 图片、样式、字符串等资源
    UI相关的各种资源,有些资源是全局通用的,有些是该业务里独有的,我们只把通用的UI资源放到组件里,因为这些需要共用的。
  • 常用的一些工具类
    例如字符串处理、日期格式化、dp与px转换等。
  • BaseActivity等Base类
    BaseActivity是所有Activity都必须继承的父类,在这里定义一些Activity通用的行为,例如友盟统计埋点等。

我们先按照这些功能,建立对应的基础功能组件模块,然后将注册、登录业务里需要用到的从老工程移到对应的组件模块里。刚开始的时候,我们的目标是先创建组件,组件的功能也许很薄弱,代码也许很凌乱,规范也没有,但是我们先不管它,先做到能用就行。先有基本的框架,等架子搭起来之后,我们再去丰满血肉。

6. 重新封装基础业务组件

上一节中的基础功能组件封装好之后,在“注册、登录”这个组件工程里,依赖需要的基础组件,然后逐步解决冲突错误等,直到该工程能够独立运行。最后,我们需要花时间调整代码规范,优化代码结构等。

7. 新老代码共存

到现在为止,我们已经将一个业务组件独立出来。接下来,我们需要将该组件集成到老工程里去,只需要将注册、登录的跳转入口改一下,就可以使用了。经过测试之后,逐步删除老工程里的旧代码,这样下来之后,注册、登录使用的是新的组件,而其他功能依旧没变。

接下来的时间里,我们采取开发新功能与重构并行的方式,每周安排一部分人去重构,一部分人依旧在老工程里开发,经过一段时间之后,逐步将老工程的业务全部组件化,到最后老工程里应该几乎没代码了。但是在这个期间,我们的项目工程里可能会包含很多冗余的代码、冗余的资源文件等,这也会导致APP的包大小增大,但这些是不可避免的。

小结

老项目组件化是一个渐进的过程,我们必须先选定一个突破口,完成一个组件之后,后面其他的业务实施组件化就会相对容易多了。我们必须控制好整个组件化实施的周期,严格按照计划执行,同时要把握好新功能开发与重构之间的度。

系列文章
Android组件化开发实践(一):为什么要进行组件化开发?
Android组件化开发实践(二):组件化架构设计
Android组件化开发实践(三):组件开发规范
Android组件化开发实践(四):组件间通信问题
Android组件化开发实践(五):组件生命周期管理
Android组件化开发实践(六):老项目实施组件化
Android组件化开发实践(七):开发常见问题及解决方案
Android组件化开发实践(八):组件生命周期如何实现自动注册管理
Android组件化开发实践(九):自定义Gradle插件

目录
相关文章
|
21天前
|
Java Android开发
Android 开发获取通知栏权限时会出现两个应用图标
Android 开发获取通知栏权限时会出现两个应用图标
12 0
|
26天前
|
调度 数据库 Android开发
构建高效Android应用:Kotlin协程的实践与优化
在Android开发领域,Kotlin以其简洁的语法和平台友好性成为了开发的首选语言。其中,Kotlin协程作为处理异步任务的强大工具,它通过提供轻量级的线程管理机制,使得开发者能够在不阻塞主线程的情况下执行后台任务,从而提升应用性能和用户体验。本文将深入探讨Kotlin协程的核心概念,并通过实例演示如何在实际的Android应用中有效地使用协程进行网络请求、数据库操作以及UI的流畅更新。同时,我们还将讨论协程的调试技巧和常见问题的解决方法,以帮助开发者避免常见的陷阱,构建更加健壮和高效的Android应用。
35 4
|
28天前
|
移动开发 Java Android开发
构建高效Android应用:Kotlin协程的实践之路
【2月更文挑战第31天】 在移动开发领域,性能优化和流畅的用户体验一直是开发者追求的目标。随着Kotlin语言的流行,其异步编程解决方案——协程(Coroutines),为Android应用带来了革命性的并发处理能力。本文将深入探讨Kotlin协程的核心概念、设计原理以及在Android应用中的实际应用案例,旨在帮助开发者掌握这一强大的工具,从而提升应用的性能和响应能力。
|
18天前
|
Java Android开发 开发者
构建高效Android应用:Kotlin协程的实践与优化
在响应式编程范式日益盛行的今天,Kotlin协程作为一种轻量级的线程管理解决方案,为Android开发带来了性能和效率的双重提升。本文旨在探讨Kotlin协程的核心概念、实践方法及其在Android应用中的优化策略,帮助开发者构建更加流畅和高效的应用程序。通过深入分析协程的原理与应用场景,结合实际案例,本文将指导读者如何优雅地解决异步任务处理,避免阻塞UI线程,从而优化用户体验。
|
12天前
|
移动开发 API Android开发
构建高效Android应用:探究Kotlin协程的优势与实践
【4月更文挑战第7天】 在移动开发领域,性能优化和应用响应性的提升一直是开发者追求的目标。近年来,Kotlin语言因其简洁性和功能性在Android社区中受到青睐,特别是其对协程(Coroutines)的支持,为编写异步代码和处理并发任务提供了一种更加优雅的解决方案。本文将探讨Kotlin协程在Android开发中的应用,揭示其在提高应用性能和简化代码结构方面的潜在优势,并展示如何在实际项目中实现和优化协程。
|
12天前
|
XML 开发工具 Android开发
构建高效的安卓应用:使用Jetpack Compose优化UI开发
【4月更文挑战第7天】 随着Android开发不断进化,开发者面临着提高应用性能与简化UI构建流程的双重挑战。本文将探讨如何使用Jetpack Compose这一现代UI工具包来优化安卓应用的开发流程,并提升用户界面的流畅性与一致性。通过介绍Jetpack Compose的核心概念、与传统方法的区别以及实际集成步骤,我们旨在提供一种高效且可靠的解决方案,以帮助开发者构建响应迅速且用户体验优良的安卓应用。
|
15天前
|
监控 算法 Android开发
安卓应用开发:打造高效启动流程
【4月更文挑战第5天】 在移动应用的世界中,用户的第一印象至关重要。特别是对于安卓应用而言,启动时间是用户体验的关键指标之一。本文将深入探讨如何优化安卓应用的启动流程,从而减少启动时间,提升用户满意度。我们将从分析应用启动流程的各个阶段入手,提出一系列实用的技术策略,包括代码层面的优化、资源加载的管理以及异步初始化等,帮助开发者构建快速响应的安卓应用。
|
15天前
|
Java Android开发
Android开发之使用OpenGL实现翻书动画
本文讲述了如何使用OpenGL实现更平滑、逼真的电子书翻页动画,以解决传统贝塞尔曲线方法存在的卡顿和阴影问题。作者分享了一个改造后的外国代码示例,提供了从前往后和从后往前的翻页效果动图。文章附带了`GlTurnActivity`的Java代码片段,展示如何加载和显示书籍图片。完整工程代码可在作者的GitHub找到:https://github.com/aqi00/note/tree/master/ExmOpenGL。
19 1
Android开发之使用OpenGL实现翻书动画
|
15天前
|
Android开发 开发者
Android开发之OpenGL的画笔工具GL10
这篇文章简述了OpenGL通过GL10进行三维图形绘制,强调颜色取值范围为0.0到1.0,背景和画笔颜色设置方法;介绍了三维坐标系及与之相关的旋转、平移和缩放操作;最后探讨了坐标矩阵变换,包括设置绘图区域、调整镜头参数和改变观测方位。示例代码展示了如何使用这些方法创建简单的三维立方体。
13 1
Android开发之OpenGL的画笔工具GL10
|
21天前
|
Android开发
Android开发小技巧:怎样在 textview 前面加上一个小图标。
Android开发小技巧:怎样在 textview 前面加上一个小图标。
12 0