Android Framework 新手学习踩坑建议指南

framework学习路线和方法 之前分享过我转framework的经历,可以看这里《我是如何从Android开发转framework开发的》,今天根据自己实际工作感受整理出一份framework的学习路线和方法,仅供参考,如有不足,还望指正。学习framework是一件非常枯燥的事情,原因在于相比于app开发的coding,framework更侧重于对源码的reading,但学习它能让我们更深入的了解Android系统,增加自身的知识储备,降低自己在行业中的可替代性,延长自己的职业生涯,提高自身身价。 阅读详情

背景

很多学员刚开始都是从app或者其他技术栈转到安卓framework的学习,因为framework是安卓系统核心框架层面。代码量相当大,而且framework的相关核心工作都是需要去深入这些framework的模块代码进行相关的问题bug修复和需求实现。
在这里插入图片描述
那么新手学习到底容易踩哪些坑呢?具体又应该怎么正确深入学习framework呢?


坑一:试图记忆整个 AOSP 源码流程

错误大坑 --想要盲目分析代码细读每一行

打开一个模块(比如 AMS,ATMS,WMS),上来就自己逐行读代码,试图把每个方法、每个分支、每个变量都记下来,但是代码太多太复杂分支千千万万很容易发现自己分析的代码根本不是啥主线流程。结果就是发现自己学了一个月后啥也没有记住,啥也不会,什么framework知识都没有学到,也不具有一点fw的实战能力,以为fw学习就是学习源码就可以。

正确做法:理解核心脉络,理解性记忆

  • 先搭骨架,再填血肉。比如 AMS 的核心脉络是:进程启动流程、四大组件启动流程、进程调度(adj 算法)、ANR 机制。不在细枝末节上纠缠。
  • 理解"为什么"而不是"是什么"。比如不要记 realStartActivityLocked 的代码,而是理解为什么 Activity 启动需要经过这么多步骤(进程检查、权限检查、生命周期同步、窗口准备……)。
  • 用一张图就够了:每个模块画一张核心概要图,剩下的细节用"索引式记忆"——知道是哪个类、哪个方法处理的,用到时能定位到即可。

理解清楚一些代码区分和进程区分概念:

要分析源码时候,尽量要搞清楚进程的运行,理解一下代码会运行在哪个进程。

framework代码有一些是公共框架代码,这种代码属于app和system_server都是共用的,比如Activity,Service,Configration等,这种framework的代码路径一般不会带有server,而一些属于system_server进程专属的代码比如ActivityManagerService,WindowManagerService等。


坑二:盲目学习源码,应该要以场景为目标进行分析串联

大坑表现

学习源码分析时候没有一个场景目标,盲目分析,随意的找一个类进行分析,比如很多同学可能会以startActivity为开始进行分析,但是分析过程中跳转流程分支太多太多,发现根本没有办法掌握,瞬间感觉自己进入了一个迷宫,或者说分析了很久代码,其实根本不是主线流程代码。导致自己只是在冰山的某个角落,而没有走到正确上山的道路。

源码是手段,分析问题、解决问题、产出需求才是目的。脱离问题场景看源码,就像背字典学英语——记住了单词,但不会说话。

所以源码太多,你不能什么代码都看,而是需要明确自己的需求模块,来有目的去分析看源码

正确做法:以需求场景或者bug为导向学习源码

  • 带着需求主线看源码:比如初学者你完全可以以一个经常使用的场景作为分析的切入点,比如场景桌面点击app图标,是如何显示出第一帧Activity的画面,以这个为脉络流程的主线进行分析源码。

这样你分析桌面点击app图标时候,首先就会去深入触摸input子系统模块,对InputReader,InputDispatcher,再分析事件如何到达Launcher这个app的,这样你就很有成就感的理清楚了input事件的分发流程。

再接下来分析桌面的调用startActivity到AMS,分析AMS,ATMS,WMS,SurfaceFlinger相关复杂流程。

这样你有目的和场景的分析源码后,就会发现自己脑海中串联各个模块的代码时候就会变得很简单,这个就是典型的理解性记忆,是有目的场景的分析代码,这样主线脉络去学习你就很容易记住这些核心场景的源码主要是啥。


坑三:只会被动读代码,不会主动调试

新手大坑

只看不跑、只读不调。一个模块看了一星期,但一次 dumpsys 都没执行过,一次断点调试都没做过。

