App的启动过程(6)面向应用程序的本地窗口surface
来源:互联网 发布:网侠安卓电视直播软件 编辑:程序博客网 时间:2024/06/05 17:39
接下来分析下面向应用程序的本地窗口surface,这里的surface不是Surface.java,而是指Surface.cpp,它承担着应用程序中的UI显示需求,一方面要向上层提供绘制图像的画板,也就是GraphicBuffer,另一方面配合surfaceflinger完成收集应用程序的图像数据。当然,应用程序是不可能直接使用surface(后者说bufferQueue,图形缓冲区Graphicbuffer实际是由bufferqueue来管理的)的,会有层层封装。先看下应用程序端的surface是怎么申请。
Surface有几种状态,分别对应了窗口的绘制状态:
/*WindowStateAnimator.java*/
String drawStateToString() {
switch(mDrawState) {
//surface还没有创建
caseNO_SURFACE: return "NO_SURFACE";
//surface已经创建,但窗口还没有开始绘制,surface实际处于隐藏状态
case DRAW_PENDING: return"DRAW_PENDING";
//窗口已经第一次绘制完,但surface还没开始显示,它将在下一次的layout中被显示出来
caseCOMMIT_DRAW_PENDING: return "COMMIT_DRAW_PENDING";
//窗口的绘制请求已经提交,但是surface还没有实际显示出来
caseREADY_TO_SHOW: return "READY_TO_SHOW";
//窗口已经第一次显示在屏幕上
caseHAS_DRAWN: return "HAS_DRAWN";
}
}
应用进程申请一个surface的过程:
当ViewRootImpl在执行performTraversals时,会调用relayoutwindow进而通过IwindowSession的relayout方法,实际是通过wms向surfaceflinger申请surface,通过参数mSurface返回结果。
mWindowSession.relayout(…mSurface)@ViewRootImpl.javaà
IWindowSession对应的服务端实现是Session.java
relayout()@Session.java à直接调用了wms的函数:mService.relayoutWindow()
/*WindowManagerService.java*/
public int relayoutWindow(…, SurfaceoutSurface){
//创建了WindowSurfaceController,
result= createSurfaceControl(outSurface, result, win, winAnimator);
}
private int createSurfaceControl(SurfaceoutSurface,){
//通过WindowStateAnimator.java创建WindowSurfaceController的构造函数中创建了SurfaceControl,来管理surface,包括surface的创建和销毁
WindowSurfaceControllersurfaceController = winAnimator.createSurfaceLocked();
surfaceController.getSurface(outSurface);
}
void getSurface(Surface outSurface)@WindowSurfaceController.java {
outSurface.copyFrom(mSurfaceControl);
}
//通过jni调用本地类的实现,生成本地层的surface
copyFrom ()@Surface.java{
longnewNativeObject = nativeCreateFromSurfaceControl(surfaceControlPtr);
}
转到本地代码android_view_Surface.cpp
static jlongnativeCreateFromSurfaceControl(…jlong surfaceControlNativeObj) {
//这里调用的是surfacecontrol.cpp中的getsurface
sp<SurfaceControl>ctrl(reinterpret_cast<SurfaceControl *>(surfaceControlNativeObj));
sp<Surface>surface(ctrl->getSurface());
//将本地的surface(c++)对象记录到java层surface对象变量中
returnreinterpret_cast<jlong>(surface.get());
}
sp<Surface>SurfaceControl::getSurface() @SurfaceControl.cpp{
//创建了本地层的surface,并传入参数sp<IGraphicBufferProducer>,IGraphicBufferProducer是surface与BufferQueue交互的Binder通道,dequeuebuffer,queuebuffer都是通过IGraphicBufferProducer间接实现。
mSurfaceData= new Surface(mGraphicBufferProducer, false);
}
IGraphicBufferProducer在服务端的实现是BufferQueueProducer.cpp从继承关系可以开的出来:
class BufferQueueProducer : publicBnGraphicBufferProducer,…
看一下Surface作为应用程序端的本地窗口,是怎样履行ANativeWindow这个窗口协议的。
首先继承了ANativeWindow
class Surface : publicANativeObjectBase<ANativeWindow, Surface, RefBase>
然后,surface的构造函数:
Surface::Surface(const sp<IGraphicBufferProducer>&bufferProducer, bool controlledByApp){
//给ANativeWindow中的函数指针赋值,
ANativeWindow::setSwapInterval = hook_setSwapInterval;
ANativeWindow::dequeueBuffer = hook_dequeueBuffer;
ANativeWindow::cancelBuffer = hook_cancelBuffer;
ANativeWindow::queueBuffer = hook_queueBuffer;
ANativeWindow::query = hook_query;
ANativeWindow::perform = hook_perform;
}
Surface内部重要的成员变量:
sp<IGraphicBufferProducer>mGraphicBufferProducer;就是在创建surface对象时传入的那个参数,surface就是通过它来获取buffer的,同时也是surface跟surfaceflinger真正有联系的一个对象。
BufferSlot mSlots[NUM_BUFFER_SLOTS];这个数组的最大值是64,但是实际使用的具体值时根据setMaxDequeuedBufferCount来设置的,通常是双缓冲是2,三缓冲就是3,surface内部用于存储buffer的地方,BufferSlot内部由一个GraphicBuffer和一个dirtyRegion组成。
struct BufferSlot {
sp<GraphicBuffer> buffer;
Region dirtyRegion;
};
- App的启动过程(6)面向应用程序的本地窗口surface
- Android应用程序窗口(Activity)的绘图表面(Surface)的创建过程分析
- Android应用程序窗口(Activity)的绘图表面(Surface)的创建过程分析
- Android应用程序窗口(Activity)的绘图表面(Surface)的创建过程分析
- Android应用程序(app)进程启动过程的源代码分析
- 基于surface机制的surfaceflinger启动过程
- android应用程序窗口框架学习(3)-应用程序的进程的启动过程
- 分析点击android桌面app图标启动应用程序的过程
- 应用程序的启动过程
- App的启动过程
- Android应用程序请求SurfaceFlinger服务创建Surface的过程分析
- Android应用程序请求SurfaceFlinger服务渲染Surface的过程分析
- Android应用程序请求SurfaceFlinger服务渲染Surface的过程分析
- Android应用程序请求SurfaceFlinger服务创建Surface的过程分析
- Android应用程序请求SurfaceFlinger服务创建Surface的过程分析
- Android应用程序请求SurfaceFlinger服务创建Surface的过程分析
- Android应用程序请求SurfaceFlinger服务渲染Surface的过程分析
- Android应用程序请求SurfaceFlinger服务创建Surface的过程分析
- number 类型的字段
- Android数据存储五种方式总结
- Linux下的C++程序:统计一个目录及其内部文件总共占据的空间大小
- DelayedFetch分析
- Java并发编程:volatile关键字解析
- App的启动过程(6)面向应用程序的本地窗口surface
- 柱状图跟饼图
- Android UI 之 RecyclerView实现常见首页布局
- BP反向传播一文弄懂神经网络中的反向传播法
- 使用watch监听路由变化和watch监听对象
- java web 连接数据库举例
- Android APP 市场地址
- 笨办法06字符串(string)和文本
- Linux 内核中的并发--概念