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

article/2025/9/6 23:05:09

相信大家在找工作的时候,肯定或多或少都被面试官问到过安卓的八股文。比如ActivityManagerService(简称AMS),或者WindowManagerService(WMS) 怎么实现的啊,有些什么细节需要注意啊,View被加入到ViewRoot的流程啊等等。每每看到这些文章,教人怎么准备安卓framework面试,我都觉得很痛心。。。

因为在我看来,对于应用开发来说,面试考这些纯粹就是扯淡,很有可能面试官自己也只是在网上看看文章,然后照本宣科的再去问面试者。这种现象其实说白了就是卷。因为面试的内容已经在app层挖掘完了,再想提高面试门槛就只能往深了挖。 

安卓的系统framework的代码就成了最好的替罪羔羊,因为framework的内容足够多。多到什么程度呢,你下载一套新的AOSP代码可能都要一个小时,全量编译就更不用说了,我自己每次开新的Repo都非常开心,因为我可以心安理得的边看视频边等代码下载了。所以在代码量如此庞大的情况下,面试官想出什么问题都可以,只要你面试者有时间,我总可以问倒你。

但是这些代码都是好代码么?或者说安卓framework里面的所有代码都值得面试者学习么?

答案是NO。这也是一个非常明显的答案。

安卓的framework经过快十二年的迭代,很多地方其实是又臭又长。比如臭名昭著的View class:

android.googlesource.com/platform/fr…

已经演变成一个一万五千行的类了。。。。。


 

很多地方不是不想优化,而是没人敢动,搞出问题了咋办,你负责?

一不小心扯远了。。。回到面试的问题。

那么对于有些面试官考到的八股文。那些考点,或者考点指向的代码同样也不是圣经。他们很有可能只是谷歌的安卓团队在当初定义的一些规则而已,在谷歌里面做安卓framework,或者说有权限能改安卓framework代码的人数不胜数,难道每个人都是天才,可以一点错误都不犯?显然不可能。

那难道看framework源码就一文不值了?那也肯定不是,前提是我们在看源代码的时候能够做到取其精华去其糟粕。

有的读者肯定会说我站着说话不腰疼,话都可以说的好听,具体怎么操作,我怎么知道什么是精华什么是糟粕?

在说具体怎么操作之前,我想先举个反例

源码分析?

很多初学者一上来就雄心壮志,觉得要全面学习安卓系统,起头就开始读源码,或者看源码分析:

这样做的后果往往就是在起跑线就被劝退了。 原因很简单,当你连framework某个类具体是干什么都不知道的情况下,就去读源代码,你是不会有动力的。这和很多学生刚刚毕业,代码还没写多少行就想开始看开源项目,学习源代码一样,基本上可以说没有意义。

很多尝试阅读安卓源代码的朋友,甚至连刷写设备都没试过,这怎么可能可以学到framework的精华呢。说白了,想不动手操作就学习源码,也是一种偷懒的行为,以为自己学习很努力,其实都在做无用功。

刷机!

学习源码的第一步,其实是刷设备。跟着官方教程,从第一步下载AOSP源代码开始:

1 . source.android.com/setup/devel…

再到用AOSP源代码build操作系统

  1. source.android.com/setup/build

最后把build好的系统image刷到手机上:

3.source.android.com/setup/build…

学代码?先修bug

最后,就是动手操作了。

落实到具体的操作就是,修bug!!!

没错,学习任何庞大的框架,一个人都没办法从面到点的学习,都是从点到面,从下到上。因为你不可能一开始就对全局都有认识。

所以修bug就成了一个最好的切入点。 安卓的AOSP有数不尽的bug,每天都会有一大堆进入到bug tracker里面。Framework的bug tracker:

issuetracker.google.com/issues?q=co…

大到系统fatal error,小到注释没加,都在里面。大家不要觉得参与进去很难,我随手一看,就找到一个简直不能再弱智的bug:

issuetracker.google.com/issues/1965…

同样的,这个解决它的code review,就一行改动:

android-review.googlesource.com/c/platform/…

是不是顿时觉得自己也能参与到安卓的开源行动里面了?

