Android Surface解析

本文深入解析Android中Surface与Activity的关系,从Activity启动、Window创建到Surface的生成过程。通过源码分析,揭示了Activity如何通过Surface与屏幕合成器交互,展示了从DecorView到Surface的完整路径,以及Surface在ViewRootImpl中的作用。
摘要由CSDN通过智能技术生成

(源码截图是Android 5.1.1_r6)

 

 

一 App和Surface的关系是怎样的

不论是用Skia绘制二维图像,还是用OpenGL绘制三维图像,最终Application都要和Surface交互。Surface 是什么:

Handle onto a raw buffer that is being managed by the screen compositor.

由屏幕显示内容合成器(screen compositor)所管理的原始缓冲区的句柄,就像在C++语言中,可以通过一个文件的句柄,就可以获得文件的内容一样,通过Surface就可以获得原生缓冲器以及其中的内容,那App是怎么通过Surface获取的缓冲区去绘图的呢?

应用程序的外表是通过Activity显示的,首先我们来看一下Activity是怎么完成界面绘制工作的。从Activity启动开始跟。

Zygote在收到启动请求的时候,会fork一个子进程,这个子进程就是app的对应的进程,它的入口函数就是ActivityThread类的main函数,这个类里面有一个handleLaunchActivity函数,它就是创建Activity的地方。

然后接着看Activity创建的代码performLaunchActivity

Instrumentation.java

跳转到Activity attach中

Window是个抽象类,那当前Activity中的这个mWindow的具体实现类是哪个?

继续跟这个PolicyManager

这里获取了return 了 com.android.internal.policy.impl.Policy 的这个类 makeNewWindow(context)方法,继续跟Policy这个类

这里发现了,Activity中存在的Window是PhoneWindow。

然后继续Activity创建好后的方法handleResumeActivity();

这里三个方法都要跟,先看第一个r.getWindow.getDecorView();

r是ActivityClinetRecord 是Activity描述的类,对Activity进行了高度抽象,记录了Activity的各种信息,大家应该都清楚,这里就不再赘述了。

1.window.getDecorView。

ActivityClinetRecord记录着是是Activity的信息,所以这个window就是刚刚说的Activity里面的PhoneWindow,我们跟一下PhoneWindow这个方法

再看一下installDecor()方法,这个方法是不是有点眼熟,setContentView就是调的这个,我们看一下SetContentView

再跟一下这个installDecor

如果用户没有传这个layout,mContentParent就是decorView的子布局

再看一下generateLayout(mDecor)这个方法,方法太多截取了一下

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值