写点什么

android 音视频何俊林,音视频开发进阶指南

发布于: 刚刚

此次手写架构,解决的问题是:

1、让 App 内 各个功能模块能够独立开发单元测试,也可以 所有模块集成打包,统一测试

独立开发更改 gradle.properties 的配置,使得每个功能模块都成为 application, 可以独立打包成 apk,单独运行。单个模块,独立测试。


集成打包更改 gradle.properties 的配置,使得原先每个单独模块,都变成 library,被 主模块引用,这时候只有主模块能够打包 apk,所有功能都集成在这个 apk 内。

2、实现 功能模块的整体移植,灵活拔插

故事背景当你们公司有多个安卓开发人员,开发出核心业务相同,但是 UI 不同,其他业务不同的一系列 App 时(如果核心业务是 X,你们有 5 个开发人员,做出了 A,B,C,D,E 5 个 app,都包含核心业务 X,但是除了 X 之外,其他的业务模块各不相同)这时候,如果领导要把 A 里面的一个非核心功能,挪到 B 里面...


现状开发 B 的程序猿可能要骂娘,因为他在从移植 A 的代码中剥离代码 遇到了很多高耦合,低内聚 的类结构,挪过来之后,牵一发而动全身,动一点小地方,整个代码满江红。


理想如果这个时候,我们通过代码框架的配置,能够把 A 里面的一个模块,作为一个 module 移植到 工程内部,然后主 module 来引用这个 module,略微写一些代码来使得这个功能模块在 app 中生效。那么无论是多少个功能模块,都可以作为整体来 给其他 app 复用。这样开发人员也不用相互骂娘了,如果挪过来的模块存在 bug 或者其他问题,也不用甩锅,模块原本是谁开发的,找谁就好了。

3、保证 App 内 业务模块的相互隔离,但是又不妨碍业务模块之间的数据交互

我们开发 app 的功能模块,一个业务,可能是通过一个 Activity 或者 一个 Fragment 作为对外的窗口,也可能是。***所谓窗口,就是这个业务,相对于其他模块,"有且只有"一个入口,没有任何其他可以触达到这个业务的途径。***业务代码之间相互隔离,绝对不可以有相互引用。那么,既然相互不会引用,那 A 模块一定要用到 B 模块的数据,怎么办呢?下文提供解决方案。

正文大纲

1、代码结构现状以及理想状态一览

2、功能组件化的实现思路,实现组件移植拔插

3、参考 ARouter 源码,写出自己的 Router 框架,统一通过 Router 来进行模块的切换 以及 组件之间数据的交互

4、使用组件 api 化,在模块很多的情况下优化公共模块的结构

正文

1、代码结构现状以及理想状态一览

现状;



代码有模块化的迹象,但是没有对业务模块进行非常明显的模块化(不明白啥意思是吧?不明白就对了,app 这个 module 里面其实还有很多东西没有展示出来,请看下图:试想,把所有的模块集中到一个 module 的一个包里面,当你要移植某一个功能的时候,想想那酸爽....当然如果你口味别致,那当我没说)



理想:



理想化的话,参照:理想.png; 项目结构层次分明,脉络清晰

按照图中的分层,详细解释一下:

外壳层:app module


内部代码只写 app 的骨骼框架,比如说,你的 app 是这个样子的结构:



下方有 N 个 TAB,通过 Fragment 来进行切换模块。这种架构肯定不少见。


这个时候,外壳层 app module,就只需要写上 上面这种 UI 架构的框架代码就行了,至于有多少个模块,需要代码去读取配置进行显示。你问我怎么写这种 UI 框架吗?网上一大把的,如果实在找不到,来我的 github


业务层


我们的业务模块,对外接口可能是一个Activity* *(**比如说,登录模块,只对外提供一个LoginActivity,有且仅有这一个窗口)或者 是一个Fragment,就像上图(典型的 app 架构.png), 如果 app 的 UI 框架是通过切换Fragment来却换业务模块的话。business**这个目录,将所有的业务模块包含进去,每个模块又是独立的module,这样既实现了业务代码隔离,又能一眼看到所有的业务模块,正所谓,一目了然。


功能组件层


每一个业务模块,不可避免的需要用到一些公用工具类,有的是第三方 SDK 的再次封装,有的是自己的工具类,或者自己写的自定义控件,还有可能是 所有业务模块都需要的 辅助模块,都放在这里。


路由框架层


设计这一层,是想让 app 内的所有 Activity,业务模块 Fragment,以及模块之间的数据交互,都由 这一层开放出去的接口来负责


gradle 统一配置文件


工程内部的一些全局 gradle 变量,放在这里,整个工程都有效


module 编译设置


setting.gradle 配置要编译的 module; 也可以做更复杂的操作,比如,写 gradle 代码去自动生成一些 module,免除人为创建的麻烦.

文末

架构师不是天生的,是在项目中磨练起来的,所以,我们学了技术就需要结合项目进行实战训练,那么在 Android 里面最常用的架构无外乎 MVC,MVP,MVVM,但是这些思想如果和模块化,层次化,组件化混和在一起,那就不是一件那么简单的事了,我们需要一个真正身经百战的架构师才能讲解透彻其中蕴含的深理。




一线互联网 Android 面试题总结含详解(初级到高级专题)



**本文已被[CODING 开源项目:《Android 学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》](


)



收录**


最后自我介绍一下,小编 13 年上海交大毕业,曾经在小公司待过,也去过华为、OPPO 等大厂,18 年进入阿里一直到现在。

深知大多数初中级 Android 工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此也是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

用户头像

还未添加个人签名 2021.10.19 加入

还未添加个人简介

评论

发布
暂无评论
android音视频何俊林,音视频开发进阶指南