ViewRoot: More surgically fix child-life time.
A more targeted version of "ViewRootImpl: Fix child lifetime". In this version we avoid hijacking the window visibility callback and introduce a new path. Our contract has been that at any time after returning from onStop, the WindowManager may destroy the clients Surface. We see in setWindowStopped, we set the stopped state on the hardware renderer in order to prevent further use of the Surface. However there is nothing synchronously dispatching this change to child views and so SurfaceView is not necessarily informed to release it's Surface in time. Typically SurfaceView will be informed through the onWindowVisibilityChanged callback. The signal producing this is emitted from SystemServer prior to onStop but has to pass through the clients handler thread. It seems this has always been broken, and we have always had intermittent reports of EGL_BAD_ALLOC scenarios. I speculate that elevation of WindowManager scheduling during app close scenarios is perhaps making this more severe, as it seems to ensure the WindowManger will win the race to destroy the Surface before the client handler thread process onWindowVisibilityChanged (unless the FIFO timeout is surpassed). Test: Put Chrome in PiP. Turn screen off. No Crash! Bug: 36561071 Change-Id: I9233ba8151c7f577b1d1044afc0c2ac3a65be4b4
Loading
Please register or sign in to comment