问题:BBQ交互,DRAW_PENDING问题

一,简介

anr是如何产生的,anr后logcat日志是从哪输出来的,trace文件是如何生成的。

app应用启动时,buffer是什么时候申请的,buffer如何和system_server进程关联,如何和surfaceflinger进程关联。

buffer的生产者消费者模式运行哪个进程。

安卓S版本,BLASTBufferQueue是什么东东,主线程和渲染线程的交互,应用和Surfaceflinger的交互。

关于问题汇总分类:

case1,google修复的DRAW_PENDING问题,UI线程发送了绘制命令,但是RenderThread没有真正执行swapBuffer绘制导致无FrameCommitCallback返回。

理论上,可能同源问题 !mContext-hasSurface()

http://gerrit.pt.mioffice.cn/c/platform/frameworks/base/+/1724776/3/libs/hwui/renderthread/CanvasContext.cpp#520

case2,安卓S,相机/相册App出现DRAW_PENDING问题。MIUIROM-485176 MIUIROM-646343

~~//不是RenderThread绘制失败没返回导致。问题原因,UI线程没有发送绘制请求。dispatchOnPreDraw()返回的是cancelDraw。

case3,RenderThread线程的JNI回调失败. MIUIROM-817972

~~//Image的尺寸是0,出现异常;

case4,分屏,右滑退出分屏,点击home键出现黑屏. MIUIROM-829220

~~//Launcher发起relayout结果是blastSync,当完成绘制之后检查发送SF状态时isOnScreen()是false;

~~//再次启动Launcher时,设置DRAW_PENDING; ViewRootImpl在mWaitForBlastSyncComplete,所有无法完成绘制;

case5,安卓S,饿了么App,小窗下添加收货地址,无响应. MIUIROM-965888

~~// ViewRootImpl.java的mDrawsNeededToReport变量有问题. SurfaceView.java调VRI的drawPending()和完成次数不对称;

~~//原因是GLSurfaceView.java的requestRenderAndNotify()的mFinishDrawingRunnable对象被覆盖;

安卓T变化:

~~//1,system_server进程:WindowState.java的mSyncSeqId递增;

~~//递增时机,prepareSync(),applyWithNextDraw();

~~//WindowState.java的reportResized(),携带mSyncSeqId参数;

~~//2,app进程中ViewRootImpl.java的没有跳过performTraversals()流程;

~~//调整窗口打小,handleResized()的mSyncSeqId从wm传递过来;

~~//3,BLASTBufferQueue.cpp,调acquireAndReleaseBuffer();

分析定位问题日志change: https://gerrit.pt.mioffice.cn/c/platform/frameworks/base/+/1519907/16

app.performTraversals app.frameDrawingCallback app.JNI.frameDrawingCallback app.reportDrawFinished app.setFrameCompleteCallback system_server.finishDrawing system_server.commitFinishDrawingLocked system_server.performShowLocked system_server.showSurfaceRobustlyLocked app.clearBlastSync extra: system_server.resetDrawState system_server.requestDrawIfNeeded system_server.updateResizingWindowIfNeeded

二 ,问题描述

from: 戈鹏 @Chuang3 Zhang 张闯 闯哥,8.0的uat貌似又发生大规模的无焦点了,集中在7149158上,就桌面就730多次,帮忙明天看看呢。 整体的log http://cnbj1-fds.api.xiaomi.net/omni.upload/execution_result/7149158/7408260/zeus_V13.0.8.0.SLBCNXM_7149158.zip?1639881312463 这台机器测试的结果 http://omni.pt.miui.srv/execution/resultDetail?url=http%3A%2F%2Fcnbj1-fds.api.xiaomi.net%2Fomni.upload%2Fexecution_result%2F7149158%2F7408260%2Fzeus_V13.0.8.0.SLBCNXM_7149158_report.zip&executionId=7149158 日志片段: 7-68892f952021-12-1807:50:35.554196/bugreport-zeus-SKQ1.211006.001-2021-12-18-07-45-13/bugreport-zeus-SKQ1.211006.001-2021-12-18-07-45-13.txt

日志关键片段 展开源码

问题jira: https://jira.n.xiaomi.com/browse/MIUIROM-442586

关注change: http://gerrit.pt.mioffice.cn/c/platform/frameworks/base/+/1858022/ //20220926,目前,怀疑是高通库条件判断跳出绘制;

