SurfaceControl之Transaction事物深入剖析-android framework实战开发

这篇具有很好参考价值的文章主要介绍了SurfaceControl之Transaction事物深入剖析-android framework实战开发。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景

前面已经讲解清楚了SurfaceControl整个创建过程,一般SurfaceControl都是一个静态图层的代表,但往往只有静态一个图层是没有意义的,即只是创建了一个图层其实啥也看不到,更多需要是SurfaceControl对应的Transaction,这个事务才是真正可以让SurfaceControl可以显示的关键所在,Transaction才是相当于一个个的动作让SurfaceControl静态东西可以动起来,接下来将详细分析一下Transaction。

常见Transaction使用案例

  private final Transaction mTransaction = new Transaction();//构建或者获取一个事物
    mTransaction.setLayerStack(mSurfaceControl, mDisplayLayerStack); //开始用事物对象,对一个个SurfaceControl进行设置属性
    mTransaction.setWindowCrop(mSurfaceControl, mDisplayWidth, mDisplayHeight);//开始用事物对象,对一个个SurfaceControl进行设置属性
    mTransaction.apply();//针对事物进行apply操作

surfacecontrol.transaction,surfaceflinger,android,车载系统,SurfaceFlinger,SurfaceControl,Transaction,aosp,framework开发
上面可以看出,Transaction是一个独立的事物对象,专门用于操作一个个SurfaceControl的属性,但并不是属于SurfaceControl对象的成员,即Transaction完全可以实现一对多个SurfaceControl情况。

Transaction的构造

frameworks/base/core/java/android/view/SurfaceControl.java

  public Transaction() {
            this(nativeCreateTransaction());
        }

来看看nativeCreateTransaction方法
frameworks/base/core/jni/android_view_SurfaceControl.cpp

static jlong nativeCreateTransaction(JNIEnv* env, jclass clazz) {
    return reinterpret_cast<jlong>(new SurfaceComposerClient::Transaction);
}

就是简单的构造了一个SurfaceComposerClient::Transaction对象
frameworks/native/libs/gui/SurfaceComposerClient.cpp

SurfaceComposerClient::Transaction::Transaction() {
    mId = generateId();
}

可以看到如果默认的构造的Transaction其实啥也没有干,就是生成了个Id然后赋值给了mId成员变量。

Transaction相关介绍

主要成员

layer_state_t结构体
用来代表Layer图层的的相关信息,SurfaceControl与sf的Layer共用这个layer_state_t结构体,layer_state_t包括layer所有属性
主要成员如下:
surfacecontrol.transaction,surfaceflinger,android,车载系统,SurfaceFlinger,SurfaceControl,Transaction,aosp,framework开发
可以看到常见的主要属性:坐标,长宽,变换矩阵,变化值what,flags,mask等,一般是一个图层就有一个layer_state_t结构体。
ComposerStates结构体

struct ComposerState {
    layer_state_t state;
    status_t write(Parcel& output) const;
    status_t read(const Parcel& input);
};

可以看出就是layer_state_t进行了一个包装而已

mComposerStates
定义如下:
std::unordered_map<sp, ComposerState, IBinderHash> mComposerStates;
可以看出来其实就是一个装载ComposerState的map容器,map的key是每个SurfaceControl的handle,具体可以看一下这个mComposerStates的容器添加方法:

layer_state_t* SurfaceComposerClient::Transaction::getLayerState(const sp<SurfaceControl>& sc) {
    auto handle = sc->getLayerStateHandle();//获取SurfaceControl的handle,
	//判断是否mComposerStates容器是否存在这个sc的相关信息,如果没有则进入添加
    if (mComposerStates.count(handle) == 0) {
        // we don't have it, add an initialized layer_state to our list
        ComposerState s;//初始化一个ComposerState

        s.state.surface = handle;
        s.state.layerId = sc->getLayerId();

        mComposerStates[handle] = s;//把初始化的ComposerState放到map集合mComposerStates中
    }
//如果存在,则直接通过handle从mComposerStates获取state返回
    return &(mComposerStates[handle].state);
}

上面其实可以得出如下结论:
1、每个Transaction都有自己的一个mComposerStates集合
2、mComposerStates集合会放入Transaction中会操作的SurfaceControl对应的layer_state_t
补充一下 sc->getLayerStateHandle方法:

