Android焦点之SurfaceFlinger的apply

接animate()的openSurfaceTransaction(),prepareSurfaces(),closeSurfaceTransaction()

  1. mService.openSurfaceTransaction(),通过SurfaceControl来通知native开始一个Transaction;

  2. mService.closeSurfaceTransaction(),通过SurfaceControl来通知native(SurfaceFlinger)关闭一个Transaction最终来执行合成显示等工作;

WMS#openSurfaceTransaction:New出GlobalTransactionWrapper 接animate()的dc.prepareSurfaces();

DisplayContent#prepareSurfaces:将SurfaceControl提交在了mPendingTransaction上。然后完成遍历后,将mPendingTransaction合并到全局Transaction对象上提交给SurfaceFlinger。

mergeToGlobalTransaction将提供的Transaction合并提交,然后接animate()调Wms的closeSurfaceTransaction()

WMS#closeSurfaceTransaction: 再调用SurfaceControl的内部类GlobalTransactionWrapper#applyGlobalTransaction

SurfaceComposerClient#apply: 再调用android_view_SurfaceControl.cpp的nativeApplyTransaction方法,

apply方法主要就是收集之前通过transaction属性设置方法设置所有信息都需要收集起来,比如最重要的composerStates,然后调用sf的跨进程方法setTransactionState传递到sf中。

java 复制代码
@frameworks/base/services/core/java/com/android/server/wm/WindowAnimator.java
private void animate(long frameTimeNs) {
@frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java    
    mService.openSurfaceTransaction();
@frameworks/base/core/java/android/view/SurfaceControl.java
        SurfaceControl.openTransaction();
            sGlobalTransaction = new GlobalTransactionWrapper();
@frameworks/base/services/core/java/com/android/server/wm/DisplayContent.java
    dc.prepareSurfaces();
@frameworks/base/core/java/android/view/SurfaceControl.java    
        SurfaceControl.mergeToGlobalTransaction(transaction);
            sGlobalTransaction.merge(t);
@frameworks/base/core/jni/android_view_SurfaceControl.cpp            
                nativeMergeTransaction(mNativeObject, other.mNativeObject);
                    transaction->merge(std::move(*otherTransaction));
    mService.closeSurfaceTransaction("WindowAnimator");
@frameworks/base/core/java/android/view/SurfaceControl.java    
        SurfaceControl.closeTransaction();
            else if (--sTransactionNestCount > 0) { //open和close一一对应,保证 sTransactionNestCount 数量    
            sGlobalTransaction.applyGlobalTransaction(false);
@frameworks/base/core/jni/android_view_SurfaceControl.cpp
                nativeApplyTransaction(mNativeObject, sync);
@frameworks/native/libs/gui/SurfaceComposerClient.cpp                
                    transaction->apply(sync);
                        for (auto const& kv : mComposerStates){ composerStates.add(kv.second);  }  // 遍历mComposerStates,其中包含了所有的InputWindow
                        displayStates = std::move(mDisplayStates);
                            //最后把上面收集的Transaction相关信息,调用sf的setTransactionState进行跨进程传递到sf进程
                            sf->setTransactionState(mFrameTimelineInfo, composerStates, displayStates, flags, applyToken,mInputWindowCommands, mDesiredPresentTime, mIsAutoTimestamp,hasListenerCallbacks, listenerCallbacks, mId)
                            clear();//apply后就需要把Transaction进行clear
相关推荐
zimoyin1 小时前
kotlin Android AccessibilityService 无障碍入门
android·开发语言·kotlin
韩仔搭建13 小时前
第二章:安卓端启动流程详解与疑难杂症调试手册
android·ui·娱乐
A-花开堪折13 小时前
Android7 Input(七)App与input系统服务建立连接
android
冰糖葫芦三剑客13 小时前
Android 自定义悬浮拖动吸附按钮
android
吃汉堡吃到饱13 小时前
【Android】从Choreographer到UI渲染(二)
android·ui
微信公众号:AI创造财富13 小时前
显示的图标跟UI界面对应不上。
android·ui
aningxiaoxixi13 小时前
安卓 Audio Stream 类型
android
奔跑吧 android13 小时前
【android bluetooth 协议分析 01】【HCI 层介绍 3】【NUMBER_OF_COMPLETED_PACKETS 事件介绍】
android·bluetooth·hci·bt·gd·aosp13
_龙小鱼_16 小时前
Kotlin扩展简化Android动画开发
android·开发语言·kotlin
奔跑吧 android16 小时前
【android bluetooth 协议分析 01】【HCI 层介绍 6】【WriteLeHostSupport命令介绍】
android·bluetooth·bt·gd·aosp13·writelehostsup·hcicmd