4. 性能优化与监控:列表优化、内存、包体积、启动速度
性能优化贯穿 Android 跨端开发全流程。面试官通常不只看“你做过哪些优化”,更关注发现问题→定位根因→量化收益→体系化监控的闭环能力。本章梳理列表、内存、包体积、启动速度四大方向的高频考点与实战模板。
面试问答卡片
Q1 RecyclerView 滑动卡顿如何系统性排查与优化?
| 考察点 | 性能分析工具使用、RecyclerView 复用机制、渲染优化意识 |
| 回答框架 | ① 先通过 Profiler / GPU 渲染模式定位瓶颈;② 检查 onBindViewHolder 中是否有耗时操作(图片解码、复杂计算);③ 使用 DiffUtil 减少刷新范围;④ 布局深度<4 层,降低过度绘制;⑤ 预加载/异步 inflate。 |
| 示例回答 | 我用 Profiler 发现主线程卡顿,定位到 onBindViewHolder 中 Glide 加载高分辨率图片耗时。改为固定宽高的缩略图、引入预加载池,并使用 DiffUtil 局部刷新,卡顿率从 3.5% 降至 0.8%。 |
| 可能追问 |
- Glide 和 Fresco 在列表场景下各有何优劣?
- 嵌套滑动场景(NestedScrollView + RecyclerView)如何优化?
- 你怎么测量滑帧率(fps)并上报。
避坑提醒:不要只提“图片压缩”,要说明压缩前后的内存占用对比;也不要说“用 ViewStub”,实际列表中用 ViewStub 反而可能增加 inflate 次数。
Q2 Flutter/RN 跨端项目中如何监控和治理内存泄漏?
| 考察点 | 跨端内存管理差异、工具链使用、系统化内存治理流程 |
| 回答框架 | ① 数据层:LeakCanary(Android侧)+ Dart DevTools(Flutter侧);② 常见泄漏场景:未释放的图片缓存、全局单例持有 Activity 引用、Static BuildContext;③ 治理:WeakReference + 生命周期感知组件(LifecycleObserver);④ 自动化:CI 集成内存泄漏检测,设置阈值告警。 |
| 示例回答 | 我们在 Flutter 页面关闭后发现原生 WebView 未释放。在 dispose 中主动调用 WebView.destroy(),并改用 WeakReference 持有页面上下文,泄漏率降低 90%。 |
| 可能追问 |
- 跨端 Image 缓存机制如何共享?
- Flutter Engine 的内存如何回收?
- 如何利用 Bitmap 复用池(inBitmap)?
加分提示:提到“内存快照(Heap Snapshot)对比”和“OOM 率埋点”,体现工程化思维。
Q3 APK 包体积从 80MB 降到 40MB 你会怎么做?
| 考察点 | 包体分析工具、资源/代码瘦身手段、业务推进能力 |
| 回答框架 | ① 先用 APK Analyzer 分析构成;② 代码侧:ProGuard/R8 混淆、移除冗余库、按 ABI 分包;③ 资源侧:WebP 图片、只保留 xxhdpi 缩放方案、移除未使用资源(Lint);④ 动态能力:插件化、按需下载(split APK);⑤ 效果量化:每个版本对比包体增量。 |
| 示例回答 | 上周分析发现 70% 是图片。我们统一转 WebP(有损 80%),并只保留 xxhdpi 资源,包体积从 82MB 降到 44MB。同时用 R8 移除无用代码,再减 5MB。 |
| 可能追问 |
- WebP 兼容性如何保证(Android 4.0 以下)?
- R8 和 ProGuard 的区别?
- 如果你的 App 日活 500 万,包体每增加 1MB,安装转化率会下降多少?
避坑提醒:不要只堆“优化方案”,面试官期待你提供具体数字(前后对比),以及跨团队推动资源规范化的经验。
项目案例·实战模板
| 社区信息流列表优化(Flutter + 原生混合) | |
|---|---|
| 业务背景 | 社交 App 首页信息流,包含图文、视频、广告等 20+ 卡片类型,用户滑动体验要求丝滑。 |
| 规模指标 | DAU 500 万,日曝光 1.2 亿次,列表帧率目标 ≥55fps,OOM 率 <0.01% |
| 技术栈 | Flutter 3.x + Dart + Android 原生插件(ImageLoader,WebView) + LeakCanary + Firebase Crashlytics |
| 核心难点 | ① 混合栈跳转导致原生侧内存泄漏;② Flutter 图片缓存策略与原生 Glide 争夺内存;③ 视频首帧加载阻塞滑动;④ 包体内广告 SDK 冗余 8MB。 |
| 面试高频追问 | |
- 追问1:你怎么发现 Flutter 侧图片缓存导致 OOM?→ 使用 Flutter DevTools Memory 面板发现图片缓存占 200MB,设置
maxCacheSize = 50MB。 - 追问2:视频首帧优化具体手段?→ 提前在空闲时解码首帧,存为临时缩略图,点击后无缝切换播放。
- 追问3:如何保证优化效果不退化?→ 建自动化性能基线,每日跑滑动测试 + 内存快照对比,超阈值自动告警。
可迁移回答话术:
“性能优化不能依赖单次修复,一定要建立监控→基线→阈值→告警的闭环。我在该项目中……(换成你项目具体动作)。面试官,我可以把这个模式应用到贵司的 App 启动或包体优化上。”
“性能优化不能依赖单次修复,一定要建立监控→基线→阈值→告警的闭环。我在该项目中……(换成你项目具体动作)。面试官,我可以把这个模式应用到贵司的 App 启动或包体优化上。”