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

面试路线与自我定位

这一篇不讲技术, 讲策略. 如果你的真实经历确实是 “底层强, 应用层有空白”, 可以把下面内容当作转型模板; 否则请按自己的经历重写, 不要套用不符合事实的画像. 通用读者分流: 本篇的转型话术和各知识域的 “SDK 落点” 注记围绕 “风控 SDK 背景转应用开发” 人设组织; 经历不同的读者把话术替换为真实故事, 只保留方法与节奏, SDK 落点注记可直接跳过.

使用方式与完成定义

前置知识: 能如实列出自己的项目, 职责和学习时间; 本篇的目标不是制造统一人设, 而是把事实组织成可验证的求职叙事. 完成本篇后, 你应能选择目标岗位, 说明一项真实能力的证据链, 并完成一次有记录的模拟面试.

章节完成定义可出示的证据
01 路线与定位完成能力盘点, 岗位筛选和两版自我介绍一页证据表, 投递清单, 录音或复盘笔记
02 Kotlin 核心能手写空安全, 委托和型变小例子, 并解释类型约束小练习源码与自测答案, 见 02
03 Kotlin 进阶能从编译器改写角度解释 inline, value class 和 Java 边界javap 观察记录, 见 03
04 协程与 Flow能画出 Job 父子关系并实现可取消的状态流最小项目与生命周期验证, 见 04
05 RxJava能按事件语义选择类型, 调度器和背压策略操作符时间线与 dispose 复盘, 见 05
06 Java/JVM能解释安全发布, 锁选择, 集合和类加载边界并发场景判断与字节码/日志观察, 见 06

不要把 “读完” 当作完成: 没有真实项目证据的经历只能表述为学习或练习, 不应写入工作职责.

一, 你的优势与劣势盘点

优势 (先用证据自诊断, 再在面试中主动亮出来)

能力普通应用开发者你的真实证据
C/C++ / NDK / JNI大多不会或只会调用是否有可说明的模块, 职责和结果?
系统底层 / so / 内存模糊是否能用真实问题说明理解和定位过程?
逆向 / 安全 / 对抗视角几乎没有是否是实际工作职责, 且能在合规边界内说明?
性能极限优化意识一般是否有体积 / 性能基线, 方案和验证结果?

只把能说明项目背景, 个人职责, 方案取舍和结果的能力当作优势. 若确有这些证据, native, 性能和安全经验对音视频, IM, 支付, 出海 App 等方向可能是加分项.

劣势 (面试中会被重点拷问, 必须补)

  1. UI 层: View 绘制流程, 事件分发, 自定义 View, Compose: 应用岗的核心, 你接触少.
  2. Kotlin 协程 / Flow: 现代 Android 异步基石, 你不熟.
  3. Jetpack 全家桶: ViewModel/Room/Navigation/Hilt/DataStore, 应用开发日常.
  4. 应用架构: MVVM/MVI, 单向数据流, 分层: 中级必考.
  5. 主流业务库实战: Retrofit/Glide/OkHttp 的工程化用法.

二, 转型叙事: 怎么讲你的故事

面试官一定会问:“你之前做风控 SDK, 为什么转应用开发? 能行吗?” 准备好这套话术:

“我过去在 [真实项目 / 模块] 负责 [可核验的底层工作], 积累了 [能举例说明的系统, 性能或稳定性经验]. 我希望把这些经验用在完整产品中. UI 和上层框架是我正在补的方向; [仅在完成学习和练习并能展示证据时] 我已经系统学了协程, Compose, Jetpack 和 MVVM 架构.”

关键三点:

  • 不贬低过去: 如有可核验的底层经验, 可说明它带来的系统理解, 但不要用 “比别人更懂系统” 这类无法举证的比较性表述.
  • 承认短板但展示行动: 只有完成 X, Y, Z 的学习, 练习或项目验证后, 才说 “我已经系统学了 X, Y, Z”; 否则如实说明当前进度和下一步计划.
  • 给团队一个理由: 仅在有对应经历时说 “我能补团队在 native / 性能 / 安全上的短板”, 并准备事实依据.

