2021-04-07 19:15

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

author_path 一心啊056 icon_path
头图

本文来自微信公众号:玉刚说(ID:YugangTalk),原文标题:《Android 面试被问 “谈谈架构”,到底要怎样回答才好?》



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





什么是架构?架构可以是实际工程中的代码架构(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


  • ……


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





4


报名即送


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


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


该手册分为三大块:


  • 第一章 Android组件化初识


  • 第二章 Android组件化初探


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


第一章 Android组件化初识目录

  • 组件化和模块化的区别


  • 组件化和插件化的区别


  • 组件化开发的优势


  • 业务逻辑层


  • 组件化开发要遇到的问题


  • 从组件化实战来解决问题


  • Android组件化基础


  • ……


第二章 Android组件化初探目录

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


  • WanAndroid APP 组件化项目实战附demo版本更新效果图主要功能项目目录结构主要开源框架


  • ……


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

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


  • 得到 App


  • 微信 App


  • 蘑菇街 App


  • 爱奇艺 App


  • 美团 App


  • 美团Android组件化方案及组件消息总线modular-event实战


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


  • 携程App


  • 支付宝 App


  • ……





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


这份手册最具价值的就是实战项目部分。理论部分教科书上已经足够了,但是实战的分析是很难找到的。阅读这份资料,就是在和大佬对话,相信你的收获一定不少。


5


课程安排


 


授课老师:Lance


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


 


授课时间


4月6日(20:00—22:00)


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


  • 组件化项目架构简介


  • 页面路由原理与实现


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


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


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


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


  • 组件间如何完成通信?


  • ARouter通信原理


4月7日(20:00—22:00)


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


  • 自定义Gradle插件


  • Android插件Transform的应用


  • 字节码插桩优化路由框架


6


报名参加


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





扫码加兰兰老师微信报名训练营


立即领取


(如遇扫码频繁受限,点击左下角的阅读原文)


本文来自微信公众号:玉刚说(ID:YugangTalk)

本内容由作者授权发布,观点仅代表作者本人,不代表虎嗅立场。
如对本稿件有异议或投诉,请联系 tougao@huxiu.com。