如何修复 Android Cannot get a dirty matrix 错误?

How to fix Android Cannot get a dirty matrix error?

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

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 并检查它,如果为真则崩溃;

许多 运行 在主线程上的 API,如 View#setScaleX/setScaleY/setAlpha 会将变量 'mPrimitiveFields.mMatrixOrPivotDirty' 设置为 true

所以如果'View#getLocationOnScreen or 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

View#getLocationOnScreen 或 View#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;
    }