Framework 的代码运行在真实系统进程中(system_server 等),只看静态代码看到的只是冰山浮出水面的一角,大量的运行时行为(时序、状态机、Binder 交互)是读不出来的。

只看代码不调试追踪最重要的问题:

源码分析往往代码很多,你如果不找到合适的切入方法函数点进行堆栈打印反向调试追踪,基本上正向分析会很难很难,比如WindowState的remove移除方法,其实正面分析这个remove方法调用地方会有很多很多地方,单独源码分析,你根本无法知道具体是哪里调用过来的。
那么这个时候你的正向源码很可能是错误的。

还有正常系统是运行的状态,代码中的很多变量等都是最核心的数据,这些数据在源码分析时候你其实比较难知道是啥,所以这个时候就需要有一些dump工具辅助你直接确认数据。

正确做法:掌握调试三板斧

1. logcat 堆栈,日志打印 + 日志过滤分析

添加堆栈打印

        Log.i("lsm","onCreate",new Exception());

正常logcat第三个参数变成new Exception既可以。

在这里插入图片描述

给日志加过滤,不要盯着满屏日志看:

# 只看 AMS 相关标签
adb logcat -s ActivityManager

# 看系统进程的详细日志并保存到文件
adb logcat -b all -v threadtime > trace.log

也可以考虑马哥课程中的wms讲解的Proto相关日志动态开放来辅助你调试

2. dumpsys——查看运行相关模块的核心数据

正常系统是运行的状态,代码中的很多变量等都是最核心的数据,这些数据在源码分析时候你其实比较难知道是啥,所以这个时候就需要有一些dump工具辅助你直接确认数据。

几乎所有系统服务都实现了 dump() 方法,这是观察系统运行时状态的最快方式:

# 看 Activity 栈状态
adb shell dumpsys activity activities

# 看窗口状态
adb shell dumpsys window windows

# 看电池/唤醒锁
adb shell dumpsys batterystats

# 看所有服务的 dump 入口
adb shell dumpsys -l
3. Android Studio 断点调试 system_process

这是学习新模块最有效的方法:

  • Attach Debugger 到 system_process
  • 在你感兴趣的方法上打断点
  • 触发操作,观察调用栈、变量值、线程状态
  • 单步跟踪不用全流程走完,走 5-10 步就能理解关键逻辑
4. trace 分析(进阶)

也可以采用Perfetto方式进行源码流程追踪,系统在核心方法部分都会埋点Trace打印,自己可以可以对代码进行加入,这样展示出相关slice方便查看和调试。

cat config.txtpb | adb shell perfetto -c - --txt -o /data/misc/perfetto-traces/trace.pftrace
# 抓 systrace/perfetto 看时序
# 用 perfetto UI 或 systrace.py 打开

学一个模块的正确姿势是:看 20 分钟代码 → dump 看看现状 → 断点跑一遍关键路径 → 总结出一张图。 而不是看三天代码不动手。


坑四:缺少framework实战项目能力

表现

花大量时间阅读源码、画流程图,感觉很充实;但遇到实际问题时一头雾水,不知道从哪下手。

能把四大组件的启动流程画得非常漂亮,流程图、时序图、UML 应有尽有。但分配一个真实需求(比如"实现一个 API 让三方应用可以限制某个 Activity 的最大启动次数"),立刻卡住,不知道从哪改起。

画图是"信息的整理",写代码是"系统的干预"。你能看懂一个系统,和你能修改一个系统,是两种完全不同的能力。

正确做法:用真实的 Framework 定制需求来驱动

以下是结合实际工作/学习场景的实战路径,覆盖 Framework 最核心的几块定制改造:

1 Input 系统实战,input需求及疑难ANR的分析

2 AMS 闪屏/黑屏/部分黑/闪白问题实战,疑难显示问题

3 WMS 窗口管理实战,查看定制等

4 车载多屏互动实战

5 分屏 / 自由窗口定制实战

这些实战都在马哥framework实战课程和学员作业中有进行详细的讲解。

总结

framework的学习终极目标不是源码分析,而是进行安卓系统的需求定制和疑难问题的实战解决,但是源码分析属于需求和bug解决实现的最重要的理论基础。

所以源码分析也是一样很重要,源码分析提供了理论基础后,更重要是利用这个理论基础再结合各种调试和分析工具等来帮助我们解决实际需求和问题。


原文地址:

