电商公司Android 面试总问组件化相关内容_android 电商面试问题

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注Android)
img

正文

面试的点各不相同,有组件化架构设计、插件化框架设计、路由架构设计、热修复设计等问题,但是最终都是殊途同归,所有的问题都汇集在这,如何对手机淘宝组架构设计?

组件化如何实现,组件化与插件化的差别在 哪里,该怎么选型

**面试官:**组件化如何实现,组件化与插件化的差别在哪里,该怎么

选型
**心理分析:**面试官从架构层次 了解求职者是否用过 模块化 组件 化 和插件化,在过去经验有没有运用过这些技术到项目中,这道 题属于一个连环炮。求职者该格外小心

**求职者:**应该从 App 开发的需求来定义技术选型,分别说说模 块化,组件化 插件化的优势和区别

一、组件化

组件化,就是把 APP 拆分成不同功能模块,形成独立组件,让宿主调用。 组件 化不一定是插件化,组件化是一个更大的概念:把模块解耦,组件之间代码不依 赖,宿主可以依赖组件;而插件化则具体到了技术点上,宿主通过 动态加载 来 调用组件,宿主不依赖组件,达到 完全解耦 的目的(比如图片缓存就可以看成 一个组件被多个 App 共用)。

**适合于项目大 但是功能相对集中。**比如 一个金融类的 App 里面只包含金融的 功能,金融功能又会有 借贷,理财,线下交易,把这些模块抽成单独的组件 二、插件化 Android 程序每次更新都要下载一个完整的 apk,而很多时候软件只是更新了一 个小功能而已,这样的话,就显得很麻烦。如果把 android 程序做成主程序+插 件化的形式呢,这样才利于小功能的扩展(比如一般 App 的皮肤样式就可以看 成一个插件)。

二、插件化

Android 程序每次更新都要下载一个完整的 apk,而很多时候软件只是更新了一 个小功能而已,这样的话,就显得很麻烦。如果把 android 程序做成主程序+插 件化的形式呢,这样才利于小功能的扩展(比如一般 App 的皮肤样式就可以看 成一个插件)。

通过 gradle 配置的方式,将打 debug 包和 release 包分开。这 样会有一个好处,开发一个模块,在 debug 的时候,可以打成一 个 apk ,独立运行测试,可以完全独立于整个宿主 APP 的其他 所有组件;待到要打 release 包的时候,再把这个模块作为一个 library ,打成 aar ,作为整个宿主 APP 的一部分。而 debug 和 release 的切换都是通过 gradle 配置,可以做到无缝切换。至于 模块之间的跳转,可以用别名的方式,而不是用 Activity 和 Fragment 类名。这样所有的模块和宿主 APP 都是完全解耦的, 彻底解决了并行开发的可能造成的交叉依赖等问题

主要原理是:主要利用 Java ClassLoader 的原理,如 Android 的 DexClassLoader,可动态加载的内容包括 apk、dex、jar 等。如下

插件化的优势:

  • 适应并行开发,解耦各个模块,避免模块之间的交叉依赖,加快编译速度, 从而提高并行开发效率。
  • 满足产品随时上线的需求
  • 修复因为我们对自己要求不严格而写出来的 bug。
  • 插件化的结果:分为稳定的 release 版本和不稳定的 snapshot 版本,每 个模块都高度解耦,没有交叉依赖,不会出现一个模块依赖了另一个模块, 其中一个人改了这个模块的代码,对另一个模块造成影响。

淘宝的框架是用了 osgi 的 bundle 概念,整个应用框架生命周期完整。 **适合于项目超级大 但是功能相对不集中。**比如 一个支付宝 App 里面即包 含共享单车 也包含 电影票。这种与本业务完全不同的 可以做成插件的形式 插件化弊端: 每一个插件都是一个 apk,插件多的时候管理起来也麻烦。

说下组件之间的跳转和组件通信原理机制

面试官: 说下组件之间的跳转和组件通信原理机制

**心理分析:**面试官从架构层次 了解求职者是否对组件化有深入研 究。是否使用过组件化,使用有多深。通过该问题一目了然。如果 能说出项目的演进 组件通信选型 绝对是一个加分项

**求职者:**应该从为什么会用到组件化 和组件定义,组件通信的 演进说起

