Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

移动端系统设计题库

移动端系统设计题没有唯一答案,面试官看的是你能否 澄清需求、拆模块、讲状态机、处理弱网/缓存/生命周期、说明权衡。本篇给一套可直接复述的题库骨架,覆盖 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、端云协同和可观测性。