今年的Android面试,和以往大有不同

Posted River_ly

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了今年的Android面试,和以往大有不同相关的知识,希望对你有一定的参考价值。

近些年面试,性能优化和架构设计权重在不断的提升,尤其是一些高阶朋友,想要加入大厂的。

一、启动优化能做到多细?

性能优化中,排前面的肯定是启动优化,以前我们的方案都是懒加载、异步预加载等等,后来支持拓步结构的启动框架慢慢映入眼帘,成为大厂 App的标配。

有些朋友觉得启动框架没什么意义,觉得自己开几个线程,利用一些阻塞方式也能基本实现任务并行操作。

这种方式虽然可行,但是在大型项目中,很难去做监控,非常容易劣化,扩展性也非常差,不利于整体分析。

也有朋友觉得启动框架,无非就是搞个线程池 + 一个有向无环图算法,然后拆拆任务就好了。

其实大厂的精细化程度远超大家的想象。

首先,启动阶段尽可能最大化利用系统资源:

  1. 启动框架,设置多少个线程合适?
  2. 每个线程的优先级怎么设置,Android 中线程优先级范围是多少?
  3. CPU 有大小核,有没有可能把特定线程都扔到大核里面执行;

然后我们再聊一下任务间的依赖关系:

很多朋友都觉得,依赖关系嘛,一眼就看出来了,埋点肯定依赖网络,所以网络库先,埋点库后初始化。

这些我们称之为显性依赖关系,大家有没有考虑过还有一些隐性的依赖关系,例如 A SDK 与 B SDK 虽然功能上没有太多关联,但是其内部都调用了一个系统带锁的耗时的方法,这样就存在锁竞争,启动可能上百个线程都存在锁竞争的情况,如何去监控启动任务耗时多少时间耗费在锁等待上的,从而通过调整任务顺序进行调优。

最后我们聊一下智能化:

每个人使用 App 的诉求与习惯是不同的,也就是说对启动任务的依赖其实也可能是不同的,那有没有可能将启动任务根据每个人的使用习惯,去调整任务优先级,甚至有些任务不需要启动阶段执行,去做千人千面,这样都需要高扩展性去支持。

可以看到,一个扩展性强大的启动任务框架在大型App中的重要性,定制一套启动任务框架就成为了重中之重。

除了性能优化,架构设计在面试中的权重也在不断的提升

二、架构设计

面试中,大家可能会被问到:

你在过往的开发过程中,有没有一些值得拿出来说的架构设计经历?

大家可能觉得,天天“搬砖”,哪有什么机会搞什么架构设计…

很多时候,并不是我们没有机会接触架构设计,而是缺少经验和思考,毕竟好的设计肯定是经过思考以及充足的经验沉淀下来的。

举个例子,比如在引入三方图片库这件事情上,一般朋友可能 github 上一顿引用,然后调用其 API 就可以了。

有架构思路的朋友会怎么做呢?

他会在还没引入图片三方库之前,就会设计好业务方调用图片库的接口层,然后提供工厂方法创建空实现交给业务方使用,与此同时去调研多个图片库,然后每个图片库的能力作为图片能力接口的实现类。

你可能会问?这样做有啥好处?还多了一层调用。

首先,这一层调用,一般称之为「适配层」,恰恰是这个适配层,可以让架构设计的朋友与业务朋友并发开发。

其次,每个三方库对应的就是适配层的一个实现类,未来不管是换底层库,还是多个底层库同时上线做实验,都是非常轻松的事情,甚至通过配置文件+反射连一行代码都不用改,业务方完全不用接触到具体的三方库 API,这就是传说中的接口隔离。

在项目中,「适配层」的概念,大家可以举一反三,网络库是不是也可以这么搞?图片识别能力是不是也可以这么搞?登录能力是不是也可以这么搞?……

如果你还是有一点不太清楚,我们后面也有更详细的文档笔记讲解。

关于解耦,除了「适配层」,还有:

  1. 组件化必备的SPI 机制去做服务发现与注册;
  2. 利用Jetpack hilt去做组件间一些解耦;
  3. ……

