【Android 源码分析】Activity短暂的一生 -- 目录篇 (持续更新)
1. 前言
忽然有一天,我想要做一件事:去代码中去验证那些曾经被“灌输”的理论。
– 服装学院的IT男
从事多年App开发现转Framework,由于对WMS感兴趣,所以决定以"桌面点击应用图标,到应用的Activity显示到屏幕上"这一简单操作为基础,分析整个过程。
整个流程看起来似乎并不复杂,整个操作过程在手机上大概2秒就完成了,但是从零开始研究完整个流程,可能需要1年以上的时间。因为实际上涉及到了很多模块比如AMS,WMS,View系统,甚至还有SurfaceFlinger。
本着要把“Activity短暂的一生” 吃透的原则,决定投入自己一年的闲暇时间来把这2秒钟发生的事情搞个明白。
有些同学是应用开发或者是framework其他模块的开发,没有时间和精力来跟这些流程,所以我将研究的过程以博客笔记的形式分享出来,感兴趣的同学可以一起进步。
最近在看机会,上海有机会的欢迎私信
V :WJB6559
2. 文章归纳
整个操作的流程就是这样,目前判断整个流程涉及到以下几个模块(持续更新)。
-
- 主流程:应用冷启动的主要流程,比如Activity启动流程,窗口的添加显示
-
- 其他流程:基于整个主流程,还有很多核心的细节流程,比如窗口动画,生命周期等,这一块的数量会持续增加
-
- 知识拓展:比如在整个主流程,肯定会涉及到应用的绘制,还有SurfaceFlinger相关的处理
-
- 灵活一问:无论是面试,还是开发中,总会遇到一些问题,这部分将结合上面的流程针对问题做更详细的解释
2.1 主线任务(主流程)
google 为了方便窗口管理,新增窗口层级的概念,所以第一步需要了解这个是什么东西。
窗口层级相关:
WindowContainer窗口层级-1-初识窗口层级树
WindowContainer窗口层级-2-构建流程
WindowContainer窗口层级-3-实例分析
WindowContainer窗口层级-4-Layer树
既然整个主流程是以桌面点击图标启动应用分析的,所以Activity启动流程是基础,后续的分析都是基于这个启动流程的。
Activity启动流程:
Activity启动流程-1
Activity启动流程-2
Activity启动流程-3
Activity启动后并不代表屏幕上就有UI了,真正的图像显示需要在SystemService端添加窗口并绘制显示。
窗口显示三部曲:
首先需要创建窗口并将其挂载到将窗口树上
窗口显示-流程概览与应用端流程分析
窗口显示-第一步:addWindow
所以第二步计算出窗口的尺寸信息,传递给应用端,另外绘制View需要一个Surface,也是在这一步进行创建的
窗口显示-第二步:relayoutWindow -1
窗口显示-第二步:relayoutWindow -2
第二步执行完后,应用就开始绘制了,应用绘制完毕,需要把绘制内容显示到屏幕上,就需要触发finishDrawing流程
窗口显示-第三步:finishDrawingWindow
执行完上面的这些流程后,屏幕上就有内容了,主流程就算完毕了。
窗口移除:
removeWindow
2.2 支线任务(其他核心流程)
基于整个主流程,还有很多核心的细节流程,比如窗口动画,生命周期等,这一块的数量会持续增加
Activity生命周期:
工作中分析问题,还是应用开发,都需要了解 Activity 的生命周期
-
Activity生命周期之onPause
-
onCreate,onStart,onResume-1
-
onCreate,onStart,onResume-2
-
Activity生命周期之onStop-1
-
Activity生命周期之onStop-2
-
Activity生命周期之onDestory
屏幕旋转:
-
[屏幕旋转-1]
-
[屏幕旋转-2]
-
[屏幕旋转-3]
窗口相关:
-
[桌面启动应用的视觉总结]
-
[应用启动动画-app_transition-1]
-
[应用启动动画-app_transition-2]
-
[应用启动动画-app_transition-3]
-
[应用启动动画-app_transition-4]
-
[StartWindow-SplashScreen-1-添加](
-
[StartWindow-SplashScreen-2-移除]
-
[应用窗口显示动画-starting_reveal]
ShellTransitions相关:
-
[ShellTransitions总体流程介绍]6
-
[ShellTransitions-1-同步组初始化]
-
[ShellTransitions-2-requestStartTransition处理]
-
[ShellTransitions-3-动画前准备]
-
[ShellTransitions-4-播放动画与结束处理]
2.3 知识拓展
2.3.1 SurfaceFlinger系统
毕竟显示端的控制还是在SurfaceFlinger中,虽然主要目的还是了解WMS,但是难免会接触到SurfaceFlinger,所以拓展部分主要就是SurfaceFlinger相关的知识。
- 屏幕显示基本原理
- Surface系统
应用端想要与 SurfaceFlinger 通信肯定是一个跨进程操作,源码的设计是通过 SurfaceSession
[Surface系统-1-应用与SurfaceFlinger建立链接]
应用端在 relayoutWindow 流程会创建 SurfaceControl 和 Surface,先介绍 java 层的创建逻辑
[Surface系统-2-SurfaceControl的创建(java层)
native 创建 SurfaceControl 和 Layer
[Surface系统-3-SurfaceControl的创建(native层)]
BLASTBufferQueue 的生产者消费者模型介绍
[Surface系统-4-BLASTBufferQueue和Surface的创建]
简单介绍 BLASTBufferQueue 的生产者消费者模型的工作流程,主要是对4个 buff 的处理方法分析
[Surface系统-5-BLASTBufferQueue工作流程概览]
- VSync 相关
- SurfaceFlinger的合成
2.3.2 View系统
- 测量
- 布局
- 绘制(软绘,硬绘)
- 事件分发
2.4 通用方法(模块)设计
记录一些高频率出现的方法或者模块设计,google 设计了一些方法在各个场景都会被调用,如果放在主流程分析则会增加阅读理解难度。所以提取出来抛开某个业务来分析会更加容易理解。
[BLASTSyncEngine设计剖析]
2.5 灵活一问
无论是面试,还是开发中,总会遇到一些问题,这部分将结合上面的流程针对问题做更详细的解释,这部分的问题,可能来自于高频率的面试题,也有我自己脑子里忽然冒出来的疑问,当然如果读者有感兴趣的问题也可以留言。
3. 学习过程中的心得与踩坑
-
- Google团队一直在更新代码,有的模块甚至会被重构,所以看代码的时候不要想着记住每一行源码。
-
- 代码只是一些设计和思想的实现,对于分析源码,最重要的是理解设计思想,最好是能根据代码逻辑画出对应的流程图或者框架图。
tips:我以前在公司写App的时候,写代码之前是需要写《软件设计文档》的,文档评审过了才能根据文档进行代码的编写。现在是反过来看google的代码,那就是要做 “代码–>设计文档” 。 分析出整个google对于流程的设计文档倒是也不至于,但是设计思想,和模块框图,逻辑流程图还是需要尽量分析出来。这样也能加深印象,毕竟代码是枯燥的。
-
- 有条件的最好是下载AOSP编译,这样可以debug执行逻辑,另外还可以通过加log, 加堆栈的方式看执行逻辑,能极大的提高分析效率。
-
- 条件不允许的可以通过AS看到常见类的源码(能debug部分逻辑),或者去 google 源码的网站 https://cs.android.com/ 看(需梯子)。
-
- 看博客看书或者看视频学到的东西只是简单的了解,当然也是学习的第一步,第二步是需要总结记录相关的知识点,第三步如果能以自己的方式来把知识点讲出来,并且别人也能听得懂才是真正的掌握了这个知识点。
-
- 对于一个陌生的领域,学习是枯燥的,所以最重要的是对这块有兴趣,另外就是耐心。不要心急,踏踏实实学好一个知识再去学下一个,知识是互通的,前期会很慢,当自己的知识网构建好了,后面的学习的进度就会很快。
-
- 学习的时候放下其他的东西,特别是不要一边看书(视频)一边刷抖音,或者时不时打开下微信,然后还自己骗自己在学习,以为一个章节(视频)看完了就是学会了。个人的经历就是喜欢开着30分钟视频学习,然后动不动就分心打开下微信,然后心里着赶紧看完就是学完了,以为自己在30分钟做了几件事,是赚到了,是合理利用时间,其实最后会发现自己浪费了这30分钟,然后还要再花30分钟来重新看视频,本来半个小时学完就可以去玩游戏了,实际上花了1个多小时。
-
- 笔记很重要,但是也不能以为笔记记好了就等于会了。我记笔记是在学校读书养成的习惯,我刚入行的时候看《Android开发艺术探索》这本书的,因为对内容不理解但是又想记笔记,结果就是看完一遍其实没学会多少东西,但是记了很多漂亮的笔记,笔记的内容也基本上和书上的内容一模一样。这样最后我的学习变成了 :把书上的东西打字到我的笔记上,然后我告诉我自己,我学会了。但是实际上呢? 我啥也不会。
-
- 多问自己一些问题,过程中如果发现某个点自己不明白的,需要花时间去搞懂,不能“放过它”,相信我在研究的过程中会有意外的收获,而且能加深自己的理解。(当然一些不重要,或者难度极大的就没必要抓着不放了)
-
- 要有自信, 工作这么多年发现其实大部分人的智商都差不多,只要能静下心花时间去钻研就能领先于大部分人,身边的大佬们也是一步一个脚印走过来的。
4. 共勉
上山的路总是坎坷的,若有不对的地方或者什么宝贵的建议请及时指出。
学习最快的方式是相互探讨,若有志同道合的朋友愿意一起进步可以联系我。 (只要是Android方面的知识我都很感兴趣,无论是App开发还是WMS相关)
若有刚入行或者准备入行的小伙伴感到迷茫的,也可以一起沟通,一起壮大Android开发的队伍。
相关文章:
【Android 源码分析】Activity短暂的一生 -- 目录篇 (持续更新)
1. 前言 忽然有一天,我想要做一件事:去代码中去验证那些曾经被“灌输”的理论。 …...
VS Code使用Git Bash终端
Git Bash可以运行linux命令,在VS Code的终端界面,找到号旁边的箭头,就能直接切换了 当然,前提是安装了Git Bash,并且在资源管理器里,能鼠标右键出"Git Bash Here"...
移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——13.mapset(模拟实现)
1.对红黑树进行改造 1.1treenode模板参数改变 之前构建treenode模板参数传的是class k,class v(set为k,k;map是k,v),现在直接用T代替 template<class T> //这里直接传了T作为模板参数,T可能是pai…...
【C++】多态(下)
个人主页~ 多态(上)~ 多态 四、多态的原理1、虚表的存储位置2、多态的原理3、动态绑定和静态绑定 五、单继承和多继承关系的虚函数表1、单继承中的虚函数表2、多继承中的虚函数表 六、多态中的一些小tips 四、多态的原理 1、虚表的存储位置 class A {…...
基于四种网络结构的WISDM数据集仿真及对比:Resnet、LSTM、Shufflenet及CNN
在上节中,我们已经详细介绍了WISDM数据集及如何使用CNN网络训练,得到了六个维度的模型仿真指标及五个维度的可视化分析,那么现在我们将训练模型推广到其他网路结构中去,通过仿真实验来对比一下不同网络之间对于WISDM数据集的训练效…...
【蚂蚁HR-注册/登录安全分析报告】
前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞…...
【分布式微服务云原生】详解Redis的主从模式,主服务器挂了如何从多个从服务器选出新的主服务器
深入探索Redis主从模式:架构、故障转移与最佳实践 摘要: 本文深入探讨了Redis的主从复制模式,包括其工作原理、故障转移机制以及如何配置和管理这一模式。文章通过清晰的结构和实例代码,帮助读者理解如何在实际项目中应用Redis主…...
Android Context是什么?有很多的context他们之间有什么区别?什么时候该使用哪个?
目录 一、Context是什么? 在Android中,Context是一个抽象类 ,它代表了应用程序的当前状态,包括资源和类加载器等,它提供了一个应用运行所需的信息,比如我们要获取资源 ,那么需要她,…...
数字解调同步技术
一些概念 载波同步 载波同步是一个过程,通过该过程,接收机使其本地载波振荡器的频率和相位与接收信号的频率和相位相适应。 载波相位同步 Carrier Phase Synchronization载波频率同步 Carrier Frequency Synchronization 帧同步 待更新 位同步 待…...
k8s搭建一主三从的mysql8集群---无坑
一,环境准备 1.1 k8s集群服务器 ip角色系统主机名cpumem192.168.40.129mastercentos7.9k8smaster48192.168.40.130node1centos7.9k8snode148192.168.40.131node2centos7.9k8snode248192.168.40.132node3centos7.9k8snode348 k8s集群操作请参考《K8s安装部署&…...
Oracle架构之物理存储中各种文件详解
文章目录 1 物理存储1.1 简介1.2 数据文件(data files)1.2.1 定义1.2.2 分类1.2.2.1 系统数据文件1.2.2.2 撤销数据文件1.2.2.3 用户数据文件1.2.2.4 临时数据文件 1.3 控制文件(Control files)1.3.1 定义1.3.2 查看控制文件1.3.3…...
AR 领域的突破——微型化显示屏为主流 AR 眼镜铺平道路
概述 多年来,增强现实 (AR) 技术一直吸引着人们的想象力,有望将数字信息与我们的物理世界无缝融合。通过将计算机生成的图像叠加到现实世界的视图上,AR 有可能彻底改变我们与环境的互动方式。从增强游戏体验到协助手术室的外科医生ÿ…...
Web安全 - 构建全面的业务安全保护防御体系
文章目录 业务安全概述业务安全 vs. 基础安全业务安全的防护业务安全的防护策略1. 用户资源对抗的技术实现与优化2. IP资源对抗的技术实现与优化3. 设备资源对抗的技术实现与优化4. 操作资源对抗的技术实现与优化实际应用场景中的策略 典型场景业务场景 1:新用户注册…...
机器学习(2):机器学习的相关术语
场景示例: 你周日约了小李、老王打牌,小李先来了,老王没来。你想打电话叫老王过来。小李说:“你别打电话啦,昨天老王喜欢的球队皇马输球了,他的项目在上个礼拜也没成功上线,再加上他儿子期末考…...
Leecode热题100-75.颜色分类
给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地 对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。 我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。 必须在不使用库内置的 sort 函数的情况下解…...
408算法题leetcode--第22天
200. 岛屿数量 200. 岛屿数量时间:O(mn);空间:O(min(m, n)),队列最大入队个数,可以想象从左上到右下,第一次入队1个,第二次出队1,入队2,第三次出队2,入队3……...
dubbo微服务
一.启动nacos和redis 1.虚拟机查看是否开启nacos和redis docker ps2.查看是否安装nacos和redis docker ps -a3.启动nacos和redis docker start nacos docker start redis-6379 docker ps二.创建三个idea的maven项目 1.第一个项目dubboapidemo 2.1.1向pom.xml里添加依赖 …...
如何在 DAX 中计算多个周期的移动平均线
在 DAX 中计算移动聚合很容易。但是,计算一段时间内的移动平均值时会有一些陷阱。由于其中一些陷阱是定义问题,因此我们必须小心,不要选择错误的方法。让我们看看细节。欢迎来到雲闪世界。 添加图片注释,不超过 140 字(…...
微信小程序 图片的上传
错误示范 /*从相册中选择文件 微信小程序*/chooseImage(){wx.chooseMedia({count: 9,mediaType: [image],sourceType: [album],success(res) {wx.request({url:"发送的端口占位符",data:res.tempFiles[0].tempFilePath,method:POST,success(res){//请求成功后应该返…...
软件测试人员发现更多程序bug
软件测试人员发现更多程序bug 1. 理解需求和业务,需求评审时候发现bug 熟悉了产品的业务流程、才能迅速找出软件中存在的一些重要的缺陷,发现的软件缺陷才是有价值的。否则即使你能找到一些软件缺陷,那也是纯软件的缺陷,价值不大…...
Nagle 算法:优化 TCP 网络中小数据包的传输
1. 前言 在网络通信中,TCP(传输控制协议)是最常用的协议之一,广泛应用于各种网络应用,如网页浏览、文件传输和在线游戏等。然而,随着互联网的普及,小数据包的频繁传输成为一个不容忽视的问题。…...
C#入门教程
目录 1.if分支语句 2.面向对象 3.static简单说明 1.if分支语句 我们的这个C#里面的if语句以及这个if-else语句和C语言里面没有区别,就是打这个输出上面的方式不一样,c#里面使用的是这个console.writeline这个指令,其他的这个判断逻辑都是一…...
【MySQL报错】---Data truncated for column ‘age‘ at row...
目录 一、前言二、问题分析三、解决办法 一、前言 欢迎大家来到权权的博客~欢迎大家对我的博客进行指导,有什么不对的地方,我会及时改进哦~ 博客主页链接点这里–>:权权的博客主页链接 二、问题分析 问题一修改表结构 XXX 为 not n…...
Go基础学习08-并发安全型类型-通道(chan)深入研究
文章目录 chan基础使用和理解通道模型:单通道、双通道双向通道单向通道单向通道的作用 缓冲通道和非缓冲通道数据发送和接收过程缓冲通道非缓冲通道 通道基本特性通道何时触发panicChannel和Select结合使用Select语句和通道的关系Select语句的分支选择规则有那些Sel…...
some 蓝桥杯题
12.反异或01串 - 蓝桥云课 (lanqiao.cn) #include "bits/stdc.h" #define int long long using namespace std; char c[10000000]; char s[10000000]; int cnt,Ans,mr,mid; int maxi; int p[10000000],pre[10000000]; signed main() {ios::sync_with_stdio(0);cin.t…...
[linux 驱动]input输入子系统详解与实战
目录 1 描述 2 结构体 2.1 input_class 2.2 input_dev 2.4 input_event 2.4 input_dev_type 3 input接口 3.1 input_allocate_device 3.2 input_free_device 3.3 input_register_device 3.4 input_unregister_device 3.5 input_event 3.6 input_sync 3.7 input_se…...
2023_Spark_实验十:Centos_Spark Local模式部署
参考这篇博客:【Centos8_配置单节点伪分布式Spark环境】_centos8伪分布式环境搭建-CSDN博客...
pyecharts-快速入门
pyecharts文档:渲染图表 - pyecharts - A Python Echarts Plotting Library built with love. pyecharts-gallery文档:中文简介 - Document (pyecharts.org) 一、快速入门案例 from pyecharts.charts import Barbar Bar() bar.add_xaxis(["衬衫…...
vue3打包疯狂报错
打包的时候报错很多Cannot find name ‘xxx‘ 。 但是npm run dev 是运行正常的。 解决方法:package.json中的vue-tsc --noEmit 删掉就可以了。 例如: 这是原来的 {"scripts": {"dev": "vite","build": &quo…...
STM32 软件触发ADC采集
0.91寸OLED屏幕大小的音频频谱,炫酷! STM32另一个很少人知道的的功能——时钟监测 晶振与软件的关系(深度理解) STM32单片机一种另类的IO初始化方法 ADC是一个十分重要的功能,几乎任何一款单片机都会包含这个功能&a…...
一级a做爰片视频网站/seo网站建设
函数参数 与大部分编程语言不同,Shell 中函数在定义时不能指定参数,但在调用时可以传递参数。 传递参数给函数:在函数名后面以空白分隔给定参数列表即可,如:testfunc arg1 arg2 … ; 在函数体中当中&#…...
做网站买服务器/爱站网关键词挖掘工具
5.4、父级边框塌陷问题 clear /** clear: left; 左侧不允许有浮动元素 clear: right; 右侧不允许有浮动元素 clear: both; 两侧不允许有浮动元素 clear: none;*/解决方案 1.增加父级元素的高度 #father {border: 1px #000 solid;height: 800px; }2.增加一个空的div标签&…...
做网站的流程方法/网络营销这个专业怎么样
关于veket8.01系统的安装,记述于下:1、将veket8.01的ISO文件下载,只有370M,用一张空白CD盘,找个趁手的刻录软件刻录一下。2、用VEKET的光盘引导笔记本。如果是尝鲜、体验一下veket,不必安装,直接…...
聊城哪儿做网站便宜/深圳门户网站
原文地址为: iOS开发系列--Swift进阶概述 上一篇文章《iOS开发系列--Swift语言》中对Swift的语法特点以及它和C、ObjC等其他语言的用法区别进行了介绍。当然,这只是Swift的入门基础,但是仅仅了解这些对于使用Swift进行iOS开发还是不够的。在…...
wordpress主题缺少样式表/ds2600ii色带
另一篇网址:mongo使用详解1 启动启动mongodb首先要指定mongo的数据目录和日志文件路径,如: /data/mongodb/ /var/log/mongodb/mongodb.log启动命令: /usr/local/mongdb/bin/mongod -port 10001 --dbpath /data/mongodb/ --logpath /var/mong…...
建设银行网站不能登录密码/北京正规seo搜索引擎优化价格
做了许多的用户控件,现在让我们换换口味,开始窗体的制作吧!这个窗体的制作可以说是整个美化中比较重要的一部分,因为她显示的是整个美化的窗体。而且内容也比较多,所以我会分几篇把她讲完,而且窗体制作的时…...