只要有毅力,哪怕是自己解决不了,你都可以跟踪一个你感兴趣的bug,看看别人是怎么解决的,看看别人是怎么复现这个bug的,对自己也是有很大帮助的。至少,这样的方式会比自己苦读源码要强。源码分析不是不可以看,而是要用对的方式去看,比如把源码分析的博文当成一个字典,有遇到相关的bug的时候翻一番。

接下来的篇章

在今后的更新里,我会把自己解决过,而且觉得有学习价值的bug写下来,或者以小作业的形式要求大家对某些代码进行改动让大家可以在写代码,编译,刷机,验证在这个动手的过程中学习。在WearOS团队工作大半年的感触,就是对framework有了更多的了解,同时也向很多安卓framework早期的开发者学习了不少。

(比如谷歌很多在公司待了10年以上的老鸟,其中有一位大神叫dianne hackborn ,这位程序员可以说是安卓系统的殿堂级人物,谷歌里面都有段子说,在安卓组里面的一个成就是在内部技术论坛发问题是否有得到过Dianne的回复,本人发过的两个安卓问题都得到了Dianne大神的临幸 0.0)

最后的最后!我也不是说让大家以后面试都不准备了,而是提供另外一个平时可以学习的思路,两手抓难道不是更稳 :)


作者:qing的世界
链接:https://juejin.cn/post/7006181823155798023
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


http://chatgpt.dhexx.cn/article/u5k0TFYI.shtml

相关文章

关于自己学习安卓的体会

