您的位置 首页 科技创新

带着上述面试中经常被问的问题,怎么处理呢

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

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

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

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

“你认为什么是组件化?你的项目为什么要组件化?”

“你认为组件化的优缺点有哪些?”

“如何处理组件化后多Application问题?”

“组件之间AndroidManifest有哪些合并问题?”

“module和app之间的区别是什么?”

“组件间如何完成通信?”

“你使用ARouter通信,那它的原理你能介绍一下吗?”

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

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

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

>>>>

单一工程模式的不足

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

不利于多人团队协同

无法做到功能复用

业务模块间耦合严重

>>>>

为什么要项目组件化

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

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

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

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

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

提高编译速度

实现超级解耦

实现功能重用

利于团队

带着上述面试中经常被问的问题,怎么处理呢

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

如何组件化?

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

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

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

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

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

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

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

带着上述面试中经常被问的问题,怎么处理呢

App壳工程: 负责各个业务组件和打包APK,没有具体的业务功能。

业务层: 根据不同的业务构成独立的业务组件。

基础库: 包含了各种开源库以及和业务无关的各种自研工具库。

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

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

组件间如何进行通信?

因为组件间没有办法做实现上的直接依赖,所以组件间通信我们面临两个大问题:

1. 组件间页面的跳转,例如我在ugc模块浏览用户帖子的时候,如果需要评论,则需要先跳转到登陆页面去进行登陆,但是我们ugc组件和登陆组件是完全隔离的,也就是说我们访问不到登陆页面,这个时候要怎么做的?

2. 依赖其他组件的服务,还是拿登陆来举例,很多时候我们在app内的行为是依赖登陆成功回调的,但是我们对于登陆组件无法直接依赖,这个时候登陆组件就需要下沉服务接口,登陆组件内去具体服务,我们通过类似于服务发现的方式去拿到各个组件的服务进而完成通信。

对于这两个问题,业界的一个比较知名的路由框架,ARouter都了解决方案。

ARouter是阿里对外开源的一个路由方案,其实不仅是阿里,美团也对外开源的WMRouter,bilibili开源了BRouter,滴滴开源了DRouter…不过不管怎么说,ARouter目前依旧是使用较为广泛的一个路由方案,可见其学习价值。

ARouter对于页面跳转,将其改变为path寻址,有点类似于我们上网的url,给每个页面定义一个url,这样就不依赖具体的实现类了。

那么ARouter是怎么实现通过url来跳转页面呢?其实其背后依赖了APT的技术方案,但是APT方案也有它的痛点,造成早期的 ARouter框架在初始化时极其耗时,所以ARouter在后期了一个plugin用于提升效率。

那ARouter 的具体使用方法是怎样的?

组件化还有哪些需要注意的点呢?

组件化要注意的几个点:

因为组件间是独立的,那么如果组件中出现了同名但不同内容的资源,会崩溃吗?怎么处理呢?

组件化还有个目标是组件可以独立运行,组件如何既可独立运行,又能成为壳工程的依赖模块呢?

组件独立运行时,依赖的初始化的任务怎么办呢?该放哪里呢?

在这里为了帮助大家 更好的解决以上我们组件化需要注意的问题和了解ARouter 的具体使用方法,本次特邀课堂的Lance老师手把手带大家从零开始进行一波组件化路由SDK。

报名即送

参加本次训练营的学员可以免费获得课堂独家整理,209页的《高级Android组件化强化实战手册》

该手册都是由一线互联网技术人员在实际工作过程中的的一些经验和技术总结。详细记录了在、阿里巴巴、爱奇艺、美团、得到App等10多家架构演进中的组件化实战项目(附源码)

该手册分为三大块:

第一章 Android组件化初识

第二章 Android组件化初探

第三章 架构演化(大厂篇)

第一章 Android组件化初识目录

组件化和模块化的区别

组件化和插件化的区别

组件化的优势

业务逻辑层

组件化要遇到的问题

从组件化实战来解决问题

Android组件化基础

第二章 Android组件化初探目录

组件化演示案例概述模块化和组件化组件化Demo组件application和library动态切换…

第三章 架构演化(大厂篇)

从智行 Android 项目看组件化架构实践

得到 App

蘑菇街 App

爱奇艺 App

美团 App

美团Android组件化方案及组件总线modular-实战

美团Android总线的演进之路:用LiveDataBus替代RxBus、EventBus

携程App

支付宝 App

带着上述面试中经常被问的问题,怎么处理呢

以上就是课堂整理的209页Android组件化强化实战手册,参与本次训练营免费获取完整PDF文档(含源码)

课程安排

授课老师: Lance

前爱奇艺高级架构师 某游戏公司主程,高级工程师。多年移动平台经验,涉猎广泛,热爱技术与研究。主要对NDK、架构与性能优化拥有深入的理解及经验。他还主导过多个组件化架构的APP项目,有对老项目进行重构的,也有一开始就采用组件化架构的新项目,授课严谨负责。

授课时间

4月6日 —

字节跳动面试必问:为什么要项目组件化?

组件化项目架构简介

页面路由原理与实现

APT技术编译时代码自动生成

如何处理组件化后多Application问题?

组件之间AndroidManifest有哪些合并问题?

module和app之间的区别是什么?

组件间如何完成通信?

ARouter通信原理

4月7日 —

字节码插桩与Gradle路由框架的终极实现

自定义Gradle插件

Android插件Transform的应用

字节码插桩优化路由框架

报名参加

文中福利免费赠给参加训练营的学员

本文相关词条概念解析:

组件

组件(Component)是对数据和方法的简单封装。C++Builder中,一个组件就是一个从TComponent派生出来的特定对象。组件可以有自己的属性和方法。属性是组件数据的简单访问者。方法则是组件的一些简单而可见的功能。使用组件可以实现拖放式编程、快速的属性处理以及真正的面向对象的设计。VCL和CLX组件是C++Builder系统的核心。

热门文章

发表评论

没有账号? 忘记密码?

社交账号快速登录