android源码宇宙-ViewRootImpl

简介: android源码宇宙-ViewRootImpl

ViewRootImpl分析


ViewRootImpl是用来指导我们view体系测量、布局、绘制的一个类,当需要重新刷新的时候,ViewRootImpl会负责去申请vsync信号,然后在收到vsync信号后结合wms完成view的测量、布局、绘制。


源码


主流程代码

通过以前wms的学习我们知道ViewRootImpl的创建是发生在WindowManagerGlobal.addView方法中的,那么我们就从WindowManagerGlobal.addView方法开始我们的分析。

  1. ViewRootImpl的创建过程

image.png

  1. ViewRootImpl.setView方法

setView方法中的requestLayout会去请求重新绘制屏幕内容,当我们主动调用requestLayout、invalidate、启动动画的时候都会走重新绘制屏幕

image.png

  1. 调用了requestLayout后就会走我们熟悉的Choreographer请求vsync信号的过程,当vsync信号拿到后就会回调TraversalRunnable
  2. 查看TraversalRunnable

image.png

  1. doTraversal

image.png

  1. performTraversals

在performTraversals方法中会依次调用measureHierarchy、performLayout、performDraw方法完成view的测量、布局绘制


performTraversals方法是如何工作的

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png


此处省略一大段SurfaceView的处理逻辑,将来有必要再说

总的来说,在ViewRootImpl来说,SurfaceView的绘制逻辑优先级是高于我们的view体系的,它会在我们的view绘制之前先执行,并且拥有自己的绘制线程。

image.png

image.png

image.png

image.png

image.png

performMeasure

  1. ViewRootImpl.performMeasure

image.png

  1. View.measure

image.png

image.png

  1. onMeasure

onMeasure中会设置默认的尺寸

image.png

performLayout

image.png

image.png

image.png

小结:ViewRootImpl.performLayout方法会自顶向下进行布局,performLayout方法会进行两次布局,第一次布局会调用DecorView.layout方法。当第一次方法完成后会去布局的请求池去拿最新的请求,如果在布局的过程中有新的布局请求,则我们需要进行重新测量和布局。 当第二次测量和布局完成后,会再次去查看布局请求池中的请求,此时如果又发现了新的请求,则新的请求会等待下一帧到来的时候再去参与到下一帧的绘制中。

performDraw

  1. ViewRootImpl.performDraw

image.png

image.png

流程太多细节代码暂时没看那么透,下一步主要的代码在ThreadedRenderer.draw

image.png

  1. ThreadedRenderer.draw

image.png

  1. ThreadedRenderer.updateRootDisplayList

image.png

  1. ThreadedRenderer.updateViewTreeDisplayList

image.png

  1. View.updateDisplayListIfDirty

image.png

image.png

  1. View.draw

image.png

下图是绘制边缘内容,流程和调用方法与view本身绘制相同,所以后面的代码不贴了

image.png


View.requestLayout

image.png


其它


某个View.requestLayout快速多次调用,是否会触发多次布局

答:不会

image.png

小结:单个View调用requestLayout后,在View.layout方法执行前,无法再次向父类传递mParent.requestLayout请求。吐槽:源码中逻辑运算符操作真难读


是否每次调用View.requestLayout都会 重新测量所有View的尺寸,即:调用所有View.onMeasure方法

答:不会

  1. View.requestLayout中设置强制布局的标志位

这个标志位只会对当前View有效

image.png

  1. View.measure根据PFLAG_FORCE_LAYOUT标志位判断进行测量

image.png

总结:当我们调用某个View.requestLayout的时候会设置一个标志位,当ViewRootImpl收到我们的布局请求后,向下遍历view的时候会走所有子View的measure来测量,这些子View如果没有设置过该标志位,则不会走测量宽度的逻辑。



相关文章
|
3月前
|
Ubuntu 开发工具 Android开发
Repo下载AOSP源码:基于ubuntu22.04 环境配置,android-12.0.0_r32
本文介绍了在基于Ubuntu 22.04的环境下配置Python 3.9、安装repo工具、下载和同步AOSP源码包以及处理repo同步错误的详细步骤。
244 0
Repo下载AOSP源码:基于ubuntu22.04 环境配置,android-12.0.0_r32
|
3月前
|
开发工具 git 索引
repo sync 更新源码 android-12.0.0_r34, fatal: 不能重置索引文件至版本 ‘v2.27^0‘。
本文描述了在更新AOSP 12源码时遇到的repo同步错误,并提供了通过手动git pull更新repo工具来解决这一问题的方法。
132 1
|
3月前
|
Android开发 Docker 容器
docker中编译android aosp源码,出现Build sandboxing disabled due to nsjail error
在使用Docker编译Android AOSP源码时,如果遇到"Build sandboxing disabled due to nsjail error"的错误,可以通过在docker run命令中添加`--privileged`参数来解决权限不足的问题。
707 1
|
3月前
|
开发工具 uml git
AOSP源码下载方法,解决repo sync错误:android-13.0.0_r82
本文分享了下载AOSP源码的方法,包括如何使用repo工具和处理常见的repo sync错误,以及配置Python环境以确保顺利同步特定版本的AOSP代码。
469 0
AOSP源码下载方法,解决repo sync错误:android-13.0.0_r82
|
3月前
|
Java Android开发 芯片
使用Android Studio导入Android源码:基于全志H713 AOSP,方便解决编译、编码问题
本文介绍了如何将基于全志H713芯片的AOSP Android源码导入Android Studio以解决编译和编码问题,通过操作步骤的详细说明,展示了在Android Studio中利用代码提示和补全功能快速定位并修复编译错误的方法。
142 0
使用Android Studio导入Android源码:基于全志H713 AOSP,方便解决编译、编码问题
|
3月前
|
Android开发
我的Android 进阶修炼(1): AOSP源码根目录结构
本文介绍了AOSP源码的根目录结构,提供了基于MTK9269 Android 9.0源码的目录说明,帮助读者了解AOSP源码的组织方式和各目录的功能。
189 0
我的Android 进阶修炼(1): AOSP源码根目录结构
|
3月前
|
API 开发工具 Android开发
Android源码下载
Android源码下载
489 0
|
3月前
|
开发工具 Android开发 git
全志H713 Android 11 :给AOSP源码,新增一个Product
本文介绍了在全志H713 Android 11平台上新增名为myboard的产品的步骤,包括创建新的device目录、编辑配置文件、新增内核配置、记录差异列表以及编译kernel和Android系统的详细过程。
131 0
|
3月前
|
Ubuntu 开发工具 Android开发
Repo下载、编译AOSP源码:基于Ubuntu 21.04,android-12.1.0_r27
文章记录了作者在Ubuntu 21.04服务器上配置环境、下载并编译基于Android 12.1.0_r27版本的AOSP源码的过程,包括解决编译过程中遇到的问题和错误处理方法。
205 0
|
4月前
|
消息中间件 前端开发 Android开发
Android面试题自定义View之Window、ViewRootImpl和View的三大流程
Android开发中,View的三大核心流程包括measure(测量)、layout(布局)和draw(绘制)。MeasureSpec类在测量过程中起到关键作用,它结合尺寸大小和模式(EXACTLY、AT_MOST、UNSPECIFIED)来指定View应如何测量。onMeasure方法用于自定义View的测量,布局阶段,ViewGroup调用onLayout确定子元素位置,而draw阶段按照特定顺序绘制背景、内容、子元素和装饰。整个流程始于ViewRootImpl的performTraversals,该方法触发测量、布局和绘制。
118 0
下一篇
无影云桌面