https://mp.weixin.qq.com/s/U68r33rGmUAZq08g2Lf2tA

更多framework实战开发入门学习干货资料,请关注下面“千里马学框架”

如何学习 Android Framework ?如何从应用深入到 Framework? 大部分有 “如何学习Framework源码” 这个疑问的,应该大都是应用层开发。 应用层是被 Framework 层调用执行的,知道自己的代码是怎么被调用的,才能理解程序的本质,理解本质有助于解决遇到的新问题,同时才有更多方法去优化应用层逻辑。 目前大公司的App开发都要基于模块化、层次化、组件化、控件化的思路来设计架构,而这一切的基础都建立在 Android Framework 系统框架底层原理实现之上,所以与它相关的知识都尤为重要。 那我们如何学习 Framework 呢? 关于如何学习 Androi 阅读详情

相关推荐

Android Framework 学习路线指南

Android Framework 学习路线指南

yuandaimaahao的博客 862

《Android Framework源码开发揭秘》,老手经验,新手指南,一起吃定Framework

在2024年,计算机行业并未如人们所想的那样充满希望,经济下滑和公司大规模裁员的现象屡见不鲜,对于从事计算机行业的人来说,特别是Android开发领域,情况更是不容乐观。那些经验丰富的老程序员面临就业困境,而刚毕业或初入行业的新人则因缺乏经验、技术水平不足等原因难以找到工作。整个Android开发领域仿佛陷入了沉寂。然而,在这个行业中,有一个细分岗位却一直处于高薪少人的状态,那就是Android Framework开发。

bugyinyin的博客 854

关于Android Framework学习的一些思考

为什么要学Android Framewok?面试考察相关内容的可能性高;学习Android Framewok本身就是有价值的,那应该怎么学呢?进来就知道了。

m0_55100461的博客 703

【安卓Framework学习】Wifi框架学习之核心类

前段时间做了一个wifi相关的需求,但是看了安卓wifi的标准api之后发现不够用,仍然会出现许多问题,比如wifi连接会有不稳定的时候,有时候能连接上有时候无法连接,但是却不知道是什么原因。为此萌发了去翻看wifi框架的源码进行学习。本文主要是针对wifi框架中的一些核心类,根据自己看源码的注释进行理解学习,可能理解得不那么精确,但掌握大致的意思。文中所有涉及到的源码均来源于Android11.........................

qq_39036223的博客 1万+

Android Framework学习——安卓系统启动流程(Android 13)

提示:本文仅作个人学习记录,禁止转载无论是安卓应用开发,还是安卓framework开发,在面试中总是会被问到framework相关的知识,系统启动流程已然成为高频提问点之一,以前对系统启动流程的认识停留在其他人口口相传、博客上的简要总结及流程图,接下来我将根据源码主要流程进行梳理,总结安卓系统启动这一过程的主要步骤。因为关注的重点是Java API Framework层的流程(如下图绿色部分),所以在这之前的流程会简略概括。在关机状态长按电源键,引导芯片程序(固化在rom中)开始运行;

qq_31190665的博客 2407

Android Framework学习六:Binder原理

Binder是Android系统中的一种进程间通信(IPC)机制,涵盖机制、应用和驱动三个层面。在机制层面,Binder提供标准化的通信方式,支持不同进程间的数据交换和方法调用。在应用层面,开发者可通过继承Binder类实现自定义的跨进程通信逻辑。在驱动层面,Binder作为虚拟物理设备驱动,负责管理内存映射、线程管理等底层操作。Binder通信过程中,数据通过Binder驱动在内核态和用户态之间传递,客户端通过copy_from_user将数据拷贝到内核空间,服务端通过mmap直接访问内核空间。每个APP

zmlovelx(帅得不敢出门 程序员群31843264) 1647

Android Framework - 学习启动篇

首先明确一下前提条件: 有 C/C++ 基础,能够阅读 C/C++ 的代码; 有 Linux 系统内核基础; 有 Android 开发相关的工作经验(1-3年); 有 UML 建模基础。 如果大家是从事 Android 系统开发的,那么阅读系统源码是必修课程。如果想成为高级 App 开发工程师,那么阅读系统源码也是必修课程,只是这必修课程里面有选修内容,后面我想讲的就是必修课程里面的选修内容。...

z240336124的专栏 1万+

android framework开发的技能要求

