网站首页 > 教程分享 正文
“你现在客户端的架构是怎么样的?”这是前几天我在脉脉职言平台看到的一道题面试题。
什么是架构?架构可以是实际工程中的代码架构(MVC、MVP、MVVM),是一种软件架构模式,是App实现过程中的一种编码模式或者编码规范。也可以是一种应用分层架构(组件化、容器化、平台化)
这次我们先来聊聊“组件化”!
先来看看一位童鞋在字节跳动二面遇到的问题:
- “你认为什么是组件化?你的项目为什么要组件化?”
- “你认为组件化的优缺点有哪些?”
- “如何处理组件化后多Application问题?”
- “组件之间AndroidManifest有哪些合并问题?”
- “module和app之间的区别是什么?”
- “组件间如何完成通信?”
- “你使用ARouter通信,那它的原理你能介绍一下吗?”
- ……
带着上述面试中经常被问的问题,我们来走进组件化。
1啥是组件化?为啥要组件化?
在一个项目的开发过程中,前期我们可能把所有的功能模块都放到了一个moudle中,我们可以把这种结构称为单一工程模式。
>>>>
单一工程开发模式的不足
- 对工程的任意修改调试都要编译整个工程,效率十分低下
- 不利于多人团队协同开发
- 无法做到功能复用
- 业务模块间耦合严重
>>>>
为什么要项目组件化
随着项目壮大,开发人员和功能的增加,代码会越来越臃肿,各个模块之间的耦合越来越重,牵一发而动全身,这个时候为了保证项目质量,我们就需要对项目进行重构。
我们可以根据业务模块进行查分,把不同的业务模块放到不同的moudle中,实现各个业务之间的结构,这就是模块化。Android 中的模块就是业务模块,单指业务,是按照业务对 app 进行拆分。
而组件化,是在多模块基础上,进一步对功能的抽离封装,一个功能就是一个组件,IO,数据库,网络等等这些功能都是组件。同时组件可以独立开发并编译成一个独立的 APK 进行调试。组件对于模块的划分粒度更小,这样更便于组件的重用。
它的好处是当工程比较大的时候,便于各个开发者之间分工协作、同步开发;被分割出来的模块又可以在项目之间共享,从而达到复用的目的。组件化有诸多好处,尤其适用于比较大型的项目。
这里,我们可以简明扼要的从组件化的优点来回答这个问题
- 提高编译速度
- 实现超级解耦
- 实现功能重用
- 利于团队开发
组件化是 保持整个 App 可持续地进行高质量开发的基础,近年来也一直是业界在积极探索和实践的方向,在深入理解组件化架构的过程中,将不断考验你的技术深度与广度。
2如何组件化?
你可能之前都听说过组件化开发,或者被其高大上的称谓吓到了,但它实际应用起来并不复杂,至少借助了现成的框架之后并不复杂。
这里我们先梳理一下,在应用组件化的时候需要解决的问题:
- 如何分成各个模块?我们可以根据业务来进行拆分,对于比较大的功能模块可以作为应用的一个模块来使用,但是也应该注意,划分出来的模块不要过多,否则可能会降低编译的速度并且增加维护的难度。
- 各个模块之间如何进行数据共享和数据通信?我们可以把需要共享的数据划分成一个单独的模块来放置公共数据。各个模块之间的数据通信,我们可以使用阿里的 ARouter 进行页面的跳转,使用封装之后的 RxJava 作为 EventBus 进行全局的数据通信。
- 如何将各个模块打包成一个独立的 APP 进行调试?首先这个要建立在2的基础上,然后,我们可以在各个模块的 gradle 文件里面配置需要加载的 AndroidManifest.xml 文件,并可以为每个应用配置一个独立的 Application 和启动类。
- 如何防止资源名冲突问题?遵守命名规约就能规避资源名冲突问题。
- 如何解决 library 重复依赖以及 sdk 和依赖的第三方版本号控制问题?可以将各个模块公用的依赖的版本配置到 settings.gradle 里面,并且可以建立一个公共的模块来配置所需要的各种依赖。
组件化项目架构图
- App壳工程:负责管理各个业务组件和打包APK,没有具体的业务功能;
- 业务层:根据不同的业务构成独立的业务组件;
- 功能层:对上层提供基础功能服务,如分享、推送等;
- 基础库:包含了各种开源库以及和业务无关的各种自研工具库。
在组件化中,组件之间不允许横向依赖,也就导致了业务1需要与业务2通信时,业务1无法直接调用业务2中的代码、跳转业务2模块中的页面。
组件之间禁止横向依赖,如何在不同的组件之间进行页面的跳转?
3组件间如何进行通信?
上面涉及的就是通信的问题,在组件化中我们一般就会使用路由框架解决,以阿里ARouter跳转来说明:
在 Android 开发中可将 module 看成不同的网络,而对应的 Router 就是连接各个 module 的中转站,这个中转站可以对页面跳转的参数等进行统一处理。
ARouter 是阿里开源出来的一个页面跳转路由,使用 ARouter 可以替代隐式跳转来完成不同 module、不同组件之间的跳转以及跳转过程的监听、参数的传递等,ARouter 支持路径跳转和 URL 跳转两种方式,使用也非常灵活。
ARouter 与 Android 传统跳转方式的对比如下:
- 显示跳转需要依赖于类,而路由跳转通过指定的路径跳转;
- 隐式跳转通过 AndroidManifest 集中管理,导致协作开发困难;
- 原生使用 AndroidManifest 来注册,而路由使用注解注册
- 原生 startActivity 之后跳转过程交由 Android 系统控制,而路由跳转采用的是 AOP 切面编程可对跳转过程进行拦截和过滤。
那ARouter 的具体使用方法是怎样的?组件化开发还有哪些需要注意的点呢?
组件化开发要注意的几个点:
- 如何注意包名和资源文件命名冲突问题
- 如何做到Gradle的版本号的统一管理
- 组件在Application和Library之间如何做到随意切换
- AndroidManifest.xml文件的区分
- Library不能再Gradle文件中有applicationld
猜你喜欢
- 2025-05-05 有了这份900多页的Android面试指南,你离大厂Offer还远吗?
- 2025-05-05 K2 Blackpearl 流程平台总体功能介绍:常规流程功能
- 2025-05-05 零基础安卓开发起步(一)(安卓开发入门视频)
- 2025-05-05 教程:让你的安卓像Windows一样实现程序窗口化运行
- 2025-05-05 Android事件总线还能怎么玩?(事件总线有什么好处)
- 2025-05-05 Android开发工具Parcel和Serialize
- 2025-05-05 Android 中Notification的运用(notification widget安卓)
- 2025-05-05 Android退出所有Activity最优雅的方式
- 2025-05-05 MT管理器-简单实战-去除启动页(mt管理器怎么去除软件弹窗)
- 2025-05-05 react native中自定义 URL Scheme并跳转到指定页面
你 发表评论:
欢迎- 最近发表
-
- 有了这份900多页的Android面试指南,你离大厂Offer还远吗?
- K2 Blackpearl 流程平台总体功能介绍:常规流程功能
- 零基础安卓开发起步(一)(安卓开发入门视频)
- 教程:让你的安卓像Windows一样实现程序窗口化运行
- Android事件总线还能怎么玩?(事件总线有什么好处)
- Android 面试被问“谈谈架构”,到底要怎样回答才好?
- Android开发工具Parcel和Serialize
- Android 中Notification的运用(notification widget安卓)
- Android退出所有Activity最优雅的方式
- MT管理器-简单实战-去除启动页(mt管理器怎么去除软件弹窗)
- 标签列表
-
- css导航条 (66)
- sqlinsert (63)
- js提交表单 (60)
- param (62)
- parentelement (65)
- jquery分享 (62)
- check约束 (64)
- curl_init (68)
- sql if语句 (69)
- import (66)
- chmod文件夹 (71)
- clearinterval (71)
- pythonrange (62)
- 数组长度 (61)
- javafx (59)
- 全局消息钩子 (64)
- sort排序 (62)
- jdbc (69)
- php网页源码 (59)
- assert h (69)
- httpclientjar (60)
- postgresql conf (59)
- winform开发 (59)
- mysql数字类型 (71)
- drawimage (61)
本文暂时没有评论,来添加一个吧(●'◡'●)