Fixes https://github.com/flutter/flutter/issues/134566.
Prior to this fix, `ShutdownHooks` were run in the private helper
function `_exit()` defined in the `package:flutter_tools/runner.dart`
library. Independent of this, the tool had signal handling logic that
traps SIGINT and SIGTERM. However, these handlers called `exit()` from
`dart:io`, and didn't run these hooks.
This PR moves the `_exit()` private helper to
`package:flutter_tools/src/base/process.dart` and renames it to
`exitWithHooks()`, so that it can be called by the signal handlers in
`package:flutter_tools/src/base/signals.dart`.
Use the pub cache resolved by pub itself.
To add packages to the flutter.zip download they are packaged as tar.gz and added to the pub-cache on first run by using `pub cache preload`.
...and various other minor cleanup:
* Moved "FLUTTER_STORAGE_BASE_URL" into a constant throughout the code. There are other strings that we should do that to but this one was relevant to the code I was changing.
* Fixed the logger's handling of slow warnings. Previously it deleted too much text. Fixed the test for that to actually verify it entirely, too.
* Made the logger delete the slow warning when it's finished.
* Fixed 'Please choose one (To quit, press "q/Q")' message to be the cleaner 'Please choose one (or "q" to quit)'.
* Added a debug toString to ValidationResult for debugging purposes (not used).
* In http_host_validator:
- Shortened constant names to be clearer (e.g. kPubDevHttpHost -> kPubDev).
- Added GitHub as a tested host since when you run `flutter` we hit that immediately.
- Renamed the check "Network resources".
- Updated the `slowWarning` of the check to say which hosts are pending.
- Removed all timeout logic. Timeouts violate our style guide.
- Removed `int.parse(... ?? '10')`; passing a constant to `int.parse` is inefficient.
- Replaced the `_HostValidationResult` class with `String?` for simplicity.
- Improved the error messages to be more detailed.
- Removed all checks that dependened on the stringification of exceptions. That's very brittle.
- Added a warning specifically for HandshakeException that talks about the implications (MITM attacks).
- Replaced exception-message-parsing logic with just calling `Uri.tryParse` and validating the result.
- Replaced a lot of list-filtering logic with just a single for loop to check the results.
- Replaced code that added a constant to a known-empty list with just returning a constant list.
- Revamped the logic for deciding which hosts to check to just use a single chain of if/else blocks instead of getters, lists literals with `if` expressions, `??`, functions, etc spread over multiple places in the code.