sp<IBinder> SurfaceControl::getLayerStateHandle() const
{
    return mHandle;
}

这个mHandle其实就是sf端创建一个Handle

sp<IBinder> Layer::getHandle() {
    Mutex::Autolock _l(mLock);
    if (mGetHandleCalled) {
        ALOGE("Get handle called twice" );
        return nullptr;
    }
    mGetHandleCalled = true;
    return new Handle(mFlinger, this);
}

即mHandle是sf端代表Layer的BpBinder对象。

主要方法

一些属性常见设置方法
//可以看到一般属性操作方法第一参数是SurfaceControl,后面属性需要参数
SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setPosition(
        const sp<SurfaceControl>& sc, float x, float y) {
    layer_state_t* s = getLayerState(sc); //获取sc对应的layer_state_t
    s->what |= layer_state_t::ePositionChanged;//改变what,即标记layer_state_t哪个属性是有变化的,方便sf进行识别获取
    s->x = x; //接下来才是改变具体的值
    s->y = y;

    registerSurfaceControlForCallback(sc);
    return *this;
}

上面就是一个经典的Transaction改变属性的方法,常规就是以下几步:
1、通过传递来的sc,获取sc的layer_state_t
2、标记layer_state_t的what属性,主要为了明显表达出哪个属性变化了
3、进行具体属性改变

其他的属性方法套路都和上面基本一样
surfacecontrol.transaction,surfaceflinger,android,车载系统,SurfaceFlinger,SurfaceControl,Transaction,aosp,framework开发

merge方法

主要目的是把多个Transaction的内容合并到一个,即把other的这个Transaction内容都拷贝到当前Transaction

SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::merge(Transaction&& other) {
    for (auto const& [handle, composerState] : other.mComposerStates) {
        if (mComposerStates.count(handle) == 0) {
            mComposerStates[handle] = composerState;
        } else {
            if (composerState.state.what & layer_state_t::eBufferChanged) {
                releaseBufferIfOverwriting(mComposerStates[handle].state);
            }
            mComposerStates[handle].state.merge(composerState.state);
        }
    }

    for (auto const& state : other.mDisplayStates) {
        ssize_t index = mDisplayStates.indexOf(state);
        if (index < 0) {
            mDisplayStates.add(state);
        } else {
            mDisplayStates.editItemAt(static_cast<size_t>(index)).merge(state);
        }
    }

    for (const auto& [listener, callbackInfo] : other.mListenerCallbacks) {
        auto& [callbackIds, surfaceControls] = callbackInfo;
        mListenerCallbacks[listener].callbackIds.insert(std::make_move_iterator(
                                                                callbackIds.begin()),
                                                        std::make_move_iterator(callbackIds.end()));

        mListenerCallbacks[listener].surfaceControls.insert(surfaceControls.begin(),
                                                            surfaceControls.end());

        auto& currentProcessCallbackInfo =
                mListenerCallbacks[TransactionCompletedListener::getIInstance()];
        currentProcessCallbackInfo.surfaceControls
                .insert(std::make_move_iterator(surfaceControls.begin()),
                        std::make_move_iterator(surfaceControls.end()));

        // register all surface controls for all callbackIds for this listener that is merging
        for (const auto& surfaceControl : currentProcessCallbackInfo.surfaceControls) {
            TransactionCompletedListener::getInstance()
                    ->addSurfaceControlToCallbacks(surfaceControl,
                                                   currentProcessCallbackInfo.callbackIds);
        }
    }

    mInputWindowCommands.merge(other.mInputWindowCommands);

    mContainsBuffer |= other.mContainsBuffer;
    mEarlyWakeupStart = mEarlyWakeupStart || other.mEarlyWakeupStart;
    mEarlyWakeupEnd = mEarlyWakeupEnd || other.mEarlyWakeupEnd;
    mApplyToken = other.mApplyToken;

    mFrameTimelineInfo.merge(other.mFrameTimelineInfo);

    other.clear();
    return *this;
}
apply方法

