**《960全网最全Android开发笔记》**

**《379页Android开发面试宝典》**

**《507页Android开发相关源码解析》**

>因为
文件太多,全部展示会影响篇幅,暂时就先列举这些部分截图,大家可以**[点击这里自行领取](https://docs.qq.com/doc/DSkNLaERkbnFoS0ZF)**。## 此次手写架构,
解决的问题是:
#### 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`来却换业务模块的话。**用**`busi
ness`**这个目录,将所有的业务模块包含进去,每个模块又是独立的`module`,这样既实现了业务
代码隔离,又能一眼看到所有的业务模块,正所谓,一目了然。
**
功能组件层**
> 每
一个业务模块,不可避免的需要用到一些公用工具类,有的是**第三方SDK的再次封装**,有的是**自己的工具类,**或者自己写的**
自定义控件**,还有可能是 **所有业务模块都需要的 辅助模块**,都放
在这里。
**路由框架层**
> 设计这一层,是想让app内的所有Activity,业务模块Fragment,以及模块之
间的数据交互,都由 这一层开放出去的接口来负责
**gradle统一
配置文件**
> 工程内部的一些全局gradle变量,放
在这里,整个工程都有效
**module编译设置**
> setting.gradle 配置要编译的module; 也可以做更复杂的操作,比如,写gradle
代码去
自动生成一些module,免除人为创建的麻烦.
## 总结
最后小编想说:不论以后选择什么方向发展,目前重要的是把Android方面的技术学好,毕竟其实对于程序员来说,要学习的知识
内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,**从来都是我们去适应环境,而不是环境来适应我们!**
> 这里附上我整理的几十套腾讯、字节跳动,京东,小米,头条、阿里、
美团等公司19年的Android面试题。把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。
由于篇幅有限,这里以
图片的形式给大家展示一小部分。

详细整理在GitHub可以见;
**[Android架构视频+BAT面试专题PDF+学习笔记](https://github.com/a120464/Android-P7/blob/master/Android%E5%BC%80%E5%8F%91%E4%B8%8D%E4%BC%9A%E8%BF%99%E4%BA%9B%EF%BC%9F%E5%A6%82%E4%BD%95%E9%9D%A2%E8%AF%95%E6%8B%BF%E9%AB%98%E8%96%AA%EF%BC%81.md)**
> 网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有
一个方向参考。
技术进阶之路很漫长,一起共勉吧~
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。