我们公司的一个单体项目进行组件化架构改造,我们最开始从以下 7 个方面入手:

  1. 代码解耦。如何将一个庞大的工程分成有机的整体?
  2. 组件单独运行。因为每个组件都是高度内聚的,是一个完整的整体,如何 让其单独运行和调试?
  3. 组件间通信。由于每个组件具体实现细节都互相不了解,但每个组件都需 要给其他调用方提供服务,那么主项目与组件、组件与组件之间如何通信 就变成关键?
  4. UI 跳转。UI 跳转指的是特殊的数据传递,跟组件间通信区别有什么不 同?
  5. 组件生命周期。这里的生命周期指的是组件在应用中存在的时间,组件是 否可以做到按需、动态使用、因此就会涉及到组件加载、卸载等管理问题。
  6. 集成调试。在开发阶段如何做到按需编译组件?一次调试中可能有一两个 组件参与集成,这样编译时间就会大大降低,提高开发效率。
  7. 代码隔离。组件之间的交互如果还是直接引用的话,那么组件之间根本没 有做到解耦,如何从根本上避免组件之间的直接引用,也就是如何从根本 上杜绝耦合的产生?

今天则会从更小细粒度入手,主要讲讲在组件化架构下组件与组件之间通信机制 是如何、包括所谓的 UI 跳转,其实也是组件化通信,只不过它稍微特殊点,单 独抽取出来而已。学习知识的过程很常见的一个思路就是从整体概况入手,首先 对整体有个粗略的印象,然后再深入细节,抽丝剥茧般去挖掘其中的内在原理, 一个点一个不断去突破,这样就能建立起自己整个知识树,所以今天我们就从通 信机制这个点入手,看看其中内在玄机有哪些。

思维导图

同样,在每写一篇文章之前,放个思维导图,这样做的好处对于想写的内容有很 好的梳理,逻辑和结构上显得清晰点。思维导图主流方式

总所周知,Android 提供了很多不同的信息的传递方式,比如在四大组件中本地 广播、进程间的 AIDL、匿名间的内存共享、Intent Bundle 传递等等,那么在这 么多传递方式,哪种类型是比较适合组件与组件直接的传递呢。

  • 本地广播,也就是 LoacalBroadcastRecevier。更多是用在同一个应用内的不同系 统规定的组件进行通信,好处在于:发送的广播只会在自己的 APP 内传播,不 会泄漏给其他的 APP,其他 APP 无法向自己的 APP 发送广播,不用被其他 APP 干扰。本地广播好比对讲通信,成本低,效率高,但有个缺点就是两者通信机制 全部委托与系统负责,我们无法干预传输途中的任何步骤,不可控制,一般在组 件化通信过程中采用比例不高。
  • 进程间的 AIDL。这个粒度在于进程,而我们组件化通信过程往往是在线程中, 况且 AIDL 通信也是属于系统级通信,底层以 Binder 机制,虽说 Android 提供模 板供我们实现,但往往使用者不好理解,交互比较复杂,往往也不适用应用于组 件化通信过程中。
  • 匿名的内存共享。比如用 Sharedpreferences,在处于多线程场景下,往往会线 程不安全,这种更多是存储一一些变化很少的信息,比如说组件里的配置信息等 等。
  • Intent Bundle 传递。包括显性和隐性传递,显性传递需要明确包名路径,组件 与组件往往是需要互相依赖,这背离组件化中 SOP(关注点分离原则),如果走 隐性的话,不仅包名路径不能重复,需要定义一套规则,只有一个包名路径出错, 排查起来也稍显麻烦,这个方式往往在组件间内部传递会比较合适,组件外与其 他组件打交道则使用场景不多。

说了这么多,那组件化通信什么机制比较适合呢?既然组件层中的模块是相互独 立的,它们之间并不存在任何依赖。没有依赖就无法产生关系,没有关系,就无 法传递消息,那要如何才能完成这种交流?

目前主流做法之一就是引入第三者,比如图中的 Base Module。

基础组件化架构

组件层的模块都依赖于基础层,从而产生第三者联系,这种第三者联系最终会编 译在 APP Module 中,那时将不会有这种隔阂,那么其中的 Base Module 就是 跨越组件化层级的关键,也是模块间信息交流的基础。比较有代表性的组件化开 源框架有得到 DDComponentForAndroid、Arouter、聚美 Router 等等。