笔者学习了一段时间的安卓,有几个特别深的感触。 第一点。安卓开发虽然用的是JAVA语言(虽然有Kotlin但是笔者还没接触到),但是在大部分的开发过程中,基本都是重写各种类,自己写的东西比较少(这只…

【0】开始学习安卓了

说好的学习安卓,于是我就要开始学习安卓了,敢问安卓学习哪家强?? 一、准备好开发工具 (1)安卓SDK,建议用迅雷下载 (2)JDK,win764位的请到官网下载64位的 下载…

Android 学习(一)

安卓基本学习 架构体系 安卓的系统体系架构采用的是分层的架构 Kemel层: Android平台的基础。有线程管理和内存管理等功能。 HAL层: HAL的目的是为了把framework与Kernel隔开,让Android不至于过度依赖kernel,对kernel的简单封装…

安卓的学习

文章目录 第一节课:动/静态图片第二节课:一:按键监听事件二:界面中的文本框控件的文本内容自动与文本标签内容保持一致 第三节课一:点击增加的进度条二、获取按钮的信息二 可点击的列表 第一节课:动/静态图…

安卓基础学习

文章目录 前言工具创建项目简单控件即UI一、界面显示与逻辑处理二、文本三、布局 四、按钮五、控件综合训练(简易计算器)六、Activity七. 中级控件八、综合案列(登录与找回密码)数据存储一、SharedPreferences二、SQLite 九、外部存储空间十、Jetpack Room十一、正文字数太多&a…

【ANDROID学习】

Eclipse开发Android程序DEBUG 一 .虚拟机启动失败 报错信息: emulator: ERROR: x86_64 emulation currently requires hardware acceleration! Please ensure Intel HAXM is properly installed and usable. CPU acceleration status: Please disable Hyper-V befo…

Android基础学习整理知识点

注:本文内容有自己理解部分,若有不对的地方,欢迎指出。 Android四大组件 Activity 什么是Activity? 是应用程序的组件,用于显示用户界面,可以与用户交互完成相关的操作。App中可以有很多个Activity。 Activity存储…

Android基础知识点学习总结

Android基础知识点学习总结 安卓基础知识个人学习笔记分享~ 一、Android系统架构 Linux内核层→系统运行层→应用框架层→应用层 1、Linux内核层:Android系统是基于Linux内核的,这一层为硬件提供了底层的驱动,例如显示驱动,音…

锚点的作用及用法

锚点的作用及用法 HTML中的a标签大家都非常熟悉,它是超链接标签,通过a标签能够跳转到href中指定的页面及指定的位置,a标签可以做到单页面跳转或多页面跳转,锚点能够跳转到当前页面中指定的位置,也能够跳转到指定的…

vue锚点的用法

一、锚点效果 二、示例 跳转到当前页面中指定的位置 <a href"#demo1">跳转到一的位置</a> <a href"#demo2">>跳转到二的位置</a> <a href"#demo3">>跳转到三的位置</a><div id"demo1"…

用html语句超链接锚点使用,HTML 锚点超链接

先介绍下场景: 我做了一个博客管理 首页界面如下: 标题是超链接,点击标题,进入博客详情页面: 博客标题下面有一个"返回"超链接,点击回到博客列表,超链接代码: 返回 说明:com.whuang.hsj.hrefClickCount的初始值为-1 , 后来我发现有的博客很长,从博客底部回到标题那儿…

UGUI锚点适配

UGUI锚点设置 UGUI锚点锚点图锚点类型锚点类型一&#xff1a;相对于父节点的某一点的位置锚点类型二&#xff1a;与父节点的两边保持固定距离与父节点的左右两边保持固定距离与父节点的上下两边保持固定距离 锚点类型三&#xff1a;与父节点的4边保持固定距离 Anchors锚点数值P…

目标检测:锚点介绍及应用

目标检测&#xff1a;锚点介绍及应用 介绍应用生成锚点图步骤 锚点匹配步骤 介绍 锚点相当于在待预测的特征数据上预设出可能的物体边界框&#xff0c;即预设出特征数据可能代表的物体区域&#xff0c;每个区域通常由两个属性构成——尺度&#xff08;scale或size&#xff09;和…

锚点用法

一、常见用法 1、给指定标签添加id和name&#xff1a; id或name都可以实现锚点&#xff0c;id是name的升级版&#xff0c;更有效&#xff0c;可以只用id。 2、给a标签的href绑定想要跳转到的位置的id。 二、js锚点定位 document.getElementById("divId").scrollInt…

html 锚点 中文,html怎么设置锚点

html设置锚点的方法&#xff1a;1、设置一个锚点链接“...”&#xff1b;2、在页面中需要的位置设置锚点&#xff1b;3、在href中的路径后面追加“#锚点名”即可。 本文操作环境&#xff1a;Windows7系统、HTML5版&#xff0c;DELL G3电脑 html中的锚点页面内跳转的锚点设置 页…

实现锚点跳转

实现锚点跳转要使用&#xff1a;a标签的href属性 其它某一个标签的id属性 设置某个标签的id属性a标签的href属性设置为&#xff1a;# 想要跳转位置的标签的id属性 <a href"#abc">点击跳转</a> ...... <div id"abc">将要跳转到这里&l…

使用 Vue3 实现锚点组件

目录 1. 需求介绍 2. 实现过程 2.1 表单结构介绍 2.2 确定锚点组件接收的参数及使用方法 2.2.1 form-dom&#xff1a;需要被锚点组件控制的表单实例 2.2.2 active-anchor&#xff1a;默认激活的锚点 2.2.3 title-class&#xff1a;表单标题特有的类名 2.2.4 将 锚点组件…

快速了解什么是锚点

一、什么锚点 锚点是网页制作中超级链接的一种&#xff0c;又叫命名锚记&#xff0c;像一个迅速定位器一样&#xff0c;是一种页面内的超级链接。 二、身边的锚点案例 1、我们可以在百度百科中搜索【薛之谦】 薛之谦&#xff08;中国内地男歌手、音乐制作人、演员&#xff09…

KNN的数据插补方法总结

sklearn中的KNN在缺失值填补中的用法 参考链接&#xff1a;K近邻填补缺失值 如果缺失值是离散的&#xff0c;使用K近邻分类器&#xff0c;投票选出K个邻居中最多的类别进行填补&#xff1b;如果为连续变量&#xff0c;则用K近邻回归器&#xff0c;拿K个邻居中该变量的平均值填…

KNN算法优缺点总结,以及机器学习流程的总结

KNN算法作为一个最简单&#xff0c;也是一个很实用的机器学习的算法&#xff0c;日常的使用中也能处理很多问题&#xff0c;这里做一下总结记录 优点 1、KNN可以处理分类问题&#xff0c;同时天然可以处理多分类问题&#xff0c;比如鸢尾花的分类 2、简单&#xff0c;易懂&a…