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

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

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

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

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

1. 优先集成路由框架

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

2. 业务模块拆分

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

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

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

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

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

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

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

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

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

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

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插件
Android组件化开发实践(十):通过Gradle插件统一规范

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,413评论 25 707
  • 用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你...
    hw1212阅读 12,680评论 2 59
  • 该文章属于刘小壮原创,转载请注明:刘小壮[https://www.jianshu.com/u/2de707c93d...
    刘小壮阅读 93,124评论 266 518
  • Java 8 新特性概述 转载自 唐学波, 林宝川, 和 俞顺杰 Java 8 新特性概述 1. 函数式接口 Ja...
    骇客与画家阅读 373评论 0 2
  • 阅人无数 阅后即焚
    pampa阅读 305评论 8 3