bytedance / scene

Android Single Activity Framework compatible with Fragment.
Apache License 2.0
2.08k stars 199 forks source link

Software rendering doesn't support hardware bitmaps #34

Closed chachako closed 4 years ago

chachako commented 4 years ago

一个比较奇怪的 Bug,第一次 push "BlurScene" 时从这个 Scene 的 onViewCreated 中执行 activity.window.decorView.draw(canvas) 没有出现任何问题,但当我 pop 掉这个 "BlurScene" 再重新 push 后就崩溃了

qii commented 4 years ago

有详细点的崩溃栈吗

chachako commented 4 years ago

有详细点的崩溃栈吗

java.lang.IllegalArgumentException: Software rendering doesn't support hardware bitmaps
    at android.graphics.BaseCanvas.onHwBitmapInSwMode(BaseCanvas.java:632)
    at android.graphics.BaseCanvas.throwIfHwBitmapInSwMode(BaseCanvas.java:639)
    at android.graphics.BaseCanvas.throwIfCannotDraw(BaseCanvas.java:73)
    at android.graphics.BaseCanvas.drawBitmap(BaseCanvas.java:131)
    at android.graphics.Canvas.drawBitmap(Canvas.java:1588)
    at android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:548)
    at android.widget.ImageView.onDraw(ImageView.java:1442)
    at android.view.View.draw(View.java:21594)
    at android.view.View.draw(View.java:21468)
    at android.view.ViewGroup.drawChild(ViewGroup.java:4413)
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4174)
    at android.view.View.draw(View.java:21466)
    at android.view.ViewGroup.drawChild(ViewGroup.java:4413)
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4174)
    at android.view.View.draw(View.java:21466)
    at android.view.ViewGroup.drawChild(ViewGroup.java:4413)
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4174)
    at android.view.View.buildDrawingCacheImpl(View.java:20862)
    at android.view.View.buildDrawingCache(View.java:20728)
    at android.view.View.draw(View.java:21318)
    at android.view.ViewGroup.drawChild(ViewGroup.java:4413)
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4174)
    at android.view.View.draw(View.java:21466)
    at android.view.ViewGroup.drawChild(ViewGroup.java:4413)
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4174)
    at android.view.View.draw(View.java:21466)
    at android.view.ViewGroup.drawChild(ViewGroup.java:4413)
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4174)
    at android.view.View.draw(View.java:21466)
    at android.view.ViewGroup.drawChild(ViewGroup.java:4413)
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4174)
    at android.view.View.draw(View.java:21466)
    at android.view.ViewGroup.drawChild(ViewGroup.java:4413)
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4174)
    at android.view.View.draw(View.java:21466)
    at android.view.ViewGroup.drawChild(ViewGroup.java:4413)
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4174)
    at android.view.View.draw(View.java:21597)
    at com.frostor.BlurViewHelper.prepareNative(BlurViewHelper.kt:162)
    at com.frostor.BlurViewHelper.updateBlur(BlurViewHelper.kt:136)
    at com.frostor.BlurViewHelper$enableBlur$$inlined$doOnPreDraw$1.run(View.kt:399)
    at androidx.core.view.OneShotPreDrawListener.onPreDraw(OneShotPreDrawListener.java:71)
    at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:1088)
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2983)
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1930)
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7988)
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1154)
    at android.view.Choreographer.doCallbacks(Choreographer.java:977)
    at android.view.Choreographer.doFrame(Choreographer.java:893)
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1139)
    at android.os.Handler.handleCallback(Handler.java:883)
    at android.os.Handler.dispatchMessage(Handler.java:100)
    at android.os.Looper.loop(Looper.java:214)
    at android.app.ActivityThread.main(ActivityThread.java:7682)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:516)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)
qii commented 4 years ago

进入页面后,后续是不是从glide啥的加载了 hardware 的 Bitmap 到 ImageView 上,这种 Bitmap 没法绘制到手动创建的 Canvas 上吧

chachako commented 4 years ago

进入页面后,后续是不是从glide啥的加载了 hardware 的 Bitmap 到 ImageView 上,这种 Bitmap 没法绘制到手动创建的 Canvas 上吧

没有...就单单的截图一下activity到画布上

qii commented 4 years ago
at android.widget.ImageView.onDraw(ImageView.java:1442)

能查到这个 ImageView 的 Bitmap 哪里来的吗

chachako commented 4 years ago

进入页面后,后续是不是从glide啥的加载了 hardware 的 Bitmap 到 ImageView 上,这种 Bitmap 没法绘制到手动创建的 Canvas 上吧

感谢,排查完了,确实是 ImageView 的问题,但是是 ParentScene 的,我将上一个 Scene 中列表的所有从 Glide 加载的图片取消掉就不会发生这个错误了。

但是奇怪的是为什么第一次 draw Canvas 不存在问题而从第二次开始就会崩溃呢?

qii commented 4 years ago

这就不晓得了