现在是越来越不好找工作了,并且未来还会更难,主要原因呢还是太卷,同样是搞搞业务代码,谁更熟练要谁,同样的高工岗,谁对底层原理研究最深要谁,八股文越熟练越容易通过 Android 面试。

当然,为了大家更好的深入了解这些知识点,这里分享一些珍藏资源,从面试简历模板到大厂面经汇总,从大厂内部技术资料到互联网高薪必读书单,以及android面试核心知识点(844页)和Android面试题合集2022年最新版(354页)等等,这些资料整理给大家,希望面试踩过的坑不要再踩,遭遇的技术瓶颈一次性消灭。

如果需要的话,可以顺手帮我点赞评论一下,直接前往公号:Android开发之家,自行领取。

部分内容展示如下

01.Android必备底层技术:

  • Java序列化:Serializable原理、Parcelable接口原理、Json、XML
  • 注解、泛型与反射:自定义注解、注解的使用、泛型擦除机制、泛型边界、Java方法与Arm指令、Method反射源码、invoke方法执行原理
  • 虚拟机:JVM垃圾回收器机制、JVM内存分配策略、Android虚拟机与JVM底层区别、虚拟机底层Odex本地指令缓存机制、虚拟机如何分别加载class与object、虚拟机类加载模型
  • 并发:Java线程本质讲解、线程原理、线程通信、UnSafe类、线程池
  • 编译时技术:OOP面向切面之AspectJ、字节码手术刀JavaSSit实战、字节码插桩技术(ASM)实战
  • 动态代理:动态代理实现原理、动态代理在虚拟机中运行时动态拼接Class字节码分析、ProxyGenerator生成字节码流程
  • 高级数据结构与算法:HashMap源码、ArrayList源码、排序算法
  • Java IO:Java IO体系、IO文件操作

02.Framework:

  • Binder:Linux内存基础、Binder四层源码分析、Binder机制、Binder进程通信原理
  • Handler:Loop消息泵机制、Message解析
  • Zygote:init进程与Zygote进程、Zygote启动流程、Socket通信模式、APP启动过程
  • AMS:ActivityThread源码分析、AMS与ActivityThread通信原理、Activity启动机制
  • PMS:PMS源码、APK安装过程分析、PMS对安装包的解析原理
  • WMS:PhoneWindow实例化流程、DecorView创建过程、ViewRootImpl渲染机制

03.Android常用组件:

  • Activty:Activity管理栈与Activity的启动模式、Activity生命周期源码分析
  • Fragment:Fragment生命周期深入详解、Fragment事务管理机制详解、性能优化相关方案
  • Service:Service启动模式分析、Service管理与通信方案、Service生命周期底层详解

04.高级UI:

  • UI绘制原理:setContentView()方法下到底做了什么、AppCompatActivity与Activity的区别、UI测量、布局、绘制的底层执行流程
  • 插件换肤:LayoutInflater加载布局分析、Android资源的加载机制、Resource与AssetManager
  • 事件分发机制原理:事件执行U形链与L形链、事件拦截原理
  • 属性动画:VSYNC刷新机制、ObjectAnimator与ValueAnimator源码讲解、Android属性动画:插值器与估值器
  • RecycleView:布局管理器LayoutManager详解、回收池设计思想、适配器模式原理
  • 高阶贝塞尔曲线

05.Jetpack:

  • Lifecycle:Lifecycle源码、Lifecycle高阶应用
  • ViewModel:ViewModel源码、ViewModel应用技巧
  • LiveData:LiveData源码
  • Navigation:Navigation源码
  • Room:Room源码、Room+LiveData监听数据库数据变更刷新页面原理
  • WorkManager内核
  • Pagging原理
  • DataBinding:单向绑定、双向绑定、如何与RecyclerView的配合使用、底层原理