本手册的 SDK 视角: 这本手册不是通用 Android 考点清单, 而是围绕 “设备指纹 / 风控 SDK 背景” 组织的一条差异化叙事线. 通用篇负责补应用侧短板 (UI, 架构, 协程), 让 “没做过完整 App” 不再是硬伤; 主场篇 (42-43) 负责拉开差距, 把背景转成别人难以复制的优势. 各技术篇都能与 SDK 背景挂钩: Gradle 篇讲 SDK 的发布与 consumer-rules 视角, 合规篇讲设备标识怎么采集才合规, 协程篇落到事件上报的竞态去重与并发限流. 读每一篇时按 “能讲我哪段经历 / 补我哪块短板” 对位, 而不是逐篇背考点.

面试策略: 被问到与主线无关的问题时, 可以用 “这个问题在我的 SDK 场景里是…” 的句式主动把话题引回风控背景, 与 42 篇开头的主动引导策略呼应; 前提是确有对应经历可讲, 不要强行安插.

三, 目标岗位选型 (扬长避短)

优先投这些方向, 你的底层背景是加分项而非累赘. 每个方向都按 “为什么契合 → 面试会问什么 → 怎么包装经历 → 可能追问” 准备:

  • 音视频 / 直播 App
    • 为什么契合: 音视频链路常接触 FFmpeg, 编解码, OpenGL/音频采集, native crash 与性能调优, 你的 C++/NDK/JNI 经验能直接迁移.
    • 面试会问: JNI 调用开销怎么控制? native 崩溃怎么定位? 音视频卡顿如何拆解到采集, 编码, 网络, 渲染各环节?
    • 怎么包装: 把风控 SDK 里的 native 模块讲成 “在宿主 App 约束下做稳定, 低开销, 可回滚的 native 能力”, 突出跨层调用, 线程模型, so 体积和崩溃治理.
    • 可能追问: 如果没做过播放器, 不要硬装; 回答 “音视频业务链路我需要补, 但 native 性能, JNI 边界, crash 定位这些底层问题我能快速接住”.
  • IM / 通讯
    • 为什么契合: IM 重视连接稳定性, 弱网, 消息可靠性, 离线 / 重连和端侧性能, 很多问题不是纯 UI, 而是协议与状态机.
    • 面试会问: 弱网下如何保证体验? 长连接断线重连怎么设计? 消息去重, ACK, 重试和本地落库怎么取舍?
    • 怎么包装: 强调你做 SDK 时对宿主环境, 网络 / 设备差异, 异常采集和后台约束的敏感度, 把它转成 “端侧可靠性” 语言.
    • 可能追问: 若被问到完整 IM 架构, 先按 “连接层 → 消息状态 → 本地缓存 → UI 同步 → 失败补偿” 分层, 不要一上来堆大规模服务端名词.
  • 出海 App / 工具类
    • 为什么契合: 出海和工具类常受包体积, 机型兼容, 启动速度, 隐私合规, 多语言环境影响, SDK 背景天然关注 “不能拖累宿主”.
    • 面试会问: 包体积怎么拆? so ABI 如何收敛? 低端机启动 / 内存如何优化? 兼容性问题怎么排查?
    • 怎么包装: 讲你如何在 SDK 约束里做延迟初始化, 按需加载, ABI / 符号裁剪, 异常兜底; 这些都能转化为 App 侧工程质量.
    • 可能追问: 遇到隐私 / 合规问题时, 用 “最小化采集, 用户授权, 可配置开关, 日志脱敏” 这类工程原则回答, 不要编造具体合规项目.
  • 支付 / 金融 App
    • 为什么契合: 支付金融对安全, 风控, 稳定性和审计非常敏感, 你的对抗视角能帮助团队提前发现风险点.
    • 面试会问: 如何防 Hook/篡改/重放? 敏感数据怎么保护? 安全能力如何避免影响性能和用户体验?
    • 怎么包装: 把风控经验翻译成 “安全风险识别 + 端侧防护 + 性能可控 + 可观测”; 强调防御和工程治理, 而不是炫攻击细节.
    • 可能追问: 被追具体安全方案时, 保持防御视角, 说清威胁模型, 边界和误报成本; 不要夸大成 “完全防住”.
  • 大厂基础架构 / 性能团队
    • 为什么契合: 基础架构和性能团队关注启动, APM, 稳定性, 包体积, native 质量和跨业务复用, 与你的 SDK 工程经验最接近.
    • 面试会问: 启动耗时如何拆解? APM 指标怎么定义? native crash 符号化怎么做? 一个优化如何灰度和回滚?
    • 怎么包装: 突出 “做给多个宿主 / 业务使用” 的 SDK 思维: 接口稳定, 兼容性, 监控, 降级, 性能预算, 发布质量.
    • 可能追问: 如果问到业务产品经验不足, 回应 “我更适合先从性能/稳定性/native 基建切入, 同时补齐 UI 和业务架构”.

