Shell teardown is synchronous. The shell was attempting to destroy components on a quitting message loop. The message loop implementation was executing such tasks on the calling thread which the shell does not consider thread safe.
The thread on which the runner services `CreateApplication` calls is now called `io.flutter.runner.<aot|jit>`. Each application will launch four threads named `<application_name>.<platform|ui|io|gpu>`.
`fx shell ps -T` is an easy way to tell which runners are hosting which applications.
The mobile shells all use the same isolate snapshot. This is also the snapshot used by the service isolate. This works towards a world where the isolate snapshot is no longer a member variable of the DartVM instance. Instead, all snapshots must be specified in the run configuration. For now, the new `Shell::Create` overload will only be used by Fuchsia till I refactor `dart_vm.cc`.
There are no API updates to the mobile shells.
If a line is right justified, then remove any trailing whitespace from the
text range given to Minikin. Right justification shifts the line's glyphs
by the layout advance computed by Minikin, and this advance should exclude
whitespace so that the last visible character will be flush with the right
margin.
See https://github.com/flutter/flutter/issues/16333