程序员的知识教程库

网站首页 > 教程分享 正文

Android 面试被问“谈谈架构”,到底要怎样回答才好?

henian88 2025-05-05 15:53:50 教程分享 3 ℃ 0 评论

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

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

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

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

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

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



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

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


>>>>

单一工程开发模式的不足


  • 对工程的任意修改调试都要编译整个工程,效率十分低下
  • 不利于多人团队协同开发
  • 无法做到功能复用
  • 业务模块间耦合严重


>>>>

为什么要项目组件化


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

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

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

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

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

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


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


2如何组件化?

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

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

  1. 如何分成各个模块?我们可以根据业务来进行拆分,对于比较大的功能模块可以作为应用的一个模块来使用,但是也应该注意,划分出来的模块不要过多,否则可能会降低编译的速度并且增加维护的难度。
  2. 各个模块之间如何进行数据共享和数据通信?我们可以把需要共享的数据划分成一个单独的模块来放置公共数据。各个模块之间的数据通信,我们可以使用阿里的 ARouter 进行页面的跳转,使用封装之后的 RxJava 作为 EventBus 进行全局的数据通信。
  3. 如何将各个模块打包成一个独立的 APP 进行调试?首先这个要建立在2的基础上,然后,我们可以在各个模块的 gradle 文件里面配置需要加载的 AndroidManifest.xml 文件,并可以为每个应用配置一个独立的 Application 和启动类。
  4. 如何防止资源名冲突问题?遵守命名规约就能规避资源名冲突问题。
  5. 如何解决 library 重复依赖以及 sdk 和依赖的第三方版本号控制问题?可以将各个模块公用的依赖的版本配置到 settings.gradle 里面,并且可以建立一个公共的模块来配置所需要的各种依赖。

组件化项目架构图

  • 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

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表