谨慎投: 纯营销活动类, 纯 UI 堆叠的业务岗: 这类岗位你的优势用不上, 而短板暴露无遗.

四, 典型面试流程与各轮重点

轮次考察重点典型问题回答结构易翻车点
一面 (基础)Kotlin, 四大组件, UI, 协程, 集合并发“协程取消怎么生效?” “View 事件分发怎么走?” “Activity 重建怎么保状态?”先给一句结论, 再按 “机制 → 场景 → 易错点” 三段答; 不会展开源码时, 至少说清生命周期/线程/状态边界只会背概念, 不敢承认 UI/Jetpack 短板; 把底层强项当借口跳过基础题
二面 (深入)架构, 性能, 原理, 项目细节“一个页面你怎么分层?” “启动慢怎么定位?” “SDK 怎么不拖累宿主?”用 “问题现象 → 指标拆解 → 定位工具 → 方案取舍 → 验证结果” 讲; 项目题用 STAR, 结果处只填真实数据讲项目只有职责没有决策; 性能优化只说 “异步 / 缓存” 不讲指标和验证
三面 (亮点)难题, 系统设计, native, 稳定性“native crash 怎么治理?” “设计一个端侧 APM/埋点 SDK” “安全能力如何灰度?”把主场拉到 “NDK/JNI → 稳定性 → 性能预算 → 监控回滚”; 系统设计按需求, 约束, 模块, 数据流, 失败处理讲炫技过多, 忽略业务约束; 安全话题讲成攻击教程; 承诺无法验证的效果
HR 面稳定性, 薪资, 转型动机“为什么转应用?” “短板怎么补?” “未来 2-3 年规划?”用第二节叙事: 肯定过去价值, 承认上层短板, 展示学习行动和岗位匹配; 薪资提前准备区间抱怨前公司 / 旧方向; 把转型说成逃离; 用空话证明学习能力

每轮都要准备一个 “桥接句”:我过去做的是底层 SDK, 现在补的是应用层 API 和架构实践; 底层经验能帮助我在性能, 稳定性, 安全问题上比普通应用开发者更快定位根因. 这句话不是万能答案, 而是把话题从 “你没做过完整 App” 拉回 “你能给团队补什么能力”.

五, 两个月冲刺计划 (示例, 按诊断结果调整)

这只是排期示例, 不承诺固定两个月能补齐真实项目经验. 先用模拟面试和自测确定短板, 再调整每阶段时长.

六, 心态提醒

如果你已有可核验的底层经验, 这不是从零开始; 如果没有, 就从真实基础出发. 上层知识可通过阶段性学习逐步补齐, 但项目实践, 结果和协作经验仍需要真实证据积累. 把姿态放在 “我带着已有能力并持续补齐应用实践” 的位置, 不夸大也不回避短板.

