Status Update
Comments
an...@google.com <an...@google.com> #2
1. Have you saw crash in real device or only in simulators?
2. Do you use dynamic feature for language ID?
sh...@google.com <sh...@google.com>
sh...@google.com <sh...@google.com> #3
Tested on Android 12 Emulator with custom executor, but cannot repro this issue.
ap...@google.com <ap...@google.com> #4
-
Second crash in the description is from a real device. Experienced it myself on two different Xiaomi phones, plus lots of crashes from users in the Google Play console.
-
Dynamic features are not used in the application.
As a wild guess, I have downgraded build tools from 31.0.0 to 30.0.3, compileSdk from 31 to 30, and moved all work with Language ID to the service in a separate process (just to be sure that crash can kill secondary process instead of main). This combination is in beta for 2 days by now and I don't see any SIGSEGV crashes.
ap...@google.com <ap...@google.com> #5
Hmm, I feel the crash might be something related to separate/secondary process.
I also changed compileSdk and targetSDK to 31 but still cannot repro this issue.
Description
Basically what happens is when you have some postponed loading like asynchronously loading the image inside an item of AdapterList and you scroll sometimes it crashes and you there is no workaround.
It is not stable reproducible but I come up with a simple repro app(and you can see the logs here as well):
What happens as I understand:
In PointerInputEventProcessor you first collect all PointerInputFilters which were hit(for example in our case is and AdapterList itself and the clickable item inside it)
Then inside AdapterList onDrag callback we synchronously subcompose which means that the AdapterList's item could recompose and apply a new modifier(for example update the background color).
And then we execute dispatchChanges on a modifier which was already detached.
We just discussed it during the sync, but seems like the simplest workaround is to add inside Node.dispatchChanges() something like
if (!pointerInputFilter.isAttached) {
return false
}