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.rhkb.cn/news/29817.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《A++ 敏捷开发》- 18 软件需求

需求并不是关于需求 (Requirements are not really about requirements) 大家去公共图书馆寄存物品,以前都是扫二维码开箱,有些图书馆升级了使用指纹识别。 “是否新方法比以前好?”我问年轻的开发人员。 “当然用指纹识别好。新技术&#x…

【智能体架构:Agent】LangChain智能体类型ReAct、Self-ASK的区别

1. 什么是智能体 将大语言模型作为一个推理引擎。给定一个任务, 智能体自动生成完成任务所需步骤, 执行相应动作(例如选择并调用工具), 直到任务完成。 2. 先定义工具:Tools 可以是一个函数或三方 API也…

Vue进阶之Vue3源码解析(一)

Vue3源码解析 目录结构编译compiler-corepackage.jsonsrc/index.ts 入口文件src/compile.ts生成ASTsrc/parse.ts 代码转换src/transform.ts几种策略模式src/transforms/transformElement.tssrc/transforms/transformText.tssrc/transforms/transformExpression.ts 代码生成src/…

servlet tomcat

在spring-mvc demo程序运行到DispatcherServlet的mvc处理 一文中,我们实践了浏览器输入一个请求,然后到SpringMvc的DispatcherServlet处理的整个流程. 设计上这些都是tomcat servlet的处理 那么究竟这是怎么到DispatcherServlet处理的,本文将…

【我的待办(MyTodolists)-免费无内购的 IOS 应用】

我的待办(MyTodolists) 我的待办:智能任务管理助手应用说明主要功能为什么选择"我的待办"?隐私保障使用截图 我的待办:智能任务管理助手 应用说明 "我的待办"是一款智能化的任务管理应用&#x…

GCC RISCV 后端 -- C语言语法分析过程

在 GCC 编译一个 C 源代码时,先会通过宏处理,形成 一个叫转译单元(translation_unit),接着进行语法分析,C 的语法分析入口是 static void c_parser_translation_unit(c_parser *parser); 接着就通过类似递…

Vim复制内容到系统剪切板

参考链接 【Vim】Vim 中将文件内容复制到系统剪切板的方法_vi 复制到系统剪贴板-CSDN博客 [转]vim如何复制到系统剪贴板 - biiigwang - 博客园 1. 确定Vim是否支持复制到系统剪切板 输入命令 vim --version | grep clipboard 如果是开头,说明支持系统剪切板&…

测试用大模型组词

已经把hanzi-writer的js的调用、hanzi-writer调用的数千个汉字的json文件,全都放在本地了。虽然用的办法还是比较笨的。我注意到 大模型也可以部署本地,虽然使用频率低的情况下不划算。 尝试直接通过html的javascript通过api key调用大语言模型&#x…

华为eNSP:配置单区域OSPF

一、什么是OSPF? OSPF(Open Shortest Path First,开放最短路径优先)是一种链路状态路由协议,属于内部网关协议(IGP),主要用于在单一自治系统(AS)内部动态发现…

P62 线程

这篇文章我们来讲一下线程。截止到目前,我们的代码都是在单线程上运行的,现在看起来没有什么问题,但是目前所有的计算机几乎都不只有一个逻辑线程,所以如果我们一直使用单线程运行,这样的话效率会很低。尤其是如果我们…

Android AudioFlinger(五)—— 揭开AudioMixer面纱

前言: 在 Android 音频系统中,AudioMixer 是音频框架中一个关键的组件,用于处理多路音频流的混音操作。它主要存在于音频回放路径中,是 AudioFlinger 服务的一部分。 上一节我们讲threadloop的时候,提到了一个函数pr…

im即时聊天客服系统SaaS还是私有化部署:成本、安全与定制化的权衡策略

随着即时通讯技术的不断发展,IM即时聊天客服系统已经成为企业与客户沟通、解决问题、提升用户体验的重要工具。在选择IM即时聊天客服系统时,企业面临一个重要决策:选择SaaS(软件即服务)解决方案,还是进行私…

DeepSeek系列模型技术报告的阅读笔记

DeepSeek系列模型技术报告的阅读笔记 之前仔细阅读了DeepSeek系列模型的主要技术方面内容与发展脉络,以下是DeepSeek系列模型技术报告的笔记,有错误的地方欢迎指正! 文章目录 DeepSeek系列模型技术报告的阅读笔记GQADeepseek MoEAbstractIn…

【VUE】第二期——生命周期及工程化

目录 1 生命周期 1.1 介绍 1.2 钩子 2 可视化图表库 3 脚手架Vue CLI 3.1 使用步骤 3.2 项目目录介绍 3.3 main.js入口文件代码介绍 4 组件化开发 4.1 组件 4.2 普通组件注册 4.2.1 局部注册 4.2.2 全局注册 1 生命周期 1.1 介绍 Vue生命周期:就是…

Spring-framework源码编译

版本统一(搭配其他版本会遇到不可知错误): 1)spring 5.2.X(5.5.26) 2)JDK8 3)Gradle:5.6.4 可以在gradle-wrapper.properties中修改 https\://services.gradle.org/distribution…

使用 Deepseek + kimi 快速生成PPT

前言 最近看到好多文章和视频都在说,使用 Deepseek 和 kimi 能快速生成精美的 ppt,毕竟那都是别人说的,只有自己尝试一次才知道结果。 具体操作 第一步:访问 deepseek 我们访问 deepseek ,把我们想要输入的内容告诉…

火绒终端安全管理系统V2.0--纵深防御体系(分层防御)之规则拦截层

火绒终端安全管理系统V2.0--多层次主动防御系统。 率先将单步防御和多步恶意监控相结合,监控百个防御点(包含防火墙),有效阻止各种恶意程序对系统的攻击和篡改,保护终端脆弱点。 ✅ 内容拦截层(Content-B…

如何在WPS中接入DeepSeek并使用OfficeAI助手(超细!成功版本)

目录 第一步:下载并安装OfficeAI助手 第二步:申请API Key 第三步:两种方式导入WPS 第一种:本地大模型Ollama 第二种APIKey接入 第四步:探索OfficeAI的创作功能 工作进展汇报 PPT大纲设计 第五步:我的使用体验(体验建议) …

力扣35.搜索插入位置-二分查找

class Solution:def searchInsert(self, nums: List[int], target: int) -> int:# 初始化左右指针left, right 0, len(nums) - 1# 当左指针小于等于右指针时&#xff0c;继续循环while left < right:# 计算中间位置mid (left right) // 2# 如果中间元素等于目标值&…

云计算专业必考三大证书,助你抢占职业发展先机!【云计算认证学习资料分享(考试大纲、培训教材、实验手册等等)】

随着云计算技术的飞速发展和广泛应用&#xff0c;云计算行业对专业人才的需求也日益旺盛。拥有权威的云计算认证&#xff0c;不仅能够证明你的技术实力&#xff0c;更能为你的职业发展增添砝码&#xff0c;赢得高薪offer&#xff01; 本文将为大家介绍云计算专业最值得考的三大…