status_t SurfaceComposerClient::Transaction::apply(bool synchronous, bool oneWay) {
  //省略非关键
    for (auto const& kv : mComposerStates){ //收集各个图层sc的ComposerState信息
        composerStates.add(kv.second);
    }

    displayStates = std::move(mDisplayStates);
//省略部分
//最后把上面收集的Transaction相关信息,调用sf的setTransactionState进行跨进程传递到sf进程
    sf->setTransactionState(mFrameTimelineInfo, composerStates, displayStates, flags, applyToken,
                            mInputWindowCommands, mDesiredPresentTime, mIsAutoTimestamp,
                            {} /*uncacheBuffer - only set in doUncacheBufferTransaction*/,
                            hasListenerCallbacks, listenerCallbacks, mId);
    mId = generateId();

    // Clear the current states and flags
    clear();//apply后就需要把Transaction进行clear
    return NO_ERROR;
}

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

补充sf端的处理:

frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp

uint32_t SurfaceFlinger::setClientStateLocked(const FrameTimelineInfo& frameTimelineInfo,
                                              ComposerState& composerState,
                                              int64_t desiredPresentTime, bool isAutoTimestamp,
                                              int64_t postTime, uint32_t permissions) {
    layer_state_t& s = composerState.state;
    s.sanitize(permissions);
//省略
    const uint64_t what = s.what;
     sp<Layer> layer = nullptr;
     //这里会使用layer_state_t的surface即代表Layer的binder对象,把Layer找出
    if (s.surface) {
        layer = fromHandle(s.surface).promote();
    } 
//可以看出这里会获取layer_state_t的what看看是否是否哪个部分有变化,有变化就直接把变化数据设置到Layer中
    if (what & layer_state_t::eSizeChanged) {
        if (layer->setSize(s.w, s.h)) {
            flags |= eTraversalNeeded;
        }
    }
    if (what & layer_state_t::eAlphaChanged) {
        if (layer->setAlpha(s.alpha))
            flags |= eTraversalNeeded;
    }
    if (what & layer_state_t::eColorChanged) {
        if (layer->setColor(s.color))
            flags |= eTraversalNeeded;
    }
    if (what & layer_state_t::eColorTransformChanged) {
        if (layer->setColorTransform(s.colorTransform)) {
            flags |= eTraversalNeeded;
        }
    }
    if (what & layer_state_t::eBackgroundColorChanged) {
        if (layer->setBackgroundColor(s.color, s.bgColorAlpha, s.bgColorDataspace)) {
            flags |= eTraversalNeeded;
        }
    }
    if (what & layer_state_t::eMatrixChanged) {
        if (layer->setMatrix(s.matrix)) flags |= eTraversalNeeded;
    }
    if (what & layer_state_t::eTransparentRegionChanged) {
        if (layer->setTransparentRegionHint(s.transparentRegion))
            flags |= eTraversalNeeded;
    }
    if (what & layer_state_t::eFlagsChanged) {
        if (layer->setFlags(s.flags, s.mask)) flags |= eTraversalNeeded;
    }
    if (what & layer_state_t::eCornerRadiusChanged) {
        if (layer->setCornerRadius(s.cornerRadius))
            flags |= eTraversalNeeded;
    }
//省略
    return flags;
}

本文章对应视频手把手教你学framework:
hal+perfetto+surfaceflinger
https://mp.weixin.qq.com/s/LbVLnu1udqExHVKxd74ILg
surfacecontrol.transaction,surfaceflinger,android,车载系统,SurfaceFlinger,SurfaceControl,Transaction,aosp,framework开发

私聊作者+v(androidframework007)

七件套专题:surfacecontrol.transaction,surfaceflinger,android,车载系统,SurfaceFlinger,SurfaceControl,Transaction,aosp,framework开发
点击这里 https://mp.weixin.qq.com/s/Qv8zjgQ0CkalKmvi8tMGaw

视频:https://www.bilibili.com/video/BV1wc41117L4/文章来源地址https://www.toymoban.com/news/detail-821999.html

