服务粉丝

我们一直在努力
当前位置:首页 > 财经 >

Android Framework 一学就"废"

日期: 来源:鸿洋收集编辑:阿豪元代码

本文作者


作者:阿豪元代码

链接:

https://juejin.cn/post/7195770700106776636

本文由作者授权发布。


1
为什么要学 Framework


为什么要学 Framework?最直接最功利的原因就是面试要问,比如:
  • Activity 的启动过程,这个会涉及到 AMS/ATMS 和 WMS 的实现。
  • Binder 如何通过一次拷贝完成 IPC。
  • View 的绘制流程。
  • SurfaceFlinger 的工作原理与流程。
  • ......
对于应用开发来说,大部分类似的题目是没有太大意义的。在2023年,面试的内容已经在 app 层挖掘完了,再想提高面试门槛就只能往深了挖。Framework 的内容足够多,应聘者不可能熟悉所有的源码,只要面试官愿意,肯定能问倒应聘者的。
如果我们能系统科学地学习 Framework,掌握 Framework 中基础的核心的内容,以不变应万变。当问到我们不熟悉的部分,大胆承认,说出该部分内容会涉及到哪些基础内容,如何着手去分析,面试官大概率也会给过的。

Android 的应用非常广泛,不仅是手机,可能汽车,手表,冰箱,微波炉,电视,机顶盒,空调的内部都有一个 Android 系统。广泛的应用促使了对 Framework 人才的大量需求,因为 Framework 学习门槛较高,导致企业招聘相对困难,薪资也比大部分 App 开发岗位高出不少。如果能系统地学习 Framework 并加入这类企业,不论从经济上还是个人职业发展上都是非常不错的选择。


2
什么是 Android Framework


什么是 Android Framework?我们先看一下 Android 的整体结构图:


图片来自官网

https://developer.android.com/guide/platform?hl=zh-cn


从下往上依次是:
  • Linux kernel 层,很大一部分内容是驱动程序。
  • HAL 层,对下封装驱动硬件操作,对上向 App 提供统一稳定的驱动操作接口。
  • Native层,主要是 C/C++ 库以及 Java 虚拟机。
  • Java 层,主要是 Java 库,系统服务等。
  • App 层,一些系统和三方APP。
我们常说的 framework 大多数指的是中间三层的开发,即 Java层、Native层、HAL层。
以 Android 系统启动过程为主线,以进程的视角来学习 Android 系统全貌,更为清晰明了:

图片来自 gityuan

http://gityuan.com/android/


Android 系统启动过程由上图从下往上的一个过程是由 Boot Loader 引导开机,然后依次进入 -> Kernel -> Native -> Framework -> App。
  • kernel 层主要向上提供了驱动,Hal 层加以封装后,向上提供驱动程序功能。
  • Native 层通过 init 进程启动了很多守护进程用于支持系统的运转。
  • Java 层通过 Zygote 孵化了 Java 守护进程,用于支持系统的运行和 App 的运行。


3
Framework 开发做什么


谷歌几乎每年都会发布最新的 AOSP 原生代码,AOSP 原生代码只支持极少数几款手机,比如 Pixel。
芯片厂商根据自己的芯片的特点修改 AOSP ,让其可以在自己芯片上跑起来。
方案厂商根据自己开发的设备特点(主要是外设 如wifi 蓝牙 传感器等),修改芯片厂提供的源码,使得软件能在方案厂商的开发板上跑起来。
大部分做产品的厂商拿到的就是芯片厂商提供的开发板硬件和系统源码,产品厂商主要工作就是:
  • 添加自己的硬件、驱动、HAL和硬件系统服务,硬件的提供商可能会提供相应软件支持。
  • 定制系统 App,比如 Launcher Setting System UI Message Camera 等。
  • 开发厂商自己的系统 App,比如 音视频播放器 应用商店 主题 红外遥控等。
  • 个性化功能开发,比如软件多开,手机分身,语音变声,录屏,双卡双待等等。
  • 集成一些常用三方应用,比如 微信 淘宝 爱奇艺等。
  • 系统稳定性 性能 安全相关优化。
  • 系统裁剪。
方案厂商提供的系统源码并不完美,App 中很多的 Bug 可能是 Framework 层导致的,产品在上市前需要针对系统 App 和热门三方 App 及游戏进行测试,解决掉 Framework 中存在的 bug。Framework 开发的主要工作就是解决这些 bug 并协助系统 App 的开发,同时可能要做一些新特性开发,系统性能和安全相关的工作。
Framework 中无穷无尽的 bug 也不能怪芯片厂商和方案厂商,因为 Android 打娘胎里出来就有数不清的 bug,在 这里 可以查看 aosp 相关的 bug 信息。
https://issuetracker.google.com/issues?q=componentid:192705%2B


