Android面试通常会覆盖多个技术维度,以下是常见问题分类及扩展内容:
1. Java/Kotlin基础
问题示例:
- 解释Java的垃圾回收机制,分代回收如何工作?
- Kotlin协程与线程的区别?挂起函数的原理是什么?
- `ArrayList`和`LinkedList`的时间复杂度差异及使用场景。
扩展知识点:
- JVM内存模型(堆、栈、方法区),OOM场景分析。
- Kotlin的`inline`、`reified`关键字作用,协程的`Dispatchers`选择策略。
2. Android核心组件
问题示例:
- Activity生命周期,`onSaveInstanceState`何时调用?
- Service的启动方式及生命周期,IntentService被弃用后如何替代?
- BroadcastReceiver的静态注册和动态注册差异,Android 8.0后的限制。
扩展知识点:
- Activity的启动模式(`singleTask`栈内复用场景)。
- JobScheduler与WorkManager的后台任务优化方案。
3. UI与自定义View
问题示例:
- RecyclerView的缓存机制(四级缓存)如何优化滚动性能?
- 自定义View的`onMeasure`、`onLayout`、`onDraw`执行流程。
- 解释ConstraintLayout的性能优势及相对定位原理。
扩展知识点:
- 屏幕适案(今日头条方案的DPI重定义)。
- View事件分发机制,`requestDisallowInterceptTouchEvent`应用场景。
4. 性能优化
问题示例:
- 内存泄漏常见场景(Handler、单例、静态变量),如何用LeakCanary检测?
- ANR触发条件及分析日志的方法(/data/anr/traces.txt)。
- 简述ProGuard与R8的代码优化原理。
扩展知识点:
- 启动优化(`AppStartUp`库、类加载优化)。
- 内存抖动排查(Allocation Tracker工具使用)。
5. 网络与多线程
问题示例:
- OkHttp的链如何实现?自定义应用(如日志、重试)。
- Retrofit动态代理的实现原理。
- 线程池的核心参数(`corePoolSize`、`workQueue`选择策略)。
扩展知识点:
- HTTP/2的多路复用与HPACK压缩。
- Coroutine的`SupervisorJob`与异常传播机制。
6. 架构与设计模式
问题示例:
- MVP与MVVM的区别,ViewModel如何避免内存泄漏?
- 依赖注入(Dagger/Hilt)中`@Module`与`@Component`的作用。
- 如何设计一个离线优先的本地缓存架构?
扩展知识点:
- MVI架构的单向数据流思想。
- 模块化开发中的ARouter路由实现原理。
7. 新技术与工具
问题示例:
- Jetpack Compose的声明式UI与传统XML布局的对比。
- Android 12的SplashScreen API兼容实现。
- 如何用`Room`实现数据库迁移?
扩展知识点:
- `ViewBinding`与`DataBinding`的性能对比。
- Dynamic Delivery模块化打包策略。
8. 开放性问题
问题示例:
- 如何从0设计一个短视频App的播放器组件?
- 遇到Crash率突然飙升的排查思路。
- 第三方SDK兼容性问题的解决流程。
掌握这些问题后,建议结合项目经验准备技术选型的思考过程(如为何选Flutter而非原生开发),并熟悉Git版本控制、CI/CD流程等工程化技能。