前言
前面我们聊了如何准备面试和投递简历,今天我们从面试本身出发,一来介绍面试中有哪些应对技巧,二来将对重要的技术问题进行分析讲解
下面,正文开始!
面试有什么技巧?
对技术面试来说,可能有的人并不会注重所谓的技巧
;笔者在这里说的技巧,并不是什么奇技淫巧,而是在前面的准备部分都已经比较完备的情况下,如何在面试中更好的体现自己的技术实力
如何更好的跟面试官沟通?
一般而言,大公司的一面二面会在线上进行面试,尤其是现在疫情的情况,可能我们更多的面对的是线上面试
下面我将从线上和线下两个角度来讲一些面试技巧
线上面试
线上面试的过程中,可能出现各种各样的问题,比如网络不稳定,与面试官沟通不顺畅等等
针对线上,我们应该做好以下准备
-
准备好水
线上面试一般会持续1-3个小时(一面加二面),因此准备好饮用水是非常重要的,试想不喝一滴水,口如悬河讲2个小时是什么感受!
-
尽量争取线下面试
线上面试有各种的不便,为了更好的表现出自己的技术能力,可以尽量跟HR/面试官约线下面试
-
提前与面试官沟通
不同的面试官面试风格迥异,有的偏好打断面试者,有的偏好听面试者讲完再提问。在线上面试这种环境下,更加剧的沟通的不便,因此我们应该提前跟面试官沟通,更顺畅的完成面试过程;笔者在面试前会先告诉面试官,如果我有哪些地方没有讲清楚,请打断我向我提问
-
提前调试好网络,进入面试间
笔者在线上面试时,都会提前半小时进入面试间等待面试官,一来让自己以一个更好的状态来应对面试,二来可以提前进行网络的测试
-
网络质量差时,改为语音面试
网络质量差有可能是面试官的原因,也有可能是面试者的原因,这个是不可控的;在实在无法解决网络质量差的问题时,可以切换为仅使用语音面试
线下面试
现场面试基本上解决了以上的各种问题,因此在能约现场面试时,一定要优先考虑现场面试
线下面试也要注意一些细节问题
-
提前到面试现场
一来我们可以有更多的缓冲时间来应对路上的异常情况
二来到面试现场后,可以调整下自己的状态,看看技术文章,或者自己的面试总结
-
提前10分钟与HR/面试官联系
尽管我们提前到了面试现场,也不要过早进去面试,一般大公司都需要预约会议室进行面试,面试官在预约的时间外也会有自己的其他工作要做
如何引导面试官提问?
引导面试官提问,一是在简历上做文章,把自己准备的比较有深度的内容放在显眼的位置,加上对xxx有深入理解
等描述词;二是在回答面试官的其他技术问题时,尽量多提及一些相关的,自己准备的比较好的内容
如何应对不了解/不会的问题?
我们在前面准备了很多有技术深度的技能点,比如插件化,多线程,多进程,Android系统源码等等,但面试中我们遇到的问题是千奇百怪的,因为不同岗位有不同的要求
就拿Android系统源码来讲,源码之多之复杂,决定了我们只能找某几个方向与应用关联比较密切的额方向去进行研究,比如四大组件,应用启动等;但在笔者面试一家做安全的公司时,面试官看我在简历上写了对Android系统源码有一定深度的研究
,说那你讲一下Android系统中应用的安装流程
吧
这方面的问题笔者完全没有准备,也没看过这方面的源码,针对这种情况,有两种应答思路
-
在问题的基础上进行思维拓展回答
这里主要是看这个问题的类型,如果考察代码的理解能力和设计能力,可以做拓展性的回答
-
坦言这一块了解的比较少
如果是考察比较固定的技术点,没有拓展空间的话,可以告诉面试官自己在哪些地方进行了深度的学习,引导面试官进行提问
面试重点问题解析
以上就面试中的一些技巧
进行了一些总结,下面我们就面试中的重点技术问题进行一些分析,这里我会着重介绍在面试中如何讲述相关技术要点,以下面试题来自京东面试,想直接看面试题目的同学可以直接看最后的附录部分
插件化
京东的面试中问了很多的插件化技术问题(这里跟笔者的简历有关系,不一定所有公司都会关注插件化),如果想了解更多的代码和细节,可以直接查看我的文章 >>>插件化探索:插件Activity是如何启动的?
下面我就面试中如何回答插件化问题进行简要分析
-
介绍插件化的项目背景
在我们公司的项目中,因为我们是游戏的渠道方,需要跟游戏的CP方去进行对接,我们需要在自己的云平台插件里,依赖于游戏App去实现我们的功能,比如游戏登陆,游戏礼包领取等
我们的需求是,在游戏不更新安装包的情况下,我们的插件可以动态升级,所以用到了插件化的方案,参考了市面上成熟的方案去实现我们的插件化及动更能力
-
说明插件化的技术要点
插件化主要解决了两个问题,第一是类的加载,第二是资源的加载
插件化类的加载
类的加载有两种方案,一种是混合式,一种是独立式;
混合式是在加载插件类时,创建
DexClassLoader
对象对插件类进行加载,并将宿主的classloader(通过context.getClassloader()
获取)做为他的parent传递进去,根据ClassLoader的双亲委派机制,我们自己创建的classloader此时既可以加载宿主的类,也可以加载插件的类,实现混合式加载独立式是将superClassloader(通过
context.getSuperClassloader()
获取)作为我们自己创建的DexClassloader
的parent对象,这样我们的插件和宿主都是处于同一级,是互相隔离的我们的需求是需要获取宿主的类,所以使用的是混合式的加载方式
插件化资源的加载
资源的加载也是两种方式,混合式和独立式,使用场景与类加载一致
混合式需要通过
context.getResource().getAssetsManger()
,通过反射调用addAssetsPath()
将插件的资源加载进去;独立式更简单,直接创建
Assetsmanger
来进行添加管理即可在我们应用场景中,宿主需要调用插件的资源,所以使用的是混合的方式
-
介绍插件化中的疑难问题及解决方案
插件化中的类加载,有可能出现
类重复
的问题,解决这个问题首先要保证宿主和插件的三方库版本一致,其次在插件引入三方库时,要使用provided
的方式进行编译,这样再最终加载的时候就不会有重复的情况针对资源加载,也会出现资源ID冲突的问题,这个问题我们当时是通过修改aapt源码的方式,将编译生成的ID段改成别的段(默认生成的ID段为
0x7f
),避免ID冲突问题; -
介绍各种插件化方案的优缺点
以上介绍的方案,基本上与
DroidPlugin
和VirtualApk
的方案一致,以上方案除了实现资源加载和类加载,还要实现四大组件的插件化,这两种方案都是通过hook系统服务去进行的相关处理,达到加载插件组件的目的;但是随着各大应用市场对插件化动更的政策收紧(尤其是GP渠道),导致这种方案在对应的渠道上不能上架;并且基于hook方案实现的组件插件化并不稳定,随着系统升级也要不断的寻找新的hook点
就这种情况,我们可以参考腾讯的静态代理插件化方案–Shadow,将插件的四大组件交由应用层去进行维护,而不交给系统层,去规避这种问题
-
拓展介绍插件化的发展趋势和未来
插件化在工程上的应用,在大型项目中,会与组件化和模块化进行结合,以更好的复用代码模块;
在更
极客
的道路上,插件化又衍生出了VirtualApp
这样的技术方向,对系统层进行hook,以达到在插件中加载其他App的目的,应用场景有双开,逆向dump内存等
下期预告
以上就插件化相关技术进行了简要的分析,下篇文章中,我们将继续就性能优化,Activity启动流程,线程安全等技术方面进行面试问答展开讲解,并继续分享大厂的面试真题
我是释然,我们下篇文章再见!
附录: 面试真题(京东)
京东商城 – 中台架构组
一面
- 插件化: 插件化探索:插件Activity是如何启动的?
- 如何解决资源固化和资源冲突(方案一:appt修改id段;方案二:appt2支持)
- 为什么不使用现有的插件化框架?市面上有哪些成熟的插件化方案?
- 为什么看系统源码?你是做ROM的吗?
- 卡顿优化是怎么做的?市面上有什么成熟的方案?(笔者主要介绍了LayoutInflater的异步加载方案和相关原理以及X2C框架)
- 异步加载方案和Activity的声明周期有什么关联?会不会受影响?针对业务的写法有没有影响?
- 异步加载方案优化效果有多少?
- UI的绘制卡顿如何监控和优化?(笔者介绍了BlockCananry的监控原理及Chorgphoer的vsync回调监控)
- FPS和UI的绘制时间有什么关系?跟一个Vync时钟周期的时间又是什么关系?(此处涉及到vync信号的分发机制,Chorographer,FrameDisplayEventReceiver,SurfaceFlinger等之间的关系)
- 高刷屏和普通屏的刷新率有什么区别?vsync时钟周期会改变吗?帧率是如何计算的?
- 针对UI卡顿,什么叫冻屏?
- 应用启动优化是怎么做的?
- 如何进行内存优化?如何避免OOM问题?如何检测和避免内存泄漏?
- Bitmap是占用的哪部分的内存?Java还是native?(跟Android系统版本有关)
- 如何解决内存问题?有什么措施?
- 如果确实需要这么多内存资源,如何解决这个问题?(笔者介绍了largeHeap,以及多进程)
- 在内存收紧的时候,怎么知道应该回收哪些内存?(笔者介绍的策略是用时申请,闲时释放)
- 图片加载库里针对内存做了哪些优化?
- 如何获取应用能申请的最大内存大小?
- 有没有遇到过线程超限导致的OOM?(笔者这里介绍了线程池对线程的管理)
- MVC和MVP最主要的区别是什么?MVP有什么缺陷,如何改进?
- 你对AOP是怎么理解的?(笔者介绍了各种AOP方案,以及对应的应用场景)
- 除了Android原生开发,有没有接触过其他的技术栈?(指插件化的构建服务,groovy之类的)
- 1亿个数如何找到最大的数?(笔者介绍了快排思想 + 二分的思路)
- 按Z字形顺序打印一个二叉树
- 对新的技术,比如Kotlin,Flutter有没有过了解和研究?(笔者说的是更关注framework层,所以了解比较少)
- 除了Java还会哪些其他语言?
- 对Xposed有没有有过了解和研究?它的原理是什么?
- 如何Hook Java代码和native代码?
二面
- 对classloader的加载有什么了解?什么是双亲委派?
- 插件化中是如何加载dex的?如何解决类重复的问题?Classloader是如何使用的?混合方式和独立方式有什么区别?
- 插件化中是如何加载resource的?如何解决资源ID重复的问题?
- 讲一下Activity的启动流程
- 静态内部类与内部类有什么区别?
- 算法题:找到链表的倒数第K个节点
- 数据结构题:什么是平衡二叉树
- 多线程:讲一下生产者消费者模式?使用的什么锁,是如何对数据进行操作的
- 如何保证线程安全?synchronized,volatile各有什么作用?