4
Framework 学什么


从 Framework 的工作内容和特点来看,我们应该花主要的精力学习基础和核心模块,然后在工作中学习涉及到的具体的模块。
系统源码非常的庞大与复杂,在学习过程中一定要有分层与黑盒的思想!
我总结了 11 个专题,逐个击破 Framework 基础核心内容:

1. 基础知识

编程语言方面我们需要掌握:
  • C/C++
  • Java
  • JNI
其次我们对一些工具类的语言有一定的了解:
  • Python:源码下载工具 repo 使用 python 对 git 操作做了封装,以适应多个 git 仓库的操作。
  • Shell 编程:Android 编译系统包含了大量的 Shell 脚本。
  • go 语言,Android 编译系统中部分脚本使用 go 语言编写。
早期 Android 编译系统使用 make 构建,后来逐步使用 Soong 进行替换,Android 的官方博客指出未来会使用 Bazel 来替换掉目前 make 和 Soong 混合的结构,鉴于 Android 代码量庞大,这些替换都是部分的逐步开展的,所以三者都得有所了解。
对于 Linux 需要掌握三个方面:
  • 熟悉 Linux 的基本使用,主要是常用的命令和常用服务搭建。
  • 熟悉 Linux 系统编程,Native 层使用了很多系统编程接口,熟悉 Linux 系统编程是读懂 Native 层的基础。
  • Linux 系统编程可能或多或少需要我们对 Linux 内核有基本的了解。
另外在 Linux 的学习工程中兼顾一下操作系统基础的学习。

2. AOSP 源码上手

有了基础知识以后,我们就可以上手玩一玩 AOSP 源码了:
这里主要是一些实际操作,编译好 AOSP,并添加一些功能。同时了解一下系统源码的管理,掌握 repo 和 gerrit 的使用。

3. AOSP 编译系统

在上手了 AOSP 源码后,我们需要知道,我们的系统是怎么编译的,怎么烧录到手机上的。

4. Hal与硬件服务

这里需要我们自己动手:
  • 完成一个简单字符驱动程序的编写。
  • 完成 Hal 层编写,首先掌握传统方式,再学习基于 HwBinder 的现代方式。
  • 最后就是在系统中添加硬件服务,写个简单的 App 访问我们的硬件服务。
以上内容使我们从整体上了解了外设软件开发流程。

5. 基础组件

基础组件就是被使用的比较多的组件,主要包含了:
  • Android 智能指针
  • Android 属性系统
  • Android 日志系统
  • SeAndroid
  • Android 权限系统
  • 匿名共享内存

6. Binder

Binder 是 Android 最核心的基础,整个 Android 都是基于 Binder 搭建的,不夸张的讲,不懂 Binder 就不懂 Android。
Binder 涉及了内核驱动层,C 层,C++ 层,Java 层,涉及知识多,流程复杂,很多人学了一遍有一遍,还是没有掌握。
这一次,我们从三个四的角度彻底搞懂 Binder !

7. 系统启动过程分析

主要熟悉整个系统启动的流程:

图片来自这里

https://github.com/jeanboydev/Android-ReadTheFuckingSourceCode/blob/master/article/android/framework/Android-%E7%B3%BB%E7%BB%9F%E5%90%AF%E5%8A%A8%E8%BF%87%E7%A8%8B.md


重点掌握:
  • init 的实现细节。
  • Zygote 的具体实现。
  • SystemServer 的内部实现。

8. 应用层框架

主要搞懂:
  • AMS/ATMS
  • Handler 和 Looper
  • PackageManagerService

9. 显示系统

在掌握了 Android 显示系统整体框架后,再逐步学习一下内容:
  • Hal 层的 Gralloc 和 Hwcomposer
  • Surfaceflinger
  • WMS
  • View 系统

10. Android 输入系统

输入系统主要三个方面来具体学习:
  • 读取事件
  • 分发事件
  • 处理事件

11. 系统应用

对系统应用的开发要有所了解,主要学习一下几个 App:
  • Calculator
  • Setting
  • Launcher
  • SystemUI


5
总结

在掌握了这 11 个专题后,不论是继续研究 Framework 中其他模块,或是参与 App 开发,又或是研究内核与驱动,我相信,你一定早已是是游刃有余了!