三,ANR如何产生/app进程信息输出

应用ANR产生和处理过程 展开源码

App进程中主要线程及创建 展开源码

问:FocusedApplications和FocusedWindows更新时机 展开源码

问:什么场景下会出现FocusedApplications不为空,FocusedWindows为空: 展开源码

四,system_server进程的mDrawState的状态变化

启动App和system_server进程的交互流程(悬浮窗口显示流程和Activity流程一致,都是ViewRootImpl.java调用relout函数):

mDrawState都有哪些状态 展开源码

问:什么场景下WindowState的mDrawState状态是NO_SURFACE/DRAW_PENDING 展开源码

从DRAW_PENDING.CommitDrawPending.ReadyToShow.hasDrawn到apply给sf流程 展开源码

五,App进程的UI线程和RenderThread交互(三种回调)/BufferQueue模型/allocateBuffer申请

5.1 应用绘制线程和主线程分开

App进程的”RenderThread”线程:主要是setSurface()/allocateBuffers()/DrawFrames功能;

问:一个Vsync内(Choreographer#doFrame动作)是否可以有多次绘制(syncAndDrawFrame动作) 展开源码

App进程的”RenderThread”线程的connect流程/setSwapInterval流程 展开源码

5.2 三种回调

google的修改change: http://gerrit.pt.mioffice.cn/c/platform/frameworks/base/+/1858022

FrameCallback和CommitCallback使用 展开源码

问:CanvasContext.cpp的waitOnFences()的含义(仅仅时给UI线程回调正在Drawing) 展开源码

音量的模糊-FrameDrawingCallback 展开源码

5.3 buffer的生产者消费者模型/Fence时机

buffer的生产者消费者模型/Fence时机 展开源码

5.4 app的surface和surfaceflinger进程的layer关系

app的surface和surfaceflinger进程的layer关系 展开源码

5.5 buffer申请过程

buffer的申请过程 展开源码

dump meminfo和gfxinfo数据流 展开源码

六, BLASTBuffer过程:App进程/system_server进程/sufaceflinger的交互

6.1 旋转屏幕时apply数据流

安卓T版本,VRI调RT的registerRTFrameCallback(),回调onFrameDraw()时调BBQ的syncNextTransaction();当onFrameAvailable()是直接回调onBufferReady();

clearBlastSync的回调 展开源码

问:什么场景需要reportNextDraw: 展开源码

应用App进程启动第一次relayoutWindow流程(App进程,“system_server”进程,sf进程,new出SurfaceControl): 展开源码

6.2 旋转屏幕时PendingDrawHandlers变量变化

旋转时PendingDrawHandlers变化 展开源码

surfaceflinger主要线程/初始化 展开源码

6.3 分屏调节窗口大小的apply数据流

分屏调节时SurfaceControl的apply过程 展开源码

6.4 关于case3,RenderThread线程的JNI回调失败

RenderThread异常抛出/反射调用 展开源码

6.5 关于case4,分屏,右滑退出分屏,点击home键出现黑屏. MIUIROM-829220

1,点击notesIcon启动全屏标签App时Launcher的状态

2,待分屏时,点击notesIcon启动分屏标签App时Launcher的状态

3,出现问题时,点击notesIcon启动分屏标签App时Launcher的状态(可见性处理/isOnScreen状态/Resume状态)

~~//Launcher进程,config变化发起relayout结果是blastSync,当完成绘制之后检查发送SF状态时isOnScreen()是false;

~~//再次启动Launcher时,isScreenOn变为ture但mDrawState是DRAW_PENDING仍不满足给sf;

启动notes的堆栈 展开源码

关键日志片段 展开源码

6.6 使用blastSync场景:

使用blastSync场景,多个GraphicBuffer上屏变化同步: ~~//case1,分屏调节大小;由SystemUI进程发起,分屏两边大小变化同时展示; ~~//case2,SurfaceView场景; SurfaceView的状态和ViewRootImpl的GraphicBuffer同步; ~~//比如,创建时positionChanged()调show();销毁时positionLost()调hide(); ~~//applyStretch()调setStretchEffect();更新alhpa值;更新Z序;

~~~~~~ 安卓R版本,调节分屏大小松开手时,两个App各自更新,互不影响; 安卓S版本,调节分屏大小松开手时,两个App的buffer变化的一起apply到SF层;

使用blastSync场景 展开源码

google介绍的资料: