Status Update
Comments
da...@google.com <da...@google.com> #2
1. Have you saw crash in real device or only in simulators?
2. Do you use dynamic feature for language ID?
[Deleted User] <[Deleted User]> #3
Tested on Android 12 Emulator with custom executor, but cannot repro this issue.
da...@google.com <da...@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
Version used: 2.1.0-alpha06
Devices/Android versions reproduced on: Doesn't matter
Using a Single in a Dao makes Room generate a Single.fromCallable. The docs in Single.fromCallable say:
If the {@link Callable} throws an exception, the respective {@link Throwable} is
delivered to the downstream via {@link SingleObserver#onError(Throwable)},
except when the downstream has disposed this {@code Single} source.
In this latter case, the {@code Throwable} is delivered to the global error handler via
{@link RxJavaPlugins#onError(Throwable)} as an {@link io.reactivex.exceptions.UndeliverableException UndeliverableException}.
If we subscribe to a Single and dispose before it delivers the EmptyResultSetException, will cause the exception to be sent to the global error handler, which means it will crash.
I think this could be avoided by using Single.create and checking if the emitter still has observers before trying to emit the error.
Can't provide a sample because this is a timing issue.