
这一篇最容易出现一个误区:很多人背得出 HTTP/HTTPS、SP/MMKV、签名和混淆,但一到项目里就讲不清"为什么要这样设计"。高级岗位面试更看重你对边界和风险的理解。
1. HTTP 和 HTTPS 的区别,面试怎么答更完整?
参考答案
HTTP 是明文传输协议,HTTPS 是在 HTTP 之上增加 TLS 安全层,目标是保证传输过程中的机密性、完整性和身份校验。
面试时别只停在"HTTPS 更安全"。更完整的回答是:
- 它通过证书校验服务端身份
- 通过密钥协商建立安全会话
- 通过加密和摘要校验降低中间人篡改风险
同时要补一句:HTTPS 只能保护传输链路,不代表客户端本地存储、逆向、内存抓取这些问题自动消失。
面试官继续追问什么
TLS握手大致发生了什么?- 证书校验失败通常说明什么问题?
- 为什么上了
HTTPS仍然可能被抓包?
追问怎么答
TLS握手核心是协商加密套件、校验证书、交换密钥,最后建立一个双方都认可的安全会话。- 证书校验失败常见是证书过期、域名不匹配、证书链不完整,或者客户端做了更严格的证书绑定。
- 因为
HTTPS保护的是传输链路,不代表客户端设备可信;安装根证书、代理调试或客户端本地被攻破后,仍可能被观察到流量。
2. OkHttp 为什么常被追问?它的价值是什么?
参考答案
OkHttp 不只是一个"发请求的库",它把连接复用、拦截器链、超时控制、缓存、重试和调度统一封装起来,让网络层更容易治理。
面试时可以这样讲它的价值:
- 拦截器链便于统一鉴权、日志、重试、埋点
- 连接池减少重复建连成本
- 调度器统一管理并发请求
- 与
Retrofit结合后,接口定义和执行逻辑分离更清晰
面试官继续追问什么
- 应用拦截器和网络拦截器的区别?
- 为什么请求失败不一定应该自动重试?
- 连接复用对移动端有什么实际意义?
追问怎么答
- 应用拦截器更偏业务层,适合统一加头、日志、鉴权;网络拦截器更接近真实网络过程,能看到重定向和缓存等细节。
- 自动重试不当会放大服务端压力、制造重复写入,尤其对非幂等请求风险很大。
- 连接复用能减少频繁握手和建连成本,对高延迟、弱网和电量敏感的移动端收益很实际。
3. 弱网优化应该怎么讲?
参考答案
弱网优化不是简单地"加重试"。更合理的思路是:
- 先区分失败类型,是超时、断网、服务端错误还是 DNS 问题
- 对幂等请求才考虑自动重试
- 避免多个重复请求同时打到同一资源
- 对关键页面优先保证核心内容,非核心资源延后
- 用缓存、降级和骨架屏提升体感
高级岗位更看重你是否理解"稳定性"和"用户感知"都属于网络设计的一部分。
4. 本地存储怎么选,SharedPreferences、MMKV、数据库分别适合什么?
参考答案
SharedPreferences适合小型键值配置,使用简单,但在频繁写入或数据量增大时不够理想。MMKV本质上更适合高性能键值存储场景,读写效率通常更高。- 数据库适合结构化数据、查询条件复杂、需要事务或迁移控制的场景。
高级回答要补一句:存储选型不只是看"快不快",还要看数据模型、访问频率、一致性要求、可迁移性和排障成本。
面试官继续追问什么
apply()和commit()的区别是什么?- 为什么不是所有配置都该放数据库?
- 配置数据越来越多时,如何做迁移和兼容?
追问怎么答
apply()更偏异步提交,不阻塞当前线程;commit()会同步落盘并返回结果,可靠但更可能卡主线程。- 数据库不是万能配置桶,小而简单的键值配置放数据库会增加建模、迁移和维护成本。
- 配置越来越多时要做版本管理、默认值兼容和迁移策略,不要指望"旧字段永远不变"。
5. 离线缓存怎么设计,才能既提速又不把一致性搞乱?
参考答案
离线缓存设计通常要先回答三个问题:
- 缓存的目标是什么,是提速、离线可用,还是减轻服务端压力?
- 数据是强一致、最终一致,还是可接受短暂过期?
- 失败后用户要看到什么,是旧数据、空态,还是显式错误?
一个成熟的设计通常会包含:
- 缓存时效策略
- 拉取与写回时机
- 版本和失效机制
- 本地与远端冲突处理
面试官继续追问什么
- 先读本地还是先拉远端?
- 如何防止脏数据长时间停留?
- 用户本地修改和服务端新数据冲突时怎么办?
追问怎么答
- 先读本地还是先拉远端,要看目标是首屏速度还是强一致;很多场景会先展示本地,再异步刷新远端。
- 防止脏数据长留,关键是时效策略、版本控制和明确失效条件,而不是"缓存了就算完"。
- 冲突处理要按业务决定是客户端优先、服务端优先,还是做合并;核心是先定义规则,不能靠临场猜。
6. Android 安全里,签名、混淆、加固分别解决什么问题?
参考答案
- 签名用来证明安装包来源和完整性,是应用身份的基础。
- 混淆主要提高逆向阅读成本,同时可配合代码收缩减少包体积。
- 加固通常是进一步提高静态分析和动态篡改成本。
但高级岗位要知道:这些都不是绝对安全方案。移动端安全的核心从来不是"完全防住",而是提高攻击成本、降低敏感面、控制风险暴露。
7. 本地敏感信息为什么不能明文存储?
参考答案
因为客户端设备不可信。只要数据落到本地文件、数据库、日志甚至内存,就有被调试、导出、逆向或截获的可能。明文存储会显著放大风险,尤其是令牌、手机号、身份证号、支付相关标识等敏感信息。
正确的思路通常是:
- 能不存就不存
- 必须存时尽量缩短生命周期
- 结合系统安全能力和业务风险做最小化保存
面试官继续追问什么
- 加密存储是不是就绝对安全了?
- 为什么日志也可能成为安全漏洞?
- 风险最低的令牌设计是什么样?
追问怎么答
- 加密存储只能提高攻击成本,做不到绝对安全,因为密钥管理、运行时内存和设备环境本身都可能被攻击。
- 日志常会把请求头、用户标识、错误上下文一起打出去,一旦收集或上报不当,就会把敏感信息暴露给不该看到的人。
- 风险最低的令牌设计通常是短生命周期、最小权限、可撤销,并尽量避免长期明文持久化。
8. WebView 有哪些常见安全风险?
参考答案
WebView 风险常见在这些方面:
JavaScript接口暴露不当- 加载不可信内容
- 文件访问权限配置过宽
- 重定向与 URL 校验不严
- 混合内容和证书校验策略过松
如果项目里有 H5 混合页面,高级岗位通常会追问你是否做过 URL 白名单、桥接能力收敛和登录态隔离。
9. 为什么说移动端安全是"系统工程",不是一个 SDK 的事?
参考答案
因为风险链路是贯通的:接口设计、本地存储、日志打印、权限暴露、WebView 桥接、签名校验、灰度发布、风控策略都会互相影响。
真正成熟的安全策略通常不是"多上一层壳",而是:
- 服务端不轻信客户端
- 客户端只保留必要能力
- 敏感链路最小暴露
- 异常行为可监控、可止损
这类回答会明显比只背术语更有高级感。
相关推荐
《Android OkHttp+Retrofit+Rxjava+Hilt实现网络请求框架》