Bump to Flutter 3.44.8 (1.4.3) - #44
Conversation
Engine artifacts are rebuilt from source against the 3.44.8 tree rather than
republished, so v1.0.1-flutter3.44.8 is a genuine rebuild.
Nothing in the 3.44.6..3.44.8 range reaches the tvOS engine. DEPS is untouched,
so the Dart submodule stays at d684a576 and the SDK hash our AOT artifacts
embed does not move. The engine-source changes in the range are Android-side
(AccessibilityBridge.java, the Android toolchain GN file), a host-architecture
fix for the clang path in copy_info_plist.py, and an ASan-only copy rule in
darwin/ios/BUILD.gn — none of which are compiled into a shipped
Flutter.framework. impeller/ is untouched. The rebuilt zips land within ~500
bytes of the 3.44.7 artifacts, which is the expected result.
On the tooling side, 3.44.8 changes UnpackDarwin.thinFramework to run
lipo -verify_arch once per architecture (an Xcode 27 fix). flutter-tvos does
not use UnpackDarwin — it copies the engine framework itself — so nothing
needed mirroring. The four upstream build-graph classes this CLI subclasses
(KernelSnapshot, CopyFlutterBundle, DartPluginRegistrantTarget, AotElfRelease)
are byte-identical to 3.44.7, so the tvOS overrides are unchanged.
Verified against the freshly built artifacts, extracted through precache after
clearing engine_artifacts/ so no stale extraction could be reused:
verify_artifacts.sh all pass, incl. the designated-requirement origin
signature and the on-device JIT RWX fix
dart analyze lib/ 0 errors, 0 warnings (135 infos)
CLI suite 297 passed
tvOS 17.5 simulator debug: launch, hot reload, hot restart, 10/10 FFI
symbols, zero "Target OS is incompatible"
Apple TV 4K, tvOS 26.5
debug/JIT (incl. hot reload over the wireless tunnel),
profile and release: launch + 10/10 FFI symbols, and
os=tvos / isIOS / isTvOS / ffiIsTvOS all true with
target=TargetPlatform.iOS in every mode
The 17.5 run is the one that matters for shaders: tvOS 26 tolerates a wrong
metallib platform triple and older runtimes do not.
Code reviewVerified before commenting: tag The core risk argument holds and I checked it directly: The "Blocked on" note at the end of the description is stale: the artifacts release published at 2026-07-25T10:53:48Z, minutes after this PR opened. Worth striking so a reviewer doesn't hold it. 1. The "~500 bytes" figure is understated by about 2.4x. Measured against the published assets:
One zip of six is near 500 bytes. The same number appears in the engine PR and in the The distribution is worth stating rather than attributing it to build noise, because it is explainable. The two host zips moved 3–4 bytes; all four zips embedding 2. CHANGELOG L27 misdescribes the audit surface.
The list also omits 3. The change enumeration at L15-21 reads as exhaustive but isn't. The range also touches 4. The verification block records less than was actually run. L32-47 lists only the tvOS 17.5 simulator, while the PR body records Apple TV 4K / tvOS 26.5 across debug (including hot reload over the wireless tunnel), profile and release. Both 1.4.1 and 1.4.2 recorded on-device verification, so a reader comparing entries will conclude device testing was skipped for the one release in the series that rebuilds the engine from source. The commit message already has the right text. Coverage gaps this bump makes visible (pre-existing)
Nothing asserts the two pins agree. No test reads Nits
|
DenisovAV
left a comment
There was a problem hiding this comment.
Approving. Pins verified: tag 3.44.8 is exactly 058e0af2c2b57e369d905a03ac9748b0ebf543c6, the previous pin was exactly 3.44.7, and v1.0.1-flutter3.44.8 is published with all six zips _artifactZipNames requires. The no-risk argument holds — DEPS is absent from the 3.44.6...3.44.8 compare and the only flutter_tools/lib/ file in range is targets/darwin.dart, which this repo never touches.
The "Blocked on" note in the description is stale; the artifacts release published minutes after this PR opened.
Non-blocking, from the detailed review above: the "~500 bytes" figure is understated (actual max +1204, and the delta is explainable via copy_info_plist.py), the subclass list needs a correction, and the changelog records less verification than was actually run. Separately worth doing soon: packages/flutter_tvos/test/ never runs in CI, which excludes the one test written to catch engine-side drift on exactly this kind of bump.
Merge after fluttertv/engine#8, and push the v3.44.8-tvos.1.4.3 tag before fluttertv/landing#6 goes out.
Addresses review on #44. CI ran `dart test test/`, path-scoped to the root suite, so the 103 tests in packages/flutter_tvos/test/ never ran in either workflow. They are widget tests and need the flutter runner rather than `dart test`. That set includes rcu/protocol_drift_test.dart, which pins the RCU wire protocol against FlutterTvRemoteProtocol.h — the test most likely to catch engine-side drift on a version bump, and so exactly what should be running on a PR that moves the engine. All 103 pass locally. Changelog corrections: - The "~500 bytes" figure was understated. It came from comparing one zip and generalising; the real range is +3 to +1204. The entry now carries the per-asset table and the explanation, which is a stronger argument than an unexplained delta: copy_info_plist.py generates the Info.plist embedded in Flutter.framework and gained `text=True` in this range, changing the recorded clang version from a bytes repr to a plain string. The two zips with no embedded framework moved 3-4 bytes; all four with one moved 546-1204. This also corrects the previous claim that none of the changed engine files reach a shipped Flutter.framework — this one does. - DartPluginRegistrantTarget was listed among classes this CLI subclasses. TvosDartPluginRegistrantTarget extends Target directly and replaces the stock target. That matters in the opposite direction from what the entry implied: a replacement inherits no upstream fixes, so drift is a behavioural risk rather than a non-event. tvosGenSnapshotArgs is named for the same reason. - The change enumeration read as exhaustive but omitted FlutterRenderer.java and the test/CI-only files. - The verification block recorded only the tvOS 17.5 simulator, while device testing across debug, profile and release had actually been run. Both 1.4.1 and 1.4.2 record on-device verification, so omitting it here read as though it had been skipped for the one release in the series that rebuilds the engine from source. - isTvos/isTvOS were collapsed into one line; they are different getters (dart:io Platform.isTvOS versus the package's FlutterTvosPlatform.isTvos) and both are checked. - Noted that the range is quoted from 3.44.6 because the 3.44.7 artifacts were republished 3.44.6 binaries, and that Dart is a gclient revision pin rather than a submodule.
The package-test step added in the previous commit failed CI with: The current Flutter SDK version is 0.0.0-unknown. Because flutter_tvos requires Flutter SDK version >=3.19.0, version solving failed. Both workflows clone Flutter and fetch the pinned commit without --tags, so `git describe --tags` cannot name a version. `dart test` never noticed because it does no pub resolution against a `flutter:` SDK constraint; `flutter test` does, and any package declaring one fails version solving. bin/internal/shared.sh already passes --tags for this exact reason and says so in a comment. CI now matches. Passed locally from a clean state (.dart_tool removed, so `flutter test` does its own implicit pub get): 103 tests.
* Bump to Flutter 3.44.8 (1.4.3)
Engine artifacts are rebuilt from source against the 3.44.8 tree rather than
republished, so v1.0.1-flutter3.44.8 is a genuine rebuild.
Nothing in the 3.44.6..3.44.8 range reaches the tvOS engine. DEPS is untouched,
so the Dart submodule stays at d684a576 and the SDK hash our AOT artifacts
embed does not move. The engine-source changes in the range are Android-side
(AccessibilityBridge.java, the Android toolchain GN file), a host-architecture
fix for the clang path in copy_info_plist.py, and an ASan-only copy rule in
darwin/ios/BUILD.gn — none of which are compiled into a shipped
Flutter.framework. impeller/ is untouched. The rebuilt zips land within ~500
bytes of the 3.44.7 artifacts, which is the expected result.
On the tooling side, 3.44.8 changes UnpackDarwin.thinFramework to run
lipo -verify_arch once per architecture (an Xcode 27 fix). flutter-tvos does
not use UnpackDarwin — it copies the engine framework itself — so nothing
needed mirroring. The four upstream build-graph classes this CLI subclasses
(KernelSnapshot, CopyFlutterBundle, DartPluginRegistrantTarget, AotElfRelease)
are byte-identical to 3.44.7, so the tvOS overrides are unchanged.
Verified against the freshly built artifacts, extracted through precache after
clearing engine_artifacts/ so no stale extraction could be reused:
verify_artifacts.sh all pass, incl. the designated-requirement origin
signature and the on-device JIT RWX fix
dart analyze lib/ 0 errors, 0 warnings (135 infos)
CLI suite 297 passed
tvOS 17.5 simulator debug: launch, hot reload, hot restart, 10/10 FFI
symbols, zero "Target OS is incompatible"
Apple TV 4K, tvOS 26.5
debug/JIT (incl. hot reload over the wireless tunnel),
profile and release: launch + 10/10 FFI symbols, and
os=tvos / isIOS / isTvOS / ffiIsTvOS all true with
target=TargetPlatform.iOS in every mode
The 17.5 run is the one that matters for shaders: tvOS 26 tolerates a wrong
metallib platform triple and older runtimes do not.
* Run the package suite in CI; correct the 1.4.3 changelog entry
Addresses review on #44.
CI ran `dart test test/`, path-scoped to the root suite, so the 103 tests in
packages/flutter_tvos/test/ never ran in either workflow. They are widget
tests and need the flutter runner rather than `dart test`. That set includes
rcu/protocol_drift_test.dart, which pins the RCU wire protocol against
FlutterTvRemoteProtocol.h — the test most likely to catch engine-side drift on
a version bump, and so exactly what should be running on a PR that moves the
engine. All 103 pass locally.
Changelog corrections:
- The "~500 bytes" figure was understated. It came from comparing one zip and
generalising; the real range is +3 to +1204. The entry now carries the
per-asset table and the explanation, which is a stronger argument than an
unexplained delta: copy_info_plist.py generates the Info.plist embedded in
Flutter.framework and gained `text=True` in this range, changing the
recorded clang version from a bytes repr to a plain string. The two zips
with no embedded framework moved 3-4 bytes; all four with one moved
546-1204. This also corrects the previous claim that none of the changed
engine files reach a shipped Flutter.framework — this one does.
- DartPluginRegistrantTarget was listed among classes this CLI subclasses.
TvosDartPluginRegistrantTarget extends Target directly and replaces the
stock target. That matters in the opposite direction from what the entry
implied: a replacement inherits no upstream fixes, so drift is a behavioural
risk rather than a non-event. tvosGenSnapshotArgs is named for the same
reason.
- The change enumeration read as exhaustive but omitted FlutterRenderer.java
and the test/CI-only files.
- The verification block recorded only the tvOS 17.5 simulator, while device
testing across debug, profile and release had actually been run. Both 1.4.1
and 1.4.2 record on-device verification, so omitting it here read as though
it had been skipped for the one release in the series that rebuilds the
engine from source.
- isTvos/isTvOS were collapsed into one line; they are different getters
(dart:io Platform.isTvOS versus the package's FlutterTvosPlatform.isTvos)
and both are checked.
- Noted that the range is quoted from 3.44.6 because the 3.44.7 artifacts were
republished 3.44.6 binaries, and that Dart is a gclient revision pin rather
than a submodule.
* Fetch Flutter tags in CI so `flutter test` can resolve the SDK version
The package-test step added in the previous commit failed CI with:
The current Flutter SDK version is 0.0.0-unknown.
Because flutter_tvos requires Flutter SDK version >=3.19.0, version
solving failed.
Both workflows clone Flutter and fetch the pinned commit without --tags, so
`git describe --tags` cannot name a version. `dart test` never noticed
because it does no pub resolution against a `flutter:` SDK constraint;
`flutter test` does, and any package declaring one fails version solving.
bin/internal/shared.sh already passes --tags for this exact reason and says
so in a comment. CI now matches.
Passed locally from a clean state (.dart_tool removed, so `flutter test`
does its own implicit pub get): 103 tests.
Pins Flutter 3.44.8 (
058e0af2c2b5) and moves to engine artifactsv1.0.1-flutter3.44.8, rebuilt from source rather than republished.The range below is quoted from 3.44.6 because the 3.44.7 artifacts were republished 3.44.6 binaries — 3.44.6 is the last version whose engine was actually compiled.
Why this is a small change
DEPSis untouched, so Dart stays atd684a576(a gclientdart_revisionpin, not a submodule) and the SDK hash our AOT artifacts embed does not move — no SDK-hash gate.AccessibilityBridge.java,FlutterRenderer.java, the Android toolchain GN file), an ASan-only copy rule indarwin/ios/BUILD.gn, a host-architecture fix incopy_info_plist.py, plus test- and CI-only files.impeller/is untouched.Correction: the size delta, and what causes it
The original description said "within ~500 bytes". That was measured from one asset and generalised. Actual range is +3 to +1204:
host_debug_unopt.ziphost_release.ziptvos_debug_sim_arm64.ziptvos_profile_arm64.ziptvos_debug_arm64.ziptvos_release_arm64.zipIt is explained rather than build noise, which makes it a stronger argument.
copy_info_plist.pygenerates theInfo.plistembedded inFlutter.frameworkand gainedtext=Trueon itssubprocess.check_outputin this range, changing the recorded clang version from a bytes repr to a plain string. The two assets embedding no framework moved 3-4 bytes; all four embedding one moved 546-1204. That also corrects the original claim that none of the changed files reach a shippedFlutter.framework— this one does, via theInfo.plist. No compiled code changed.Tooling changes that did not need mirroring
3.44.8 changes
UnpackDarwin.thinFrameworkto runlipo -verify_archonce per architecture (an Xcode 27 fix). flutter-tvos never usesUnpackDarwin— it copies the engine framework itself — so there is nothing to mirror.The upstream build-graph types this CLI depends on are byte-identical to 3.44.7. Correcting the original description: the relationships are not uniform, and they carry different risk on a future upgrade.
TvosKernelSnapshot,TvosCopyFlutterBundleandTvosAotElfReleaseare true subclasses and inherit upstream fixes;TvosDartPluginRegistrantTargetextendsTargetdirectly and replaces the stockDartPluginRegistrantTarget, so it inherits nothing and upstream drift there is a behavioural risk rather than a non-event.tvosGenSnapshotArgsmirrorsAOTSnapshotter.buildand belongs on the same checklist.Verification
Against the freshly built artifacts, extracted through
precacheafter clearingengine_artifacts/so no stale extraction could be reused:verify_artifacts.shdart analyze lib/Target OS is incompatibleHot reload and restart are asserted by confirming the reloaded code actually ran, not by trusting the CLI's "Reloaded N libraries" line.
Platform identity in every mode:
Platform.operatingSystem == "tvos",Platform.isIOS,Platform.isTvOSand the package-levelFlutterTvosPlatform.isTvosall true, withdefaultTargetPlatform == TargetPlatform.iOS.The 17.5 run is the one that matters for shaders — tvOS 26 tolerates a wrong metallib platform triple and older runtimes do not.
Follow-up commit from review
CI ran
dart test test/, path-scoped to the root suite, sopackages/flutter_tvos/test/— 103 tests includingrcu/protocol_drift_test.dart, which pins the RCU wire protocol againstFlutterTvRemoteProtocol.h— never ran in either workflow. Now run with the flutter runner in both. That is the test most likely to catch engine-side drift on a bump, so it should be running on precisely this kind of PR.Still open from review, deliberately not in this PR: a version-consistency test asserting
bin/internal/*.version↔ README ↔pubspec.yaml↔ CHANGELOG agree, and the stale3.44.1references indoc/.Depends on fluttertv/engine#8. Release plumbing reminder:
flutter-tvos upgradeis driven by git tags, so 1.4.3 is inert untilv3.44.8-tvos.1.4.3is pushed — that must land before fluttertv/landing#6.