除了这种以通过引入第三者方式,还有一种解决方式是以事件总线方式,但这种 方式目前开源的框架中使用比例不高,如图:

事件总线
事件总线通过记录对象,使用监听者模式来通知对象各种事件,比如在现实生活 中,我们要去找房子,一般都去看小区的公告栏,因为那边会经常发布一些出租 信息,我们去查看的过程中就形成了订阅的关系,只不过这种是被动去订阅,因 为只有自己需要找房子了才去看,平时一般不会去看。小区中的公告栏可以想象 成一个事件总线发布点,监听者则是哪些想要找房子的人,当有房东在公告栏上 贴上出租房信息时,如果公告栏有订阅信息功能,比如引入门卫保安,已经把之 前来这个公告栏要查看的找房子人一一进行电话登记,那么一旦有新出租消息产 生,则门卫会把这条消息一一进行短信群发,那么找房子人则会收到这条消息进 行后续的操作,是马上过来看,还是延迟过来,则根据自己的实际情况进行处理。 在目前开源库中,有 EventBus、RxBus 就是采用这种发布/订阅模式,优点是简 化了 Android 组件之间的通信方式,实现解耦,让业务代码更加简洁,可以动态 设置事件处理线程和优先级,缺点则是每个事件需要维护一个事件类,造成事件 类太多,无形中加大了维护成本。那么在组件化开源框架中有 ModuleBus、CC 等 等。

这两者模式更详细的对比,可以查看这篇文章多个维度对比一些有代表性的开源 android 组件化开发方案

实现方案

事件总线,又可以叫做组件总线,路由+接口,则相对好理解点,今天从阅读它 们框架源码,我们来对比这两种实现方案的不同之处。

组件总线
这边选取的是 ModuleBus 框架,这个方案特别之处在于其借鉴了 EventBus 的思 想,组件的注册/注销和组件调用的事件发送都跟 EventBus 类似,能够传递一些 基础类型的数据,而并不需要在 Base Moudel 中添加额外的类。所以不会影响 Base 模块的架构,但是无法动态移除信息接收端的代码,而自定义的事件信息 类型还是需要添加到 Base Module 中才能让其他功能模块索引。

其中的核心代码是在与 ModuleBus 类,其内部维护了两个 ArrayMap 键对值列 表,如下:

private static ArrayMap<Object,ArrayMap<String,MethodInfo>> 
moduleEventMethods = new ArrayMap<>(); 

private static ArrayMap<Class<?>,ArrayMap<String,ArrayList<Object>>> 
 moduleMethodClient = new ArrayMap<>()

在使用方法上,在 onCreate()和 onDestroy()中需要注册和解绑,比如

ModuleBus.getInstance().register(this); 

ModuleBus.getInstance().unregister(this);

最终使用类似 EventBus 中 post 方法一样,进行两个组件间的通信。这个框架 的封装的 post 方法如下

public void post(Class<?> clientClass,String methodName,Object...args){


# 结语

网上高级工程师面试相关文章鱼龙混杂,要么一堆内容,要么内容质量太浅, 鉴于此我整理了上述安卓开发高级工程师面试题以及答案。希望帮助大家顺利进阶为高级工程师。
目前我就职于某大厂安卓高级工程师职位,在当下大环境下也想为安卓工程师出一份力,通过我的技术经验整理了面试经常问的题,答案部分是一篇文章或者几篇文章,都是我认真看过并且觉得不错才整理出来。

大家知道高级工程师不会像刚入门那样被问的问题一句话两句话就能表述清楚,所以我通过过滤好文章来帮助大家理解。

![1307页字节跳动Android面试真题解析火爆全网,完整版开放下载](https://img-blog.csdnimg.cn/img_convert/7c870c69564b317173885635de8416dd.webp?x-oss-process=image/format,png)

**现在都说互联网寒冬,其实只要自身技术能力够强,咱们就不怕!我这边专门针对Android开发工程师整理了一套【Android进阶学习视频】、【全套Android面试秘籍】、【Android知识点PDF】。**



**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注Android)**
![img](https://img-blog.csdnimg.cn/img_convert/4a477183c46e458ce9feed24fd4b8c0a.png)

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

入研究,那么很难做到真正的技术提升。**

**需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注Android)**
[外链图片转存中...(img-66tR4C0X-1713347096192)]

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 18
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值