Fixed
Status Update
Comments
ap...@google.com <ap...@google.com> #2
A couple of questions:
1. Have you saw crash in real device or only in simulators?
2. Do you use dynamic feature for language ID?
1. Have you saw crash in real device or only in simulators?
2. Do you use dynamic feature for language ID?
ch...@google.com <ch...@google.com> #3
Tested on Android 12 Emulator with custom executor, but cannot repro this issue.
na...@google.com <na...@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.
Description
We should look into the various places in the APIs where these surface to ensure that this is the API we want before going to beta.
For example, Cubic is constructed with PointF objects, which it exposes as vals. This is worth considering in several ways:
- Having the points available for inspection is good, but we don't want the data to be changed in the underlying cubics (which is possible since PointF is mutable)
- It might not make sense to even have a public constructor; Cubics are necessary for callers to be able to inspect a Polygon (and maybe render debug information for it). But the object is mostly an implementation detail of this API, so it seems unnecessary to expose the constructor(s).
- We might want to use Float internally, regardless of what is used to construct a Cubic. This might help with both performance/allocations internally and avoiding mutability from the PointFs that callers can see
- If we use Float internally, and opt to avoid public constructors, then we might as well use Floats to construct Cubics as well, to avoid allocating PointF objects just to construct a Cubic
- If PointF is only used as a way to return data from a Cubic to a caller, then we could lazily allocate those objects