如何修复Android无法获得脏矩阵错误?

How to fix Android Cannot get a dirty matrix error?(如何修复Android无法获得脏矩阵错误?)

本文介绍了如何修复Android无法获得脏矩阵错误?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用软键盘时输出未知错误

A/OpenGLRenderer: Cannot get a dirty matrix!
A/libc: Fatal signal 6 (SIGABRT), code -1 (SI_QUEUE) in tid 42843 (Thread-12), pid 15445

为什么会发生这样的错误?你怎么解决它?

推荐答案

不要在工作线程上调用view#getLocationOnScreen或view#getMatrix


View#getLocationOnScreen或View#getMatrix会将变量‘mPrimitiveFields.mMatrixOrPivotDirty’重置为False并进行检查,如果为True,则崩溃;

许多在主线程上运行的API(如View#setScaleX/setScaleY/setAlpha)会将变量‘mPrimitiveFields.mMatrixOrPivotDirty’设置为True

因此,如果‘View#getLocationOnScreen或View#getMatrix’在工作线程上运行,则可能并发修改变量‘mPrimitiveFields.mMatrixOrPivotDirty’并导致崩溃

如果您想要更详细的分析,请访问以下地址: https://www.jianshu.com/p/d6d3bb641198


http://androidxref.com/9.0.0_r3/xref/frameworks/base/core/jni/android_view_RenderNode.cpp http://androidxref.com/9.0.0_r3/xref/frameworks/base/libs/hwui/RenderProperties.h

查看#getLocationOnScreen或查看#getMatrix->; Android_view_RenderNode.cpp#android_view_RenderNode_getTransformMatrix->;

    static void android_view_RenderNode_getTransformMatrix(jlong renderNodePtr, jlong outMatrixPtr) {
        RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
        SkMatrix* outMatrix = reinterpret_cast<SkMatrix*>(outMatrixPtr);

        // call updateMatrix to reset 'mPrimitiveFields.mMatrixOrPivotDirty' to false
        renderNode->mutateStagingProperties().updateMatrix();
        // check 'mPrimitiveFields.mMatrixOrPivotDirty', if true then crash
        const SkMatrix* transformMatrix = renderNode->stagingProperties().getTransformMatrix();

        if (transformMatrix) {
            *outMatrix = *transformMatrix;
        } else {
            outMatrix->setIdentity();
        }
    }

    const SkMatrix* getTransformMatrix() const {
        LOG_ALWAYS_FATAL_IF(mPrimitiveFields.mMatrixOrPivotDirty, "Cannot get a dirty matrix!");
        return mComputedFields.mTransformMatrix;
    }

这篇关于如何修复Android无法获得脏矩阵错误?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本文标题为:如何修复Android无法获得脏矩阵错误?

基础教程推荐