Android bug——Launcher 0x506导致花屏问题

在Android4.4中,经常出现Launcher或应用花屏、黑屏或字体显示异常,与0x506错误码关联。问题源于hwui中无效的fbo,错误发生在LayerRenderer的prepareDirty函数中。分析表明,创建fbo时正常,使用时失效,导致无效纹理绑定,引发花屏。原因是OpenGL上下文删除后,mHardwareLayer未及时销毁,导致旧fbo再次使用。解决方案是在destroyLayer时,若硬件加速不可用,安全地销毁mHardwareLayer资源。
摘要由CSDN通过智能技术生成

现象描述:

在Android4.4中,概率极高会出现Launcher或者应用整个绘制成花屏、黑屏或者字体绘制成方块等问题,出现花屏问题的时候将会在hwui中打印0x506的错误。

分析:

通过log发现也只有hwui中出现0x506这个错误码,即hwui中当前绘图时使用的fbo是无效的。接着通过分析代码发现当前hwui中使用fbo的地方为LayerRenderer中,在LayerRenderer中使用到fbo的地方也就是当view中需要创建HardwareLayer的时候,将会调用LayerRenderer将view绘制的信息通过fbo保存在纹理中:

status_tLayerRenderer::prepareDirty(float left, float top, float right, float bottom,

        bool opaque) {

    glBindFramebuffer(GL_FRAMEBUFFER,mLayer->getFbo());

    …………

    returnOpenGLRenderer::prepareDirty(dirty.left, dirty.top, dirty.right, dirty.bottom,opaque);

}

 

Layer*LayerRenderer::createLayer(uint32_t width, uint32_t height, bool isOpaque) {

    Caches& caches = Caches::getInstance();

    GLuint fbo = caches.fboCache.get();

    …………

    caches.activeTexture(0);

    Layer* layer = caches.layerCache.get(width,height);

    …………

    layer->setFbo(fbo);

    …………

    GLuint previousFbo;

    glGetIntegerv(GL_FRAMEBUFFER_BINDING,(GLint*) &previousFbo);

 

    glBindFramebuffer(GL_FRAMEBUFFER,layer->getFbo());

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值