以下是常见的 Android Framework 面试题,涵盖基础到高级知识点,帮助准备面试:
一、基础问题
-
Android 系统架构分层
-
描述 Android 系统的四层架构(Linux Kernel、Native、Framework、Application)及各层职责。
-
Zygote 进程的作用是什么?它如何启动应用进程?
-
-
四大组件与生命周期
-
Activity 的启动模式(standard、singleTop、singleTask、singleInstance)及应用场景。
-
Service 的两种启动方式(startService 和 bindService)的区别及生命周期。
-
BroadcastReceiver 的注册方式(静态注册 vs 动态注册)及优劣。
-
-
Binder 机制
-
为什么 Android 使用 Binder 而不是传统 IPC(如管道、Socket)?
-
简述 Binder 的工作原理(驱动层、ServiceManager 等)。
-
-
Handler 机制
-
Handler、Looper、MessageQueue 如何协作实现线程间通信?
-
主线程为什么不会因为 Looper.loop() 而卡死?
-
5. 系统启动流程
问题:从电源键到 Launcher 的启动过程。
答案:
-
Bootloader:加载 Linux Kernel。
-
Kernel:初始化硬件驱动,启动
init
进程。 -
init 进程:解析
init.rc
,启动 Zygote 和 ServiceManager。 -
Zygote:预加载资源,
fork()
SystemServer 进程。 -
SystemServer:启动 AMS、WMS、PMS 等核心服务。
-
Launcher:SystemServer 启动完成后,启动桌面应用。
6. UI 绘制流程
问题:描述 View 的 Measure、Layout、Draw 流程。
答案:
-
Measure:父 View 通过
measure()
调用子 View 的onMeasure()
,根据MeasureSpec
计算宽高。 -
Layout:父 View 通过
layout()
确定子 View 的位置(left/top/right/bottom
)。 -
Draw:通过
draw()
调用onDraw()
,利用 Canvas 和 Paint 绘制内容。 -
优化:避免在
onDraw()
中创建对象,减少布局层级。
7. 应用启动流程
问题:点击图标到显示 Activity 的流程。
答案:
-
Launcher 通过 Binder 通知 AMS 启动目标 Activity。
-
AMS 检查目标进程是否存在,若不存在则通过 Zygote
fork()
新进程。 -
新进程启动后,执行
ActivityThread.main()
,创建主线程 Looper。 -
AMS 通过 Binder 通知新进程的
ApplicationThread
创建 Activity 实例。 -
Activity 执行
onCreate()
、onStart()
、onResume()
,通过 WMS 和 SurfaceFlinger 渲染 UI。
8. Handler 机制
问题:Handler、Looper、MessageQueue 如何协作?
答案:
-
Looper.prepare():创建 Looper 和 MessageQueue。
-
Looper.loop():循环从 MessageQueue 取消息,交给 Handler 处理。
-
Handler:发送消息(
sendMessage()
)和处理消息(handleMessage()
)。
主线程为何不卡死:
-
基于 Linux 的
epoll
机制,MessageQueue 空闲时阻塞,有消息时唤醒。 -
ANR 检测通过
InputEvent
和Broadcast
超时机制触发,与 Looper 无关。
9. Activity 启动模式
问题:解释四种启动模式及应用场景。
答案:
-
standard:默认模式,每次启动创建新实例(如普通页面)。
-
singleTop:栈顶复用,避免重复打开同一页面(如通知跳转)。
-
singleTask:栈内复用并清理栈顶之上的 Activity(如 App 主页)。
-
singleInstance:独立任务栈,全局唯一(如系统拨号界面)。
10. Hook 技术
问题:如何拦截 Activity 的启动?
答案:
-
通过反射获取 AMS 的 Binder 代理对象(
IActivityManager
)。 -
创建动态代理(
Proxy.newProxyInstance()
),拦截startActivity()
方法。 -
替换系统 AMS 代理为自定义代理,实现逻辑拦截。
二、中级问题
-
系统服务(AMS/WMS/PMS)
-
ActivityManagerService (AMS) 的主要职责是什么?
-
WindowManagerService (WMS) 如何管理窗口的层级和显示?
-
PackageManagerService (PMS) 如何管理应用安装与权限?
-
-
应用启动流程
-
从点击图标到 Activity 显示,描述整个流程(涉及进程、AMS、Binder 等)。
-
-
进程与线程
-
Android 进程间通信(IPC)有哪些方式?Binder 的优势是什么?
-
AsyncTask 的工作原理及潜在问题(内存泄漏、兼容性)。
-
-
UI 绘制与事件分发
-
View 的测量(Measure)、布局(Layout)、绘制(Draw)流程。
-
事件分发机制(onTouchEvent、onInterceptTouchEvent 的执行顺序)。
-
-
ANR 与 Crash
-
ANR 发生的条件及如何排查?
-
如何捕获全局 Crash 并上传日志?
-
三、高级问题
-
性能优化
-
如何分析并优化 UI 卡顿(掉帧)问题?
-
内存泄漏的常见场景(Handler、静态变量、匿名内部类)及检测工具(LeakCanary、MAT)。
-
-
系统启动流程
-
从按下电源键到 Launcher 启动的系统流程(涉及 Bootloader、Kernel、Init、Zygote、SystemServer)。
-
-
自定义 View 与 Framework 扩展
-
如何实现一个自定义 View?需要注意哪些问题(测量、绘制、触摸反馈)?
-
如何通过 Hook 技术修改系统行为(如拦截 Activity 启动)?
-
-
Jetpack 与 Framework 结合
-
Lifecycle 组件如何利用 Framework 的 Activity/Fragment 生命周期?
-
ViewModel 如何解决配置变更导致的数据销毁问题?
-
-
Framework 源码分析
-
分析一次 startActivity 的源码调用链路。
-
解释 View.post() 为什么能获取到 View 的宽高?
-
四、开放性问题
-
如何设计一个类似于 Android 的跨进程通信框架?
-
如果系统出现“黑屏”或“白屏”,可能由哪些 Framework 层的 Bug 导致?
-
如何优化应用冷启动速度(从进程创建到首帧渲染)?
考察重点
-
原理深度:如 Binder 驱动、Handler 底层实现(epoll 机制)。
-
系统设计:对 AMS、WMS 等核心服务的理解。
-
问题解决能力:ANR/OOM 等复杂场景的排查思路。
-
源码熟悉度:常见类的源码(如 Handler、ActivityThread)。