25 问覆盖启动(三档初始化编排)、内存(图片治理/泄漏排查/抖动)、渲染流畅性(掉帧判定/过度绘制)、包体积与网络(预算进 CI/弱网策略)五大板块,双端通用方法论加平台差异标注。
移动端性能优化的面试越来越像「开放设计题」:面试官抛出「启动慢怎么办」「掉帧怎么排查」,考察的是方法论与工具链的完整度。这份 25 问按启动、内存、渲染流畅性、包体积与网络五个板块组织,双端(Android 17 / iOS 27 时代)通用思路为主,平台差异单独标注。
一、启动优化(6 问)
1. 启动阶段怎么划分?各阶段优化重点?
冷启动 = 进程创建 → Application 初始化 → 首帧渲染 → 首屏可交互。重点依次是:延迟非必要初始化(启动任务编排,按依赖分阶段)、首屏布局简化(减少嵌套层级)、数据预取(splash 期间并行请求)。
2. Application 里最容易犯的错?
同步初始化一堆 SDK。答案框架:把初始化拆成「启动必需 / 首帧前 / 异步可延迟」三档,用有向无环图管理依赖,异步档丢到首帧后的空闲期。iOS 对应 +load 与 didFinishLaunching 的瘦身。
3. 怎么测量启动耗时才准确?
双口径:实验室(录屏逐帧分析 / 打点日志)与线上 RUM(首帧时间 p75/p90)。加分点:说明「点击图标到首帧」与「首帧到可交互」要分开看,用户感知的是后者。
4. 首屏数据还没回来怎么办?
缓存兜底(上次数据的快照先渲染)+ 骨架屏 + 增量刷新。「先展示旧数据」比「白等新数据」体验好得多。
5. 启动优化到什么程度算到头?
看收益曲线:优化收益递减时转投入下一阶段。给出基准:冷启动 p75 控制在 1.5–2s 内(中端机型)是当前主流标准。
6. 多进程应用(Android)启动有什么特殊问题?
每个进程都会走一遍 Application 初始化——按进程名区分初始化内容,非主进程只做最小初始化。

二、内存优化(6 问)
7. 内存优化的指标怎么看?
PSS/内存水位(Android)、footprint(iOS);更关键的是「高水位设备占比」与 OOM 率。OOM 不抛常规异常,靠内存曲线 + 页面轨迹归因。
8. 图片内存怎么治理?
按显示尺寸解码(下采样)、合理格式(HEIC/WebP)、列表图片复用与按需取消解码、大图禁止常驻内存。图片通常占 App 内存一半以上。
9. 内存泄漏的高发点与排查工具?
静态持有 Activity/View、监听器未注销、Handler 延迟消息、闭包循环引用(iOS 的 delegate/Block)。工具:Android Profiler + LeakCanary、Xcode Memory Graph + Instruments Leaks。
10. 循环引用什么时候需要弱引用?
两个对象互相强持有即成环。规则:delegate 用 weak;Block 捕获 self 时要么 weak-strong dance,要么确保 Block 生命周期短于 self。
11. 大对象缓存怎么设计?
LRU + 容量上限 + 按内存压力降级(onTrimMemory / didReceiveMemoryWarning 时清缓存)。答出「缓存要有清空策略」即合格。
12. 内存抖动为什么危险?
短生命周期对象高频创建回收 → GC 频繁 → 停顿 → 掉帧。对策:对象池、复用、避免在 onDraw/绘制回调里分配对象。
三、渲染流畅性(6 问)
13. 掉帧的判定标准与测量?
Android:Janky frames 比例 + Choreographer 打点;iOS:CADisplayLink 监测或 MetricKit 的 hang rate。目标 60fps 下每帧 16.7ms、高刷屏 8.3ms。
14. 列表卡顿的排查路径?
复用是否生效 → 单 item 布局层级与过度绘制 → 绑定里是否做 IO/计算 → 图片解码是否在主线程。逐项排除,工具(Systrace/Instruments Time Profiler)验证。
15. 过度绘制是什么?怎么解决?
同一像素被绘制多次。解决:去掉多余背景、merge 布局减少嵌套、ViewStub 延迟加载。Android 开发者选项里可直接可视化。
16. 动画为什么掉帧?怎么保证流畅?
主线程被占 → 帧没画出来。原则:动画属性用 transform/opacity(走合成层不重排),复杂动画交由系统(属性动画/核心动画),JS/逻辑移出主线程。
17. 什么情况需要自绘?自绘的性能代价?
复杂交互组件(图表、编辑器)用自绘绕过布局系统。代价:全部渲染逻辑自己负责,要精细控制脏区与绘制频率。
18. 首帧渲染的布局优化原则?
减少层级(ConstraintLayout/组合优先)、异步 inflate/预渲染、避免首帧触发大范围 measure。
四、包体积与网络(7 问)
19. 包体积优化的系统方法?
三步:资产清理(无用资源/Lint)、代码瘦身(混淆/裁剪无用架构 slice)、资源压缩(图片 WebP、资源着色替代多套图、按需下发动态 feature)。
20. 怎么防体积回涨?
体积预算进 CI:diff 超阈值阻断合并,大文件白名单管理。机制比运动式清理有效。
21. 动态化能力(动态 feature/热修)的取舍?
按需下发减少首包,但增加复杂度与审核风险(iOS 受限)。答题要点:核心路径保持静态,长尾功能动态化。
22. 网络优化的常规手段?
HTTP/2 或 QUIC(HTTP/3)多路复用、连接复用与预建连、DNS 缓存/HTTPDNS、请求合并与缓存、弱网降级策略。
23. 弱网环境怎么保障体验?
超时分级 + 快速失败 + 明确的重试与缓存兜底;关键操作同步、非关键异步排队。加分点:提到网络质量探测(RTT 分档)驱动策略切换。
24. 电量优化的关注点?
批量合并网络请求与定位、WakeLock 用完即放、后台任务用系统调度(WorkManager/BGTaskScheduler)代替自轮询。
25. 性能优化的兜底方法论?
测量 → 归因 → 优化 → 验证 → 门禁防回退。强调「一切优化以测量为准,禁止凭感觉」——这句话本身就是面试官想听的答案。
#移动端面试#性能优化#启动优化#内存优化