作为Android Framework开发工程师,需要具备深入的系统底层理解能力和对Android架构的全面认知。

WPP BLOG 1265

Android大厂面试必问的Android Framework 如何学习,如何深入了解Framework层?

前言 对于大多数 Android 开发工程师来说,掌握Android Framework 一定是一个不光要熟练而且还要精通的技能。 高级 Android 工程师岗位的一些技术面试也离不开Framework。一般会针对下面几个面试题进行提问: 1.Android中多进程通信的方式有哪些? 2.进程通信你用过哪些?原理是什么?(字节跳动、小米) 3.描述下Binder机制原理?(东方头条) 4.Binder线程池的工作过程是什么样?(东方头条) 5.Handler怎么进行线程通信,原理是什么?(东方头条) 6

datian1234的博客 2447

2025最新OSM中国矢量数据保姆级下载指南(附百度网盘链接)

本文提供2025年OSM中国矢量数据的保姆级下载与使用指南。详细介绍了通过Geofabrik镜像站、QGIS插件及第三方平台获取数据的多种途径,重点解析了Shapefile格式数据的结构、WGS84坐标系特性,并指导进行格式转换与基础GIS应用,帮助用户高效合规地获取并利用这份开放地理数据资源。

weixin_29228781的博客 884

反激电源反馈环路设计:从TL431+PC817原理到动态补偿实战

本文深入解析了反激电源中由TL431和PC817构成的经典反馈环路设计。从静态工作点计算到动态补偿实战,详细阐述了如何通过Type II补偿网络优化环路稳定性与动态响应,并分享了应对光耦CTR离散性、布局噪声等常见调试难题的实用技巧,帮助工程师设计出高性能、高可靠的开关电源。

moon9的博客 703

如何学习 Android Framework

学习 Android Framework 具有一定的挑战性,但通过合理规划和有效的学习方法,能够逐步掌握。

weixin_42283818的博客 477

ArcGis布局视图中Excel表格无边框插入与图例符号边框定制技巧

本文详细解析了在ArcGis布局视图中实现Excel表格无边框插入与图例符号边框定制的专业技巧。通过源头净化Excel表格、精准粘贴以及分解图例并单独设置边框属性,有效解决了地图报告中常见的视觉粗糙问题,帮助用户提升专题图与报告的精致度与专业感。

weixin_29292535的博客 305

初学安卓framework系列 一 (怎么科学的学习安卓系统的framework)

相信大家在找工作的时候,肯定或多或少都被面试官问到过安卓的八股文。比如ActivityManagerService(简称AMS),或者WindowManagerService(WMS)怎么实现的啊,有些什么细节需要注意啊,View被加入到ViewRoot的流程啊等等。每每看到这些文章,教人怎么准备安卓framework面试,我都觉得很痛心。。。因为在我看来,对于应用开发来说,面试考这些纯粹就是扯淡,很有可能面试官自己也只是在网上看看文章,然后照本宣科的再去问面试者。这种现象其实说白了就是卷。...

chuyouyinghe的专栏 1332

混合部署 操作系统混合部署

在openEuler Embedded 22.03中,已经集成了OpenAMP相关支持,并与openEuler的SIG Zephyr合作实现了openEuler Embedded与实时操作系统Zephyr在QEMU平台上的混合部署。具体的混合部署方式取决于设备的硬件和软件支持。例如,可以使用虚拟机软件(如VirtualBox)在Linux操作系统上运行Android虚拟机,从而实现Linux和Android的混合部署。需要注意的是,混合部署涉及到设备的硬件和软件兼容性,以及操作系统的配置和管理。

dianqicyuyan的博客 1767

【深度学习驱动流体力学】Python流体力学Ansys Fluent

PyFluent 是一个将 Python 编程语言与 Ansys Fluent 流体动力学 (CFD) 仿真软件集成的工具。它允许用户通过 Python 脚本来控制和自动化 Fluent 中的仿真任务,实现从预处理、求解到后处理的全流程控制。PyFluent 结合了 Python 的灵活性和 Fluent 的强大功能,提供了一种高效且灵活的 CFD 仿真方法。PyFluent 是一个强大而灵活的工具,使用户能够通过 Python 脚本全面利用 Ansys Fluent 的功能。

源代码杀手的博客 3125

Android Framework学习日志——01

