当前位置: 首页 > article >正文

Android Framework 常见面试题

以下是常见的 Android Framework 面试题,涵盖基础到高级知识点,帮助准备面试:


一、基础问题

  1. Android 系统架构分层

    • 描述 Android 系统的四层架构(Linux Kernel、Native、Framework、Application)及各层职责。

    • Zygote 进程的作用是什么?它如何启动应用进程?

  2. 四大组件与生命周期

    • Activity 的启动模式(standard、singleTop、singleTask、singleInstance)及应用场景。

    • Service 的两种启动方式(startService 和 bindService)的区别及生命周期。

    • BroadcastReceiver 的注册方式(静态注册 vs 动态注册)及优劣。

  3. Binder 机制

    • 为什么 Android 使用 Binder 而不是传统 IPC(如管道、Socket)?

    • 简述 Binder 的工作原理(驱动层、ServiceManager 等)。

  4. Handler 机制

    • Handler、Looper、MessageQueue 如何协作实现线程间通信?

    • 主线程为什么不会因为 Looper.loop() 而卡死?

   5. 系统启动流程

问题:从电源键到 Launcher 的启动过程。
答案

  1. Bootloader:加载 Linux Kernel。

  2. Kernel:初始化硬件驱动,启动 init 进程。

  3. init 进程:解析 init.rc,启动 Zygote 和 ServiceManager。

  4. Zygote:预加载资源,fork() SystemServer 进程。

  5. SystemServer:启动 AMS、WMS、PMS 等核心服务。

  6. 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 的流程。
答案

  1. Launcher 通过 Binder 通知 AMS 启动目标 Activity。

  2. AMS 检查目标进程是否存在,若不存在则通过 Zygote fork() 新进程。

  3. 新进程启动后,执行 ActivityThread.main(),创建主线程 Looper。

  4. AMS 通过 Binder 通知新进程的 ApplicationThread 创建 Activity 实例。

  5. Activity 执行 onCreate()onStart()onResume(),通过 WMS 和 SurfaceFlinger 渲染 UI。

8. Handler 机制

问题:Handler、Looper、MessageQueue 如何协作?
答案

  1. Looper.prepare():创建 Looper 和 MessageQueue。

  2. Looper.loop():循环从 MessageQueue 取消息,交给 Handler 处理。

  3. Handler:发送消息(sendMessage())和处理消息(handleMessage())。

主线程为何不卡死

  • 基于 Linux 的 epoll 机制,MessageQueue 空闲时阻塞,有消息时唤醒。

  • ANR 检测通过 InputEvent 和 Broadcast 超时机制触发,与 Looper 无关。

9. Activity 启动模式

问题:解释四种启动模式及应用场景。
答案

  • standard:默认模式,每次启动创建新实例(如普通页面)。

  • singleTop:栈顶复用,避免重复打开同一页面(如通知跳转)。

  • singleTask:栈内复用并清理栈顶之上的 Activity(如 App 主页)。

  • singleInstance:独立任务栈,全局唯一(如系统拨号界面)。

10. Hook 技术

问题:如何拦截 Activity 的启动?
答案

  1. 通过反射获取 AMS 的 Binder 代理对象(IActivityManager)。

  2. 创建动态代理(Proxy.newProxyInstance()),拦截 startActivity() 方法。

  3. 替换系统 AMS 代理为自定义代理,实现逻辑拦截。


二、中级问题

  1. 系统服务(AMS/WMS/PMS)

    • ActivityManagerService (AMS) 的主要职责是什么?

    • WindowManagerService (WMS) 如何管理窗口的层级和显示?

    • PackageManagerService (PMS) 如何管理应用安装与权限?

  2. 应用启动流程

    • 从点击图标到 Activity 显示,描述整个流程(涉及进程、AMS、Binder 等)。

  3. 进程与线程

    • Android 进程间通信(IPC)有哪些方式?Binder 的优势是什么?

    • AsyncTask 的工作原理及潜在问题(内存泄漏、兼容性)。

  4. UI 绘制与事件分发

    • View 的测量(Measure)、布局(Layout)、绘制(Draw)流程。

    • 事件分发机制(onTouchEvent、onInterceptTouchEvent 的执行顺序)。

  5. ANR 与 Crash

    • ANR 发生的条件及如何排查?

    • 如何捕获全局 Crash 并上传日志?


三、高级问题

  1. 性能优化

    • 如何分析并优化 UI 卡顿(掉帧)问题?

    • 内存泄漏的常见场景(Handler、静态变量、匿名内部类)及检测工具(LeakCanary、MAT)。

  2. 系统启动流程

    • 从按下电源键到 Launcher 启动的系统流程(涉及 Bootloader、Kernel、Init、Zygote、SystemServer)。

  3. 自定义 View 与 Framework 扩展

    • 如何实现一个自定义 View?需要注意哪些问题(测量、绘制、触摸反馈)?

    • 如何通过 Hook 技术修改系统行为(如拦截 Activity 启动)?

  4. Jetpack 与 Framework 结合

    • Lifecycle 组件如何利用 Framework 的 Activity/Fragment 生命周期?

    • ViewModel 如何解决配置变更导致的数据销毁问题?

  5. Framework 源码分析

    • 分析一次 startActivity 的源码调用链路。

    • 解释 View.post() 为什么能获取到 View 的宽高?


四、开放性问题

  1. 如何设计一个类似于 Android 的跨进程通信框架?

  2. 如果系统出现“黑屏”或“白屏”,可能由哪些 Framework 层的 Bug 导致?

  3. 如何优化应用冷启动速度(从进程创建到首帧渲染)?


考察重点

  • 原理深度:如 Binder 驱动、Handler 底层实现(epoll 机制)。

  • 系统设计:对 AMS、WMS 等核心服务的理解。

  • 问题解决能力:ANR/OOM 等复杂场景的排查思路。

  • 源码熟悉度:常见类的源码(如 Handler、ActivityThread)。


http://www.kler.cn/a/579130.html

相关文章:

  • Python 文件和异常(写入文件)
  • clickhouse修改和删除数据
  • 特征表示深度解析:颜色、纹理、形状与编码
  • linux学习(五)(服务器审查,正常运行时间负载,身份验证日志,正在运行的服务,评估可用内存)
  • 观看文艺汇演问题
  • Scala 中的String常量池
  • 网络原理--JVM简介
  • 微服务与无服务器:我的理解与实践
  • C#实现软件重启的功能
  • Mysql表的复合查询
  • Java初级入门学习
  • 若依vue前端queryParams搜索下拉框无法重置或者重置值有问题
  • Linux Shell脚本-分隔符问题
  • ArduPilot开源代码之AP_OSD
  • 深度学习编译器(整理某survey)
  • 前端 | 向后端传数据,判断问题所在的调试过程
  • GDB调试技巧:多线程案例分析(保姆级)
  • 家政小程序源码功能方案详细php
  • 【论文阅读】VAD: Vectorized Scene Representation for Efficient Autonomous Driving
  • Python爬虫入门实战:爬取博客文章数据并保存