最后推荐一下我做的网站,玩Android: wanandroid.com ,包含详尽的知识体系、好用的工具,还有本公众号文章合集,欢迎体验和收藏!


推荐阅读:

Gradle常用的几十个命令!
这些技能非常重要!
汇聚大厂经验,揭开包体优化神秘面纱


点击 关注我的公众号

如果你想要跟大家分享你的文章,欢迎投稿~


┏(^0^)┛明天见!

相关阅读

  • Linux 只是一个内核:这意味着什么?

  • 点击上方蓝字 ● 关注Linux公社 这是困扰 Linux 用户的一个常见问题。这也是考试和面试中经常问的问题。以下是您需要了解的所有信息。您可能已经在互联网上看到和听到
  • 为什么Spring和IDEA都不推荐使用@Autowired注解?

  • 原价799元,现在参加拼团活动立享优惠价仅 199 元,赶快一起参团吧!《Spring 5.x源码深度剖析专家课》=== 课程内容 ===1、为什么要学习本课程?(1)众所周知,Spring技术是我们日常工作
  • Dubbo面试题(总结最全面的面试题)!

  • 原价999元,现在参加拼团活动立享优惠价仅 149 元,赶快一起参团吧!《从0开始带你读Dubbo3.0核心源码》=== 课程介绍 ===本课程基于最新的 Dubbo3.0 讲解,将从零开始,一步步画图带
  • 我们公司使用了6年的分布式锁,很是牛逼啊!

  • 原价299元,现在参加拼团活动立享优惠价仅 99 元,赶快一起参团吧!《分布式锁源码剖析专家课》=== 课程背景 ===分布式锁在后端程序员日常开发中可谓是高并发的代言词,通常用来解
  • 三分钟了解RocketMQ与Kafka的异同~~~

  • 原价999元,现在参加拼团活动立享优惠价仅 199 元,赶快一起参团吧!《RocketMQ内核源码深度剖析专家课》=== 课程介绍 ===本课程基于RocketMQ 4.9.x讲解,将从零开始,一步步画图带你
  • 正式上线!

  • 近日,市公共资源交易中心联合市住建局发布了《关于我市房屋建筑和市政基础设施工程施工招标按照最新范本进行电子化招投标的通知》和《关于开展房屋建筑和市政基础设施工程施
  • 超强的优化工具,口号很狂,就是有点丑

  • 有同学反馈收不到推送,请大家星标果核,第一时间接收推送。对于喜欢捣鼓电脑的人来说,系统的配置与个性化设置是很重要的,把系统里用不上的功能关了,把软件乱存放的文件收拾好,都能

热门文章

  • “复活”半年后 京东拍拍二手杀入公益事业

  • 京东拍拍二手“复活”半年后,杀入公益事业,试图让企业捐的赠品、家庭闲置品变成实实在在的“爱心”。 把“闲置品”变爱心 6月12日,“益心一益·守护梦想每一步”2018年四

最新文章

  • Android Framework 一学就"废"

  • 本文作者作者:阿豪元代码链接:https://juejin.cn/post/7195770700106776636本文由作者授权发布。1为什么要学 Framework为什么要学 Framework?最直接最功利的原因就是面试要问,
  • 分享两种方式:如何开启JNI的“大门”?

  • ‍‍1要介绍本篇博客的原因前段时间学习OpenGL ES相关技术,下载了一个Github项目学习,项目地址在:https://github.com/githubhaohao/NDK_OpenGLES_3_0项目的关键代码都是C++实
  • 祖传代码,业务代码参数透传满天飞?

  • 本文作者作者:唐子玄链接:https://juejin.cn/post/7165427212911378445本文由作者授权发布。1引子项目中参数多级透传满天飞的情况很常见,增加了开发的复杂度、出错的可能、及
  • 封神之作:极致包体优化,解决 17 个业务痛点

  • ‍本文作者:小木箱,原文发布于:小木箱成长营。1引言Hello,我是小木箱,欢迎来到小木箱成长营系列教程,今天将分享包体积优化 · 实战论 · 怎么做包体优化? 做好能晋升吗? 能涨多少
  • 勒索软件系列报告之四丨三重勒索软件BlackCat

  • 世界经济论坛发布的《2022年全球网络安全展望》报告显示,勒索软件攻击在全球网络领导者网络威胁关心问题中排名第一,成为全球广泛关注的网络安全难题。天际友盟双子座实验室推