06.性能优化:

  • 启动优化:系统启动原理、Trace工具分析启动卡顿、类重排机制、资源文件重排机制
  • 内存优化
  • UI渲染优化:UI层级规范及对UI加载的影响、UI卡顿原因及修复、UI绘制、布局、测量原因以及处理方案
  • 卡顿优化:造成卡顿的原因分析、内存抖动与GC回收、回收算法
  • 耗电优化
  • 崩溃优化:项目崩溃异常捕获、优雅的异常处理方案、如何避免异常弹框
  • 安全优化:APP加固实现(防反编译,dex加固)、https防抓包机制(数据传输加载,客户端服务器端双向加密校验)
  • 网络优化:serializable原理、parcelable接口原理、http与https原理详解、protbuffer网络IO详解、gzip压缩方案
  • 大图加载优化:Glide巨图加载机制原理分析、大图多级缓存实现方案
  • 多线程并发优化
  • 储存优化:Android文件系统-sdcard与内存存储、Shared Preference原理、MMAP内存映射
  • 安装包优化:shrinkResources去除无用资源、合理设置多语言、webp实现图片瘦身、合理配置armable-v7的so库、Lint检查工具实践

如果需要的话,可以顺手帮我点赞评论一下,直接前往公号:Android开发之家,自行领取。

07.音视频:

  • C/C++:数据类型、数组、内存布局、指针、函数、预处理器、结构体、共用体、容器、类型转换、异常、文件流操作、线程
  • H.265/H.265:音视频格式封装原理、编码原理、视频流H264的组装原理切片NAL单元、视频流H264码流分析、切片与宏快,运动矢量、信源编码器、高频滤波、帧间拆分与帧内预测、CTU,PU TU编码结构、DSP芯片解码流程、MediaPlayer与DSP芯片交互机制、投屏架构、MediaProjection与MeidiaCodec交互机制、H265码流交换
  • MediaCodec:dsp芯片、编解码器的生命周期、解码器中输入队列与解析队列设计思想、MediaCodec中平缓解码解析、MediaExtractor 多路复用、MediaMuxer合成器、MediaFormat格式
  • 音视频剪辑:视频剪辑、音频剪辑、音频合成、音谱显示、视频倒放
  • 音视频直播:硬编码、软编码、native实现rtmp推流、摄像头预览帧编码NV21转YUV、视频画面封装拼接Packet包、音频流数据拼接Packet包、RtmpDump实时同步发送音视频数据、MediaProjection、Medicodec编码H264码流、rtmp推流
  • OpenGL与音视频解码:OpenGL绘制流程、矩阵、Opencv详解、人脸识别效果实现
  • OpenGL特效:CPU与GPU运行机制详解、世界坐标,布局坐标,与FBO坐标系、图像镜像与旋转处理、人脸定位与关键点定位、大眼效果、贴纸效果、美颜效果
  • FFmpeg万能播放器:FFmpeg结构体、声音播放原理、Surface的渲染、像素绘制原理与对齐机制、音视频同步原理、视频播放器整体架构
  • Webrtc音视频通话:WebRtc服务端环境搭建与Webrtc编译、1v1视频通话实现方案、群聊视频通话实现思路、多对多视频会议实现、1V1音视频通话实现

08.开源框架原理:

  • Okhttp
  • Retrofit
  • RxJava
  • Glide
  • Hilt
  • Dagger2
  • EventBus
  • 组件化、插件化、热修复等

09.Gradle:

  • Groovy语法
  • Gradle Android插件配置
  • Gradle实践等

10.kotlin:

  • Kotlin语法
  • 扩展使用
  • 进阶使用
  • 实践等

11.Flutter:

  • Dart语法
  • UI
  • 进阶使用
  • 优化
  • 实践等

12.鸿蒙:

  • Ability组件
  • 分布式任务
  • 事件总线
  • 鸿蒙线程
  • UI自定义控件等

如果需要的话,可以顺手帮我点赞评论一下,直接前往公号:Android开发之家,自行领取。

Android路漫漫,共勉!

以上是关于今年的Android面试,和以往大有不同的主要内容,如果未能解决你的问题,请参考以下文章

2021年Android春招面试经历,大厂内部资料

揭秘今年Android春招面试必问问题有哪些?已拿offer附真题解析

面试那些事

2019-05-25 今年第一次面试

金九失色,银十未卜?2021年Android面试知识点整理,赶紧来学!

Android今年面试什么?来自百度篇