到了这里,关于SurfaceControl之Transaction事物深入剖析-android framework实战开发的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SurfaceControl.screenshot()用法 | SurfaceControl.screenshot()使用后返回null的解决方案

    SurfaceControl.screenshot() 是系统的截屏方法,属于系统API,对用户不开放,因此要使用的话需要系统的签名( platform.keystore 文件)才能调用到。 在高版本的android上(例如 android 11 ),如果没有系统签名,即使用反射也会报找不到方法的异常,但是有系统签名的话,直接调用就行。 网

    2024年02月10日
    浏览(75)
  • 深入探索 Django Rest Framework

    这篇文章会详细介绍Django REST Framework的核心组成部分,包括Serializers、ViewSets、Routers、权限和认证系统以及测试和调试工具。文章从基础开始,逐步深入,旨在帮助读者掌握使用Django REST Framework构建复杂API的技能。 Django REST框架,通常简称为DRF,是一个强大而灵活的Web API工具

    2024年02月15日
    浏览(41)
  • 深入剖析MyBatis缓存机制

    第1章:引言 大家好,我是小黑。今天我们要聊的是MyBatis的缓存机制。作为Java开发中经常使用的持久层框架,MyBatis以其灵活性和简便性而广受欢迎。但你知道吗,很多时候,正是因为这些特点,我们需要更深入地理解它的内部工作原理,尤其是缓存机制。这不仅能帮助我们

    2024年01月21日
    浏览(45)
  • JumpServer rce深入剖析

    JumpServer v2.6.2 JumpServer v2.5.4 JumpServer v2.4.5 JumpServer = v1.5.9 修改了一处代码: Git History 增加了一处鉴权 官方修复建议。关闭以下两个接口访问 /api/v1/authentication/connection-token /api/v1/users/connection-token/ 漏洞存在的位置在于“资产管理-资产列表-测试资产可连接性/更新硬件信息”功

    2024年02月07日
    浏览(43)
  • 深入剖析HTTP/3协议

    自 2017 年起,HTTP/3 协议已发布了 29 个 Draft,推出在即,Chrome、Nginx 等软件都在跟进实现最新的草案。那它带来了哪些变革呢?我们结合 HTTP/2 协议看一下。 2015 年,HTTP/2 协议正式推出后,已经有接近一半的互联网站点在使用它: HTTP/2 协议虽然大幅提升了 HTTP/1.1 的性能,然

    2024年02月20日
    浏览(37)
  • Diffusion Model 深入剖析

    最近AI生成艺术领域非常火热,从 Midjourney 到 Stable Diffusion,不管你是绘画高手还是艺术小白,只要输入想要绘制内容的描述或者基础图像,就可以生成富有艺术感的画作! 这些风格各异、以假乱真的AI生成图像背后,离不开 Diffusion Model 。之前文章《Stable Diffusion原理详解》中

    2024年02月07日
    浏览(36)
  • 深入剖析Linux——进程信号

    致前行的人:                 要努力,但不着急,繁花锦簇,硕果累累都需要过程! 目录 1.信号概念 1.1生活角度的信号 2. 技术应用角度的信号 3.Linux操作系统中查看信号 4.常用信号发送 4.1通过键盘发送信号 4.2调用系统函数发送信号 4.3硬件异常产生信号 4.4软件条件产生信

    2024年02月01日
    浏览(47)
  • SpringBoot 原理深入及源码剖析

    SpringBoot 依赖管理 SpringBoot 项目间接继承 spring-boot-dependencies,该文件对常用技术框架进行了统一版本管理,所以在SpringBoot 项目 pom.xml 引入spring-boot-dependencies管理的依赖文件不需要标注依赖文件版本号。引入 starter 就可以实现对应场景开发,而不需要额外导入相关依赖文件。

    2024年02月02日
    浏览(78)
  • 深入剖析 Git 对象底层原理

    在我们日常使用 Git 时,通常的操作是: 在写完一段代码后,执行 git add 命令,将这段代码添加到暂存区中 然后再执行 git commit 和 git push 命令,将 本地 Git 版本库中的提交同步到服务器中的版本库中 Git 在中间做了什么,它如何存储不同的文件和内容,以及如何区分不同分支

    2024年01月20日
    浏览(47)
  • 9张图深入剖析ConcurrentHashMap

    在日常的开发中,我们经常使用key-value键值对的HashMap,其使用哈希表实现,用空间换取时间,提升查询性能 但在多线程的并发场景中,HashMap并不是线程安全的 如果想使用线程安全的,可以使用ConcurrentHashMap、HashTable、Collections.synchronizedMap等 但由于后面二者使用synchronized的粒

    2024年02月08日
    浏览(23)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包