移动端系统设计题库
移动端系统设计题没有唯一答案,面试官看的是你能否 澄清需求、拆模块、讲状态机、处理弱网/缓存/生命周期、说明权衡。本篇给一套可直接复述的题库骨架,覆盖 Android 应用和 SDK 场景。
一、移动端系统设计答题框架
任何题都按同一套路展开,避免一上来堆模块名。
1. 澄清需求:用户规模、数据量、离线、实时性、平台约束
2. 画端侧架构:UI/API/存储/任务/监控/安全
3. 讲核心流程:请求、缓存、状态机、失败恢复
4. 补移动端约束:生命周期、弱网、进程死亡、电量、隐私
5. 讲权衡:一致性 vs 性能、内存 vs 命中率、实时 vs 省电
| 维度 | 必答点 | Android 关键词 |
|---|---|---|
| 生命周期 | 页面销毁、进程死亡、前后台 | ViewModel、WorkManager、Service |
| 存储 | 缓存、离线、一致性 | Room、DataStore、文件、Paging3 |
| 网络 | 弱网、重试、幂等 | OkHttp、WebSocket、退避 |
| 性能 | 内存、线程、卡顿 | LruCache、线程池、Profiler |
| 安全合规 | 权限、隐私、加密 | Pinning、最小化采集、加密存储 |
二、题 1:设计图片加载框架
澄清:支持网络/本地/资源图?是否要 GIF/WebP/缩略图?列表滑动场景规模?内存上限?
骨架:
- API 层:
with(context).load(url).placeholder().into(imageView)。 - 请求管理:按生命周期绑定 Activity/Fragment,页面销毁取消。
- 缓存:内存 LRU、磁盘 LRU、活动资源弱引用/引用计数。
- 解码:按 View 尺寸采样,BitmapPool 复用,后台线程解码。
- 并发:下载线程池、同 URL 请求合并、列表复用 tag 防错图。
权衡:内存缓存越大命中率越高但 OOM 风险越大;磁盘缓存提升离线体验但占存储;精确采样省内存但可能牺牲清晰度。
三、题 2:设计埋点/Tracking SDK
澄清:采集哪些事件?实时还是批量?是否跨进程?隐私合规要求?宿主接入成本?
骨架:
- 采集层:手动埋点、自动页面曝光、点击、性能指标。
- 本地队列:Room/文件追加写,限制大小,进程死亡不丢关键事件。
- 采样去重:按用户稳定采样,短窗口 fingerprint 去重。
- 上报层:批量 gzip,弱网退避,只在合适网络/电量条件下上传。
- 可观测:SDK 自身错误、丢弃原因、队列长度、上报成功率。
权衡:实时性 vs 电量/流量;自动采集覆盖高但侵入和误报风险高;隐私字段必须最小化、脱敏和可配置。
四、题 3:设计断点续传下载器
澄清:单文件还是多任务?是否后台下载?文件多大?是否多线程分片?是否需要校验?
骨架:
- 任务模型:taskId、url、目标路径、状态、已下载字节、etag、分片信息。
- 下载层:HTTP Range 分片,RandomAccessFile 写指定偏移。
- 状态机:Idle → Downloading → Paused/Failed/Completed,失败可 Retrying。
- 持久化:Room 保存分片进度,进程死亡后恢复。
- 后台:WorkManager/ForegroundService 处理长任务和通知。
权衡:多线程分片更快但占连接和服务端压力;校验更安全但耗 CPU;后台下载要平衡系统限制和用户可见性。
五、题 4:设计 IM 长连接与消息同步
澄清:单聊/群聊?是否强实时?消息是否端到端加密?离线多久?多端同步?
骨架:
- 连接层:WebSocket/TCP 长连接,心跳,断线重连,网络切换重连。
- 消息模型:clientMsgId、serverMsgId、conversationId、seq、状态。
- 可靠性:发送 ACK、接收 ACK、超时重发、幂等去重。
- 有序性:服务端 seq,客户端按 seq 拉增量补洞。
- 本地存储:Room 保存会话、消息、未发送队列,UI 观察本地库。
权衡:心跳越频繁实时性越好但耗电;推拉结合比纯推送更可靠;严格有序会增加服务端和端侧状态复杂度。
六、题 5:设计离线缓存框架
澄清:缓存接口响应、图片、配置还是业务数据?一致性要求?离线可编辑吗?
骨架:
- 缓存策略:Cache-Aside、单一可信源、TTL、版本号/etag。
- 存储层:Room 存结构化数据,文件存大对象,DataStore 存轻量配置。
- 同步层:网络成功后事务入库;离线修改进入待同步队列。
- 冲突处理:服务端版本、本地更新时间、业务合并规则。
- 清理:LRU/TTL/空间上限/用户登出清理。
权衡:强一致需要更多同步和冲突处理;最终一致更适合移动弱网;缓存越久离线体验越好但过期风险越高。
七、题 6:设计 Crash SDK 与日志系统
澄清:Java/Kotlin crash、native crash、ANR 都要吗?是否符号化?是否要求启动早期捕获?
骨架:
- 捕获:UncaughtExceptionHandler、native signal handler、ANR watchdog/系统 traces。
- 持久化:crash 发生时写最小安全信息,下次启动补充上报。
- 符号化:Java mapping、native so buildId/symbol 文件、版本匹配。
- 日志:环形缓冲记录关键 breadcrumb,避免无限写磁盘。
- 上报:启动后延迟上传,去重、采样、压缩、退避。
权衡:crash 时环境不安全,不能做复杂分配/网络;日志越详细越利于定位但越占隐私和存储。
八、题 7:设计权限治理框架
澄清:面向宿主 App 还是 SDK?覆盖 Android 版本适配吗?是否要合规审计?
骨架:
- 权限声明:集中注册每个业务使用的权限、目的、触发时机。
- 请求编排:按场景弹说明页,再调系统权限,处理拒绝/永久拒绝。
- 版本适配:通知、相册、蓝牙、定位、后台定位按系统版本差异处理。
- 审计:记录权限请求来源、结果、时间,给隐私合规看板。
- SDK 约束:SDK 不直接弹权限,由宿主授权后传入能力。
权衡:集中治理降低滥用但接入成本更高;权限前置会转化差,按需申请更符合合规和用户体验。
九、题 8:设计组件化 Router
澄清:只做页面跳转还是跨模块服务调用?是否支持降级、鉴权、动态化?
骨架:
- 路由表:编译期注解生成 path → Activity/Handler 映射。
- 参数:类型安全参数解析,必填校验,默认值。
- 拦截器:登录、权限、风控、灰度、降级。
- 跨模块:接口下沉到 api module,实现由业务模块注册。
- 监控:路由耗时、失败原因、未命中 path。
权衡:编译期生成性能好但灵活性低;运行时注册灵活但可能漏注册;路由太万能会变成隐藏依赖中心。
十、题 9:设计短视频 Feed
澄清:信息流还是沉浸式上下滑?是否直播?视频码率?离线缓存?推荐实时性?
骨架:
- 数据:Paging3 拉取 feed,Room 缓存元数据和游标。
- 播放:播放器池复用 1-3 个 ExoPlayer,滑动切换 Surface。
- 预加载:预取下 N 条元数据、封面、视频头部片段。
- 缓存:边下边播,磁盘 LRU,弱网切低码率。
- 性能:控制同时解码数量,滑出释放,监控首帧、卡顿、耗电。
权衡:预加载越多秒开越好但流量和内存更高;播放器复用降低成本但状态管理复杂。
十一、题 10:设计登录状态与 Token 刷新
澄清:单端/多端登录?access token/refresh token?是否支持游客态?安全等级?
骨架:
- 状态:未登录、游客、已登录、刷新中、过期、被踢。
- 存储:token 加密存储,用户信息 Room/DataStore 分层。
- 刷新:401 后单飞刷新,并发请求等待同一刷新结果。
- 安全:设备绑定、Pinning、风控校验、敏感操作二次验证。
- 清理:登出/被踢清理用户数据、取消队列、通知 UI。
权衡:token 有效期越长体验越好但风险越高;刷新太频繁增加服务端压力;多端策略要和业务安全一致。
十二、题 11:设计设备指纹 SDK
澄清:用于风控、反作弊还是统计?允许采集哪些字段?离线可用吗?合规边界?
骨架:
- 采集:系统、硬件、网络、App 环境等合规字段,按权限最小化。
- 归一化:字段清洗、稳定性分级、缺失值处理。
- 指纹生成:加权特征、hash/签名、相似度匹配,支持版本演进。
- 安全:本地加密、防篡改、请求签名、Pinning。
- SDK 工程:异步初始化、缓存、超时降级、宿主性能监控。
权衡:字段越多识别率越高但隐私风险越大;完全离线响应快但模型更新慢;端云结合更准但依赖网络。
十三、题 12:设计移动端配置/实验下发系统
澄清:配置实时性?是否灰度/AB 实验?失败默认值?是否影响启动?
骨架:
- 拉取:启动异步拉、前后台切换拉、长轮询/推送可选。
- 缓存:本地保存版本、etag、生效时间、默认兜底。
- 灰度:按 userId/deviceId hash 分桶,保证稳定命中。
- 安全:配置签名校验,防止中间人篡改关键开关。
- 回滚:服务端版本回退,客户端过期降级。
权衡:启动同步拉能拿最新配置但拖慢启动;异步拉体验好但首次可能用旧配置;强安全配置需要签名和审计。
高频面试题
Q1:移动端系统设计题第一步说什么? 先澄清需求和约束:功能边界、数据量、实时性、离线要求、Android 版本、内存/电量/隐私限制。直接画模块容易漏掉关键约束。
Q2:设计 SDK 和设计 App 功能有什么不同? SDK 更强调低侵入、宿主性能影响、初始化时机、可配置、隐私合规、版本兼容和故障隔离。SDK 不能随意弹权限、开线程或抢占宿主资源。
Q3:移动端系统设计为什么要讲状态机? 因为弱网、进程死亡、页面销毁和用户重复操作都会造成中间态。状态机能说明任务如何暂停、恢复、失败、重试和完成,比静态模块图更接近真实工程。
Q4:如何体现中高级工程思维? 每个方案都补权衡和可观测性:为什么选这个缓存/重试/同步策略,失败如何降级,怎么监控成功率、耗时、队列长度和错误原因。
易错点 / 追问
- 易错:只画端侧模块,不讲弱网、进程死亡、生命周期和数据一致性。
- 追问:如果用户清后台后任务如何恢复?需要持久化状态,用 WorkManager/前台服务或下次启动恢复。
- 易错:把所有题都回答成“加缓存 + 加重试”;要说明缓存过期、幂等、冲突和退避策略。
- 追问:系统设计如何结合你的风控 SDK 背景?在埋点、设备指纹、网络安全、Crash/日志 SDK 中讲隐私、性能、Pinning、端云协同和可观测性。