Android 开发工程师秋招面试真题汇总与备考经验
个人背景与求职经历
- 学历:双非院校
- 专业:软件工程
- 求职岗位:Android 开发工程师
- 状态:已上岸
本人从大二开始学习 Java 语言,后转入 Android 开发方向。大三期间曾尝试转向大数据技术栈,导致 Android 与大数据双路线并行学习,最终因精力分散及环境配置问题调整回 Android 开发主线。
秋招流程通常为:笔试 => 第一轮技术面 => 第二轮技术面 => (第三轮技术面) => HR 面 => (意向书) => 谈薪。本文整理了在字节等大厂面试中遇到的核心问题,特别是网络组件 OkHttp 和 Retrofit 相关的深度原理题,这些题目往往考察对源码的理解及开放性思考。
核心面试题整理
1. 网络通信
- 动态代理:什么是动态代理?和静态代理的区别是什么?JDK 中动态代理是怎么实现的?
- 设计模式:在项目中你有用到哪些设计模式?解决了什么问题?
- 文件传输:怎么使用 OkHttp 或者 Retrofit 完成文件下载上传?如果网络比较差(2G/3G),怎么进行弱网优化?
- HTTP 协议:Http1 和 Http2 的区别是什么?
- TCP/UDP:谈谈 TCP 与 UDP 的理解;Socket 连接池怎么复用?TCP 怎么拥塞控制?SSL 的握手和采用的加密算法?
- OkHttp 原理:okhttp 为什么会使用 okio 而不是用普通 IO?okHttp 进行网络请求优化的原理?
- 缓存机制:OKHttp 如何实现缓存?OKHttp 的超时时间,有考虑 DNS 超时码吗?
- 线程池:OKHttp 线程池、连接池讲下。
- 拦截器:OKHttp 的所有拦截器有哪些,请求失败了重试 1、2 次怎么做?
- Retrofit:Retrofit 实现机制;Room 注解如何在编译时生成类文件。
- HTTPS:http 和 https 的区别,shakehand 的过程说下;网络劫持是什么,应该怎么做?
- 状态码:状态码 400、401,3xx 有哪些?
- TCP 细节:TCP 三次握手,握手中的网络包各个标记位是多少,四次挥手说一下;TCP 发送窗口是什么?
- 混合开发:混合开发 h5 了解多少?浏览器窗口访问一个网址的过程?
- 请求方式:POST 和 GET 有什么区别?
2. Android 基础
- ListView/RecyclerView:ListView 如何缓存的?RecyclerView 联系人列表如何实现 A-Z 快速定位?
- 事件总线:广播和 EventBus 的区别。
- 主线程:主线程 Looper 循环为什么没有卡主线程?nativePollOnce。
- 数据存储:SharedPreference 的线程安全、进程安全,如何跨进程?
- 多线程:Android 中实现多线程:threads, Handler, AsyncTask, IntentService。
- 多进程:Android 中如何实现多进程?有哪些进程间通信方式?
- View 系统:自定义 View 的过程:measure,layout,draw;LayoutInflater#inflate 的 attachToParent true 是什么意思?View 的渲染过程?
- :theme 和 style 有什么区别,优先级?


