今年的Android面试,和以往大有不同
Posted River_ly
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了今年的Android面试,和以往大有不同相关的知识,希望对你有一定的参考价值。
近些年面试,性能优化和架构设计权重在不断的提升,尤其是一些高阶朋友,想要加入大厂的。
一、启动优化能做到多细?
性能优化中,排前面的肯定是启动优化,以前我们的方案都是懒加载、异步预加载等等,后来支持拓步结构的启动框架慢慢映入眼帘,成为大厂 App的标配。
有些朋友觉得启动框架没什么意义,觉得自己开几个线程,利用一些阻塞方式也能基本实现任务并行操作。
这种方式虽然可行,但是在大型项目中,很难去做监控,非常容易劣化,扩展性也非常差,不利于整体分析。
也有朋友觉得启动框架,无非就是搞个线程池 + 一个有向无环图算法,然后拆拆任务就好了。
其实大厂的精细化程度远超大家的想象。
首先,启动阶段尽可能最大化利用系统资源:
- 启动框架,设置多少个线程合适?
- 每个线程的优先级怎么设置,Android 中线程优先级范围是多少?
- CPU 有大小核,有没有可能把特定线程都扔到大核里面执行;
然后我们再聊一下任务间的依赖关系:
很多朋友都觉得,依赖关系嘛,一眼就看出来了,埋点肯定依赖网络,所以网络库先,埋点库后初始化。
这些我们称之为显性依赖关系,大家有没有考虑过还有一些隐性的依赖关系,例如 A SDK 与 B SDK 虽然功能上没有太多关联,但是其内部都调用了一个系统带锁的耗时的方法,这样就存在锁竞争,启动可能上百个线程都存在锁竞争的情况,如何去监控启动任务耗时多少时间耗费在锁等待上的,从而通过调整任务顺序进行调优。
最后我们聊一下智能化:
每个人使用 App 的诉求与习惯是不同的,也就是说对启动任务的依赖其实也可能是不同的,那有没有可能将启动任务根据每个人的使用习惯,去调整任务优先级,甚至有些任务不需要启动阶段执行,去做千人千面,这样都需要高扩展性去支持。
可以看到,一个扩展性强大的启动任务框架在大型App中的重要性,定制一套启动任务框架就成为了重中之重。
除了性能优化,架构设计在面试中的权重也在不断的提升
二、架构设计
面试中,大家可能会被问到:
你在过往的开发过程中,有没有一些值得拿出来说的架构设计经历?
大家可能觉得,天天“搬砖”,哪有什么机会搞什么架构设计…
很多时候,并不是我们没有机会接触架构设计,而是缺少经验和思考,毕竟好的设计肯定是经过思考以及充足的经验沉淀下来的。
举个例子,比如在引入三方图片库这件事情上,一般朋友可能 github 上一顿引用,然后调用其 API 就可以了。
有架构思路的朋友会怎么做呢?
他会在还没引入图片三方库之前,就会设计好业务方调用图片库的接口层,然后提供工厂方法创建空实现交给业务方使用,与此同时去调研多个图片库,然后每个图片库的能力作为图片能力接口的实现类。
你可能会问?这样做有啥好处?还多了一层调用。
首先,这一层调用,一般称之为「适配层」,恰恰是这个适配层,可以让架构设计的朋友与业务朋友并发开发。
其次,每个三方库对应的就是适配层的一个实现类,未来不管是换底层库,还是多个底层库同时上线做实验,都是非常轻松的事情,甚至通过配置文件+反射连一行代码都不用改,业务方完全不用接触到具体的三方库 API,这就是传说中的接口隔离。
在项目中,「适配层」的概念,大家可以举一反三,网络库是不是也可以这么搞?图片识别能力是不是也可以这么搞?登录能力是不是也可以这么搞?……
如果你还是有一点不太清楚,我们后面也有更详细的文档笔记讲解。
关于解耦,除了「适配层」,还有:
- 组件化必备的SPI 机制去做服务发现与注册;
- 利用Jetpack hilt去做组件间一些解耦;
- ……
现在是越来越不好找工作了,并且未来还会更难,主要原因呢还是太卷,同样是搞搞业务代码,谁更熟练要谁,同样的高工岗,谁对底层原理研究最深要谁,八股文越熟练越容易通过 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面试,和以往大有不同的主要内容,如果未能解决你的问题,请参考以下文章
揭秘今年Android春招面试必问问题有哪些?已拿offer附真题解析