此面经为本人四个月利用闲暇和周末时间准备并上岸,认为是移动端面试过程中比较重要的一些内容,文末会附带实际的面试题目以供参考,希望能对你面试需要准备什么内容,如何去准备面试有所帮助。
仅做导引提供,具体学习内容各位可借助AI等工具进一步搜索掌握,以此来丰满自己的知识库体系
基础部分
越熟悉越好,这些尽量看细,可以自己再内部延伸一下,比如像启动模式在Android 12以上就增加了singleInstancePerTask,像这种细节自己在学习整理时候可以进行扩展补充。后续面试时能更扎实,也能让面试官感觉你的专业程度。
- 启动模式,生命周期,四大组件
- 应用的启动流程(从桌面图标点击开始说)
- binder机制 (最好再了解下Mmap内存共享)
- handler的分发流程 这个建议看下源码(epoll机制,同步屏障,idelhandler)
- 线程池 (几个入参和各自的作用)
- 自定义View (View的渲染和绘制流程)
- 点击事件分发过程
- MVP,MVC,MVVM的区别
- Apk编译过程
- 垃圾回收机制 (GC算法原理)
- 线程安全,锁
- 常见的几个数据结构掌握,链表,树,数组,队列 如何定位ANR和OOM,日志里面包含什么信息
- kotlin的一些语言特性,flow(这个看看和线程的区别和原理),object,扩展函数,(说到底就是语法糖,使用一些开发和语言习惯更接近人的思维逻辑)
- java相关的,抽象类,反射,泛型,注解,异常机制等
- https 完整的证书校验流程
进阶部分
稍微了解原理即可,略微背一下,无需非常熟悉
- 类加载,热更新,热修复
- LRU,FIFO,二叉树遍历,二分查找等常见算法了解
- Hook机制
- webview的渲染过程(如果涉及H5开发的话)
- 如何定位ANR和OOM (比较重要)
- 多进程开发如何通信,多线程如何共享变量
- JNI调用流程
- 内存泄露原理及如何避免
- flutter,RN,KMP 目前主流跨端框架的实现原理和适用方向
优化相关(Ai建议)
Android 性能优化需要从多个维度综合考虑,以下是一些通用的核心规则和最佳实践,涵盖不同场景下的优化方向
- 内存优化
- 避免内存泄漏:使用 WeakReference 管理临时对象(如 Handler、静态 Context),及时释放资源(Bitmap.recycle()、关闭 Cursor),工具检测可用 Android Profiler 或 LeakCanary。
- 优化数据结构:用 SparseArray 替代 HashMap<Integer, Object>,避免循环内创建临时对象(如用 StringBuilder 拼接字符串)。
- 图片处理:使用 Glide 或 Coil 管理缓存,根据控件尺寸加载图片(inSampleSize)。
- 渲染性能
- 减少布局层级:优先用 ConstraintLayout,通过 Layout Inspector 检查冗余视图。
- 避免过度绘制:移除不必要的 background,用 GPU Overdraw 工具调试(蓝色为优)。
- 自定义 View 优化:不在 onDraw() 中创建对象,使用 Canvas.clipRect() 限制绘制区域。
- 线程与异步
- 线程池管理:避免频繁创建线程,推荐 Executors 或 CoroutineDispatcher,I/O 任务用 Dispatchers.IO,CPU 任务用 Dispatchers.Default。
- 主线程保护:耗时操作放子线程,用 LiveData/RxJava/协程回调,监控卡顿可用 Choreographer 或 BlockCanary。
- 网络与 I/O
- 网络优化:使用缓存(HTTP 缓存头、OkHttp Cache),压缩数据(GZIP/Protobuf)。
- 数据库优化:批量操作用事务,高频查询字段建索引。
- 启动速度
- 冷启动优化:减少 Application 初始化任务,用 App Startup 管理初始化顺序,设置 windowBackground 避免白屏。
- 异步初始化:用 IntentService 或协程后台初始化非关键代码。
- 电量优化
- 减少 WakeLock 使用:用 WorkManager 替代后台任务,合并网络请求。
- 传感器优化:及时注销 SensorEventListener。
- 工具推荐
- Android Profiler:监控 CPU/内存/网络。
- Systrace:分析帧率与线程阻塞。
- Benchmark 库:测量代码耗时。
方案举例
一些可能可以套用在你项目里的各类优化方案和内容
- 图片加载优化策略
- Glide 最优采样策略 (根据View大小自动采样)
- 分块加载 (按需加载可见区域)
- 渐进式解码 (先模糊后清晰)
- 格式与渲染
- 硬件纹理 (优化GPU渲染)
- 格式压缩 (采用 WebP, AVIF 等高压缩比格式)
- 数据存储优化策略
- 事务批处理 (减少数据库事务开销)
- 预编译语句 (SQLiteStatement, 提升查询效率)
- 启用 WAL 模式 (Write-Ahead Logging, 提升并发性能)
- 分页批处理 (处理大数据集时避免一次性加载)
- 索引优化 (合理创建索引加速查询)
- APK 体积优化策略
- 移除重复或功能相似的依赖库、so库、资源文件。
- 提取可复用的布局文件与功能代码模块,减少重复代码量。
- 选择更轻量的第三方依赖库和 so 库。
- 使用雪碧图 (Sprite sheets)。
- 对图片进行有效压缩。
- 布局优化 (考虑使用 Compose, Flutter 等声明式UI框架减少XML)。
- 启用代码混淆 (minifyEnabled)。
- 启用资源压缩 (shrinkResources)。
- 按ABI拆分 so 库。
- 日志监控方案
- 无痕埋点: 通过字节码插桩自动收集用户行为数据,无需手动编码。
- 全链路追踪 (traceID): 使用唯一标识 traceID 将前后端接口调用、用户操作等日志关联起来,实现端到端追踪。
- 崩溃监控 异常 (Exception) ANR (Application Not Responding) Native 崩溃 OOM (Out Of Memory)
- 内存 HPROF (内存快照文件) 设备状态快照 (CPU、内存、网络状态)
- 用户最后操作序列 (记录崩溃前的用户操作步骤)
- 视频优化策略
- 分辨率控制 (根据设备/网络动态调整)
- 帧率自适应 (根据设备性能/内容复杂度调整)
- 解码策略
- 软硬解码自动选择
- 硬解格式兼容性校验
- 格式转换 (适配不同平台/场景)
- 多线程流水线优化 (并行处理解码、渲染等环节)
- 渲染优化 (减少GPU开销,如纹理处理)
- 性能监控 (实时监测帧率、卡顿、功耗等)
- 编码优化 / 网络优化 (提升压缩效率,降低延迟丢包影响)
面试实战题
下面是我在面试过程中整理的一些实战题目,涵盖多个大厂移动端面试
- Android基础
- 请描述View的渲染绘制流程,从measure到draw的完整过程
- 手写二叉树的前序遍历算法
- 详细说一下Android的事件分发机制,从Activity到View的传递过程
- Activity、Window、View三者之间是什么关系?Window具体起到什么作用?
- Activity的四种启动模式分别适用于什么场景?请举例说明
- 在什么情况下Activity不会执行onStop方法?
- Fragment生命周期中容易出现哪些问题?如何避免?
- 多线程与并发
- 什么是线程安全?在Android开发中哪些场景需要注意线程安全?
- 谈谈你对volatile关键字的理解,它能保证原子性吗?
- 线程池的核心参数有哪些?它们是如何协同工作的?
- 详细介绍一下Handler的消息机制,Looper是如何实现消息循环的?
- Handler的底层epoll机制是怎样的?在Linux内核层面是如何工作的?
- 什么是ABA问题?在并发编程中如何解决?
- 自定义View与UI
- 如何用View来实现一个时钟的动画效果?请描述具体的实现思路
- 现在有两个View,一个需要横向移动,一个需要竖向移动,提供两种不同的实现方案
- 如何自定义View?请详细说明onMeasure、onLayout、onDraw的作用和注意事项
- RecyclerView的复用机制是怎样的?有几级缓存?
- 当两个RecyclerView嵌套时,如何解决内部RecyclerView滑动到底部后继续滑动父View的问题?
- 性能优化
- 如何定位ANR问题?具体分析步骤是什么?
- 常见的内存泄漏场景有哪些?如何检测和避免?
- 如何优化应用的启动速度?有哪些具体的优化手段?
- WebView加载H5页面时出现白屏,如何利用渲染过程来解决这个问题?
- 系统原理
- 请描述Android应用的启动流程,从点击图标到显示第一个Activity的全过程
- Binder机制的原理是什么?
- Android的Dex加载流程是怎样的?ClassLoader是如何工作的?
- 为什么每个Android应用都有自己的虚拟机?这个虚拟机和JVM有什么关系?
- 项目与设计
- WebView如何拦截JS和CSS资源并替换加载?
- H5页面如何与Native进行通信?有哪些常用的通信方案?
- 请手写实现LRUCache的get和set方法
- Glide的缓存机制是怎样的?三级缓存分别是如何工作的?
- Kotlin与工具
- Kotlin的协程和传统的线程有什么区别?协程的优势在哪里?
- 有没有自定义过Gradle插件?实现的基本流程是怎样的?
- Jetpack Compose的渲染机制和传统XML布局有什么本质区别?
- 算法题
- 给定一个数字数组,如何从中选取若干个数字使得和最大?请写出算法思路
- 实现二叉树的层序遍历算法
结语
1、准备两个左右认为项目中比较难的部分,一定要体现你在这其中的作用和成果。
2、个人介绍要清晰,尽量在2分钟内,对内容进行条理性表达,比如1,2,3或者一方面 另一方面 ,介绍一个东西要讲为什么,怎么做,结果是怎么样的。
3、最后就是多投多面多调整,练习沟通表达能力,针对自己的简历做好相应内容储备,希望能在面试中帮到你。
9452

被折叠的 条评论
为什么被折叠?



