如何修复 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;
}
使用软键盘时输出未知错误
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;
}