Android 架构面试一般都问些啥?需要怎么去应对?

“你现在客户端的架构是怎么样的?”这是前几天我在脉脉职言平台看到的一道题面试题。

Android 架构面试一般都问些啥?需要怎么去应对?_第1张图片

什么是架构?架构可以是实际工程中的代码架构(MVC、MVP、MVVM),是一种软件架构模式,是App实现过程中的一种编码模式或者编码规范。也可以是一种应用分层架构(组件化、容器化、平台化)

这次我们先来聊聊“组件化”!

先来看看一位童鞋在字节跳动二面遇到的问题:

  • “你认为什么是组件化?你的项目为什么要组件化?”
  • “你认为组件化的优缺点有哪些?”
  • “如何处理组件化后多Application问题?”
  • “组件之间AndroidManifest有哪些合并问题?”
  • “module和app之间的区别是什么?”
  • “组件间如何完成通信?”
  • “你使用ARouter通信,那它的原理你能介绍一下吗?”
  • ……

带着上述面试中经常被问的问题,我们来走进组件化。

1.啥是组件化?为啥要组件化?

在一个项目的开发过程中,前期我们可能把所有的功能模块都放到了一个moudle中,我们可以把这种结构称为单一工程模式。

单一工程开发模式的不足

  • 对工程的任意修改调试都要编译整个工程,效率十分低下

  • 不利于多人团队协同开发

  • 无法做到功能复用

  • 业务模块间耦合严重

为什么要项目组件化

随着项目壮大,开发人员和功能的增加,代码会越来越臃肿,各个模块之间的耦合越来越重,牵一发而动全身,这个时候为了保证项目质量,我们就需要对项目进行重构。

我们可以根据业务模块进行查分,把不同的业务模块放到不同的moudle中,实现各个业务之间的结构,这就是模块化。Android 中的模块就是业务模块,单指业务,是按照业务对 app 进行拆分。

而组件化,是在多模块基础上,进一步对功能的抽离封装,一个功能就是一个组件,IO,数据库,网络等等这些功能都是组件。同时组件可以独立开发并编译成一个独立的 APK 进行调试。组件对于模块的划分粒度更小,这样更便于组件的重用。

它的好处是当工程比较大的时候,便于各个开发者之间分工协作、同步开发;被分割出来的模块又可以在项目之间共享,从而达到复用的目的。组件化有诸多好处,尤其适用于比较大型的项目。

这里,我们可以简明扼要的从组件化的优点来回答这个问题

  • 提高编译速度
  • 实现超级解耦
  • 实现功能重用
  • 利于团队开发

Android 架构面试一般都问些啥?需要怎么去应对?_第2张图片

组件化是 保持整个 App 可持续地进行高质量开发的基础,近年来也一直是业界在积极探索和实践的方向,在深入理解组件化架构的过程中,将不断考验你的技术深度与广度。

2如何组件化?

你可能之前都听说过组件化开发,或者被其高大上的称谓吓到了,但它实际应用起来并不复杂,至少借助了现成的框架之后并不复杂。

这里我们先梳理一下,在应用组件化的时候需要解决的问题:

  1. 如何分成各个模块?
    我们可以根据业务来进行拆分,对于比较大的功能模块可以作为应用的一个模块来使用,但是也应该注意,划分出来的模块不要过多,否则可能会降低编译的速度并且增加维护的难度。

  2. 各个模块之间如何进行数据共享和数据通信?
    我们可以把需要共享的数据划分成一个单独的模块来放置公共数据。各个模块之间的数据通信,我们可以使用阿里的 ARouter 进行页面的跳转,使用封装之后的 RxJava 作为 EventBus 进行全局的数据通信。

  3. 如何将各个模块打包成一个独立的 APP 进行调试?
    首先这个要建立在2的基础上,然后,我们可以在各个模块的 gradle 文件里面配置需要加载的 AndroidManifest.xml 文件,并可以为每个应用配置一个独立的 Application 和启动类。

  4. 如何防止资源名冲突问题?
    遵守命名规约就能规避资源名冲突问题。

  5. 如何解决 library 重复依赖以及 sdk 和依赖的第三方版本号控制问题?
    可以将各个模块公用的依赖的版本配置到 settings.gradle 里面,并且可以建立一个公共的模块来配置所需要的各种依赖。

组件化项目架构图

Android 架构面试一般都问些啥?需要怎么去应对?_第3张图片

  • App壳工程:负责管理各个业务组件和打包APK,没有具体的业务功能;
  • 业务层:根据不同的业务构成独立的业务组件;
  • 功能层:对上层提供基础功能服务,如分享、推送等;
  • 基础库:包含了各种开源库以及和业务无关的各种自研工具库。

在组件化中,组件之间不允许横向依赖,也就导致了业务1需要与业务2通信时,业务1无法直接调用业务2中的代码、跳转业务2模块中的页面。

组件之间禁止横向依赖,如何在不同的组件之间进行页面的跳转?

3组件间如何进行通信?

上面涉及的就是通信的问题,在组件化中我们一般就会使用路由框架解决,以阿里ARouter跳转来说明:

在 Android 开发中可将 module 看成不同的网络,而对应的 Router 就是连接各个 module 的中转站,这个中转站可以对页面跳转的参数等进行统一处理。

ARouter 是阿里开源出来的一个页面跳转路由,使用 ARouter 可以替代隐式跳转来完成不同 module、不同组件之间的跳转以及跳转过程的监听、参数的传递等,ARouter 支持路径跳转和 URL 跳转两种方式,使用也非常灵活。

ARouter 与 Android 传统跳转方式的对比如下:

  1. 显示跳转需要依赖于类,而路由跳转通过指定的路径跳转;
  2. 隐式跳转通过 AndroidManifest 集中管理,导致协作开发困难;
  3. 原生使用 AndroidManifest 来注册,而路由使用注解注册
  4. 原生 startActivity 之后跳转过程交由 Android 系统控制,而路由跳转采用的是 AOP 切面编程可对跳转过程进行拦截和过滤。

那ARouter 的具体使用方法是怎样的?组件化开发还有哪些需要注意的点呢?

组件化开发要注意的几个点:

  • 如何注意包名和资源文件命名冲突问题
  • 如何做到Gradle的版本号的统一管理
  • 组件在Application和Library之间如何做到随意切换
  • AndroidManifest.xml文件的区分
  • Library不能再Gradle文件中有applicationld
  • ……

为了帮助到大家给搞的了解架构方面的知识点,特此在这分享有几位前阿里大牛整理了《Android 架构学习手册》+《深入理解Gradle框架》+《Android 中高级面试指南》等学习文档,大家可以根据自身原本的一个阶段进行参考学习。大家可以先收藏方便后续好复习翻阅,省掉在去网上查找的时间,以免在度踩坑,如果大家有需要的可以 直接通过点击此处↓↓↓ 进行参考学习!!!

Android 架构学习手册

Android 架构面试一般都问些啥?需要怎么去应对?_第4张图片

Android 架构面试一般都问些啥?需要怎么去应对?_第5张图片

深入理解Gradle框架

Android 架构面试一般都问些啥?需要怎么去应对?_第6张图片

如果大家有需要的可以 直接通过点击此处↓↓↓ 进行参考学习!!!

Android 中高级面试指南

Android 架构面试一般都问些啥?需要怎么去应对?_第7张图片

你可能感兴趣的:(移动开发,Android,面试,android,面试,架构,移动开发,组件化)