学习 Android Framework 从应用层深入到底层确实是一个循序渐进的过程,尤其是当面对复杂的源码和跨模块调用时,容易感到困惑。我对我的学习进行日志记录。供大家学习参考。

qq_52272419的博客 1660

GEE 案例分析:利用Landsat数据进行FAI、NDVI及CHLA分析并统计平均值(巢湖为例)

浮游藻类指数(FAI)、归一化植被指数(NDVI)及叶绿素a(CHLA)是水体环境监测的重要指标。本文利用Google Earth Engine(GEE)平台,基于Landsat 5和Landsat 8数据,进行水体藻类及植被监测。

此星光明博客 1336

Android Framework 探秘

安卓的Framework(框架层)是安卓系统的核心组成部分,位于应用层和系统底层(如Linux内核)之间,负责为应用提供统一的接口和功能支持。1. 定义与作用API库集合:Framework层是用Java语言实现的一系列API库,封装了安卓系统的核心功能(如Activity管理、窗口管理、包管理等),供应用开发者直接调用。桥梁作用:通过,Framework层可以调用底层的C/C++库(如媒体库、图形库)和Linux内核功能(如进程管理、内存管理),实现对硬件和系统的控制。核心目标。

zhengzhiyu__的博客 2269

SAP Build Work Zone standard edition 订阅报错 OIDC trust missing 的成因与完整解决路径

摘要:用户订阅SAP Build Work Zone时遇到422错误,提示未配置OpenID Connect信任。该错误表明业务用户需通过SAP Cloud Identity Services的OIDC协议认证,而当前子账户仅配置了SAML信任或未配置信任。解决方法是进入子账户的Trust Configuration页面,使用Establish Trust功能建立与SAP Cloud Identity Services的OIDC信任关系。这是SAP新版服务的强制要求,SAML协议已不被支持。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 197

QML实现ListView的拖动排序

现有一种需求,就是用鼠标拖动某项,动态去改变某一项在ListView中显示的顺序位置,经过研究及实践实战,实现方式的核心代码如下: import QtQuick 2.4 import QtQuick.Controls 1.3 import QtQuick.Window 2.2 import QtQuick.Dialogs 1.2 Rectangle { width: 800 ...

草上爬的博客 7564

【安卓Framework学习】Wifi框架学习之wifi状态机

上一篇重点介绍了wifi的开关流程【安卓Framework学习】Wifi框架学习之开启与关闭流程,由于中间涉及到较多的状态机,本篇想对wifi框架中的各类状态机详细介绍一下。本篇中涉及到的安卓源码均来源于安卓11.状态模式是设计模式中的行为模式的一种,对于其解释网络上解释的相当全面了。通俗一点来说,就是某个对象,包含一些动作或方法,但是这些动作和方法根据对象目前所处状态不同会有不同的运行..................

qq_39036223的博客 3828

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Android Framework开发应该如何入门?写给程序员Android Framework 开发,这一篇就够了

前言 在 Android 开发者技能中,如果想进大厂,一般拥有较好的学历可能有优势一些。但是如果你靠硬实力也是有机会的,例如死磕Framework。Framework 知识广泛应用在Android各个领域中,重要性显而易见。 成为一名Android Framework高手,也是目前招聘过程中非常稀缺的人才,可以成为你的敲门砖。 Framework就像一棵常青的技能树,不管是普通开发还是首席架构、CTO 都能够从中汲取足够的技术养料。普通开发往往对Framework只停留在“使用过”甚至是“听说过”的阶段,这

xiaokangss的博客 1万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

如何深入学习 Android Framework

什么是 Android Framework?我们先看一下 Android 的整体结构图图片来自官网Linux kernel 层,很大一部分内容是驱动程序HAL 层,对下封装驱动硬件操作,对上向 App 提供统一稳定的驱动操作接口Native层,主要是 C/C++ 库以及 Java 虚拟机Java 层,主要是 Java 库,系统服务等App 层,一些系统和三方APP我们常说的 framework 大多数指的是中间三层的开发,即 Java层、Native层、HAL层。

chuyouyinghe的专栏 344

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Android Framework学习路线

【代码】Android Framework学习路线。

w2064004678的博客 1352
上一篇: 小鹏车机竞品调研:车机分屏功能的竞品调研和实现方案
下一篇: google官方Perfetto 中使用 AI相关skill
千里马学框架
博客等级 码龄6年 1万+粉丝 650原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千里马学框架

帮助你了,就请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值