From e0936313c83d7e38ff6559e08d19427d3b23bc36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mehmet=20Ali=20Ustao=C4=9Flu?= <41448382+MAUstaoglu@users.noreply.github.com> Date: Sun, 26 Jul 2026 23:12:25 +0200 Subject: [PATCH] Bump to Flutter 3.44.8 (1.4.3) (#44) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 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. --- .github/workflows/release.yml | 13 +++++- .github/workflows/test.yml | 25 ++++++++++- CHANGELOG.md | 79 +++++++++++++++++++++++++++++++++++ README.md | 6 +-- bin/internal/engine.version | 2 +- bin/internal/flutter.version | 2 +- pubspec.yaml | 2 +- 7 files changed, 120 insertions(+), 9 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index bd7971b..b48ff66 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -19,7 +19,12 @@ jobs: FLUTTER_COMMIT=$(cat bin/internal/flutter.version | tr -d '[:space:]') git clone --depth=1 https://github.com/flutter/flutter.git cd flutter - git fetch --depth=1 origin "$FLUTTER_COMMIT" + # --tags is required so `git describe --tags` can resolve the SDK + # version. Without it the checkout reports 0.0.0-unknown, which + # `dart test` does not care about but `flutter test` does: it runs + # pub resolution, and any package with a `flutter:` SDK constraint + # fails version solving. Same reason bin/internal/shared.sh passes it. + git fetch --depth=1 --tags origin "$FLUTTER_COMMIT" git checkout "$FLUTTER_COMMIT" - name: Resolve dependencies @@ -35,6 +40,12 @@ jobs: PUB_OFFLINE: "1" run: flutter/bin/dart test test/ + # Path-scoped to the root suite, so the bundled package's 103 widget + # tests need their own step with the flutter runner. See test.yml. + - name: Run package tests + working-directory: packages/flutter_tvos + run: ../../flutter/bin/flutter test + - name: Run dart analyze run: flutter/bin/dart analyze lib/ diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 9985106..2df9e6a 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -17,7 +17,12 @@ jobs: FLUTTER_COMMIT=$(cat bin/internal/flutter.version | tr -d '[:space:]') git clone --depth=1 https://github.com/flutter/flutter.git cd flutter - git fetch --depth=1 origin "$FLUTTER_COMMIT" + # --tags is required so `git describe --tags` can resolve the SDK + # version. Without it the checkout reports 0.0.0-unknown, which + # `dart test` does not care about but `flutter test` does: it runs + # pub resolution, and any package with a `flutter:` SDK constraint + # fails version solving. Same reason bin/internal/shared.sh passes it. + git fetch --depth=1 --tags origin "$FLUTTER_COMMIT" git checkout "$FLUTTER_COMMIT" # Resolve dependencies before running tests. Without an explicit @@ -40,6 +45,17 @@ jobs: PUB_OFFLINE: "1" run: flutter/bin/dart test test/ + # The step above is path-scoped to the root suite, so the bundled + # package's 103 tests never ran. They are widget tests and need the + # flutter runner rather than `dart test`. Among them is + # 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 precisely what CI should + # be checking on a PR that moves the engine. + - name: Run package tests + working-directory: packages/flutter_tvos + run: ../../flutter/bin/flutter test + analyze: runs-on: macos-latest steps: @@ -50,7 +66,12 @@ jobs: FLUTTER_COMMIT=$(cat bin/internal/flutter.version | tr -d '[:space:]') git clone --depth=1 https://github.com/flutter/flutter.git cd flutter - git fetch --depth=1 origin "$FLUTTER_COMMIT" + # --tags is required so `git describe --tags` can resolve the SDK + # version. Without it the checkout reports 0.0.0-unknown, which + # `dart test` does not care about but `flutter test` does: it runs + # pub resolution, and any package with a `flutter:` SDK constraint + # fails version solving. Same reason bin/internal/shared.sh passes it. + git fetch --depth=1 --tags origin "$FLUTTER_COMMIT" git checkout "$FLUTTER_COMMIT" - name: Resolve dependencies diff --git a/CHANGELOG.md b/CHANGELOG.md index 477d265..32ba835 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,85 @@ All notable changes to flutter-tvos will be documented here. ## [Unreleased] +## [1.4.3] - 2026-07-25 + +### Changed + +- Bumped the pinned Flutter SDK to **3.44.8** (`058e0af2c2b5`). +- Engine artifacts are now `v1.0.1-flutter3.44.8`, rebuilt from source against + the 3.44.8 tree rather than republished. + +The range is quoted from 3.44.6 rather than 3.44.7 because the 3.44.7 artifacts +were republished 3.44.6 binaries, so 3.44.6 is the last version whose engine was +actually compiled. + +Nothing in that range changes tvOS behaviour. `DEPS` is unchanged, so Dart stays +at `d684a576` (a gclient `dart_revision` pin, not a submodule) and the SDK hash +our AOT artifacts embed does not move. The engine-source changes are Android-side +(`AccessibilityBridge.java`, `FlutterRenderer.java`, the Android toolchain GN +file), an ASan-only copy rule in `darwin/ios/BUILD.gn`, a host-architecture fix +for the clang path in `copy_info_plist.py`, plus test- and CI-only files. +`impeller/` is untouched. + +One of those does reach the shipped framework, and it accounts for the size +delta: `copy_info_plist.py` generates the `Info.plist` embedded in +`Flutter.framework`, and in this range its `subprocess.check_output` gained +`text=True`, changing the recorded clang version from a bytes repr to a plain +string. The rebuilt zips therefore differ from 3.44.7 by a small, explained +amount rather than by build noise: + + host_debug_unopt.zip +3 (no framework) + host_release.zip +4 (no framework) + tvos_debug_sim_arm64.zip +546 + tvos_profile_arm64.zip +1191 + tvos_debug_arm64.zip +1193 + tvos_release_arm64.zip +1204 + +The two host zips embed no `Flutter.framework` and moved 3-4 bytes; all four +that do embed one moved 546-1204. + +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 upstream build-graph types this CLI depends on are byte-identical to +3.44.7, so the tvOS overrides are unchanged. Note the relationships differ, and +they carry different risk on a future upgrade: `TvosKernelSnapshot`, +`TvosCopyFlutterBundle` and `TvosAotElfRelease` are true subclasses and inherit +upstream fixes, whereas `TvosDartPluginRegistrantTarget` extends `Target` +directly and *replaces* the stock `DartPluginRegistrantTarget` — a replacement +inherits nothing, so upstream drift there is a behavioural risk rather than a +non-event. `tvosGenSnapshotArgs` similarly mirrors `AOTSnapshotter.build` in +`base/build.dart` (untouched in this range) and belongs on the same +keep-in-sync checklist. + +Verified against the freshly built artifacts, extracted through `precache` +after clearing `engine_artifacts/` so no stale extraction could be reused: + + verify_artifacts.sh all checks pass, including the designated-requirement + origin signature, the on-device JIT RWX fix, and the + platform-identity patch in both host SDKs + dart analyze lib/ 0 errors, 0 warnings (135 infos) + CLI suite 297 passed + JIT/debug, tvOS 17.5 simulator + builds, installs, launches and renders; zero + "Target OS is incompatible" errors; 10/10 FFI symbols + exported; hot reload and hot restart both verified by + asserting the reloaded code actually ran + Apple TV 4K, tvOS 26.5 + debug/JIT (including hot reload over the wireless + tunnel), profile and release: install, launch, render, + 10/10 FFI symbols in each + +Platform identity in all four of those modes: +`Platform.operatingSystem == "tvos"`, `Platform.isIOS`, `Platform.isTvOS` and +the package-level `FlutterTvosPlatform.isTvos` all true, with +`defaultTargetPlatform == 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. + ## [1.4.2] - 2026-07-21 ### Changed diff --git a/README.md b/README.md index b132655..5c75b49 100644 --- a/README.md +++ b/README.md @@ -8,9 +8,9 @@ A Flutter toolchain for building and running Flutter apps on **Apple TV (tvOS)** ## Current version -- flutter-tvos: `1.4.2` -- Flutter SDK: `3.44.7` (`84fc5cbb223bc12f83d65b647ff8a56caf779ffd`) -- tvOS engine artifacts: `v1.0.1-flutter3.44.7` (origin-signed) +- flutter-tvos: `1.4.3` +- Flutter SDK: `3.44.8` (`058e0af2c2b57e369d905a03ac9748b0ebf543c6`) +- tvOS engine artifacts: `v1.0.1-flutter3.44.8` (origin-signed) ## Installation diff --git a/bin/internal/engine.version b/bin/internal/engine.version index e734359..b9d1782 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -v1.0.1-flutter3.44.7 +v1.0.1-flutter3.44.8 diff --git a/bin/internal/flutter.version b/bin/internal/flutter.version index 5cf22c6..4c48fb4 100644 --- a/bin/internal/flutter.version +++ b/bin/internal/flutter.version @@ -1 +1 @@ -84fc5cbb223bc12f83d65b647ff8a56caf779ffd +058e0af2c2b57e369d905a03ac9748b0ebf543c6 diff --git a/pubspec.yaml b/pubspec.yaml index 2a472a3..5cef3f0 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: flutter_tvos description: Flutter CLI tool for building and running Flutter apps on Apple TV (tvOS). A custom embedder wrapping Flutter SDK with tvOS-specific build targets, device management, and plugin support. -version: 1.4.2 +version: 1.4.3 homepage: https://fluttertv.dev repository: https://github.com/fluttertv/flutter-tvos publish_to: "none"