职业规划证据练习表单

以下方括号字段是读者练习表单, 不是出版正文的未完成内容, 也不替读者生成个人答案. 只填写自己可证明的事实; 指标, 职责或成果没有证据时, 填写 [未测量/待补证据], 不以推测替代.

字段读者填写可复核证据
目标岗位[你的目标岗位][岗位描述链接或保存日期]
已验证技能[你的已完成作品或学习证据][仓库/提交/练习记录/演示]
待补能力[你尚未证明的能力][对应章节, 练习或岗位要求]
行动时间窗[你的开始日期, 结束日期或复盘日期][学习计划, 日历或任务记录]
复盘证据[你的复盘链接, 录音或笔记][追问记录, 反馈或修订说明]

完成条件: 能用上述证据说明目标岗位与当前能力的匹配和缺口, 并能区分已完成, 进行中与未知项. 在读者填入可核验证据前, “职业规划” 类开放题只能视为部分完成.

七, 把学习变成可核验经历

简历 before / after (上下文片段, 方括号内容必须替换为事实)

不要在简历中把课程目录改写成工作成果. 下面是同一事实的表达对比:

Before:熟悉 Kotlin,协程,Compose,参与 Android SDK 开发.

After:[时间] 在 [项目/练习仓库] 中负责 [具体模块];用 [技术] 解决了
[可描述的问题].我负责 [个人决策与实现],通过 [测试,日志,人工步骤]
验证 [实际观察到的结果];限制是 [尚未覆盖的边界].

“After” 只有在每个占位项都有证据时才能使用. 常见失败是把团队成果, 无法复现的数字或尚未完成的学习写成个人结果. 排查路径: 症状是追问时无法复述输入和验证; 证据是没有 PR, 文档, 测试记录或演示; 定位为证据链断裂; 修复是删去推测性成果并改成职责和学习状态; 验证是请同事或自己按 STAR 追问五分钟仍能回答.

最小练习项目

建立一个本地, 可公开或私有的 “任务列表” 练习项目, 不必伪造线上数据. 它至少包含: 一个输入表单, ViewModel 持有的 StateFlow, 一个可取消的模拟加载, 加载/空/错误状态, 以及一次本地持久化或 fake repository. 分别在 README 或笔记中写下:

  1. 每个状态由什么事件触发, 以及状态不可恢复时如何处理.
  2. 旋转屏幕或离开页面时协程如何取消 / 重新收集.
  3. 一个你亲自遇到的失败及 “症状→证据→定位→修复→验证”.

项目完成标准是能够从零演示上述流程, 并在不看稿的情况下说明为什么用 StateFlow 而不是一次性事件; 具体实现学习路径链接到协程与 Flow, 不在本篇重复技术细节.

20 分钟模拟面试脚本

时间面试官问题你的任务复盘标准
0-3 分钟“请介绍一个与你目标岗位相关的项目.”按背景, 职责, 决策, 验证说明一件真事不出现无法解释的指标或团队成果归属
3-8 分钟“为什么从底层转 Android 应用?”使用第二节叙事, 明确已会, 正在学和未做过的部分能说出下一项练习和完成时间, 而非泛泛说学习快
8-14 分钟“加载页面时协程取消如何生效?”画 Job 父子图, 解释生命周期和取消边界能区分挂起与阻塞, 状态与瞬时效果
14-18 分钟“一次性能问题怎么定位?”只用真实案例; 没有案例时说明会怎样测量和收集证据不承诺未经测量的收益
18-20 分钟“你想问什么?”询问团队技术栈, 交付约束和岗位成功标准问题能帮助判断岗位匹配

录音后逐题标记 “事实, 推断, 未知”.未知不是失败; 将其转成下一周的学习任务, 完成后再更新说法.