Skip to content

Bump to Flutter 3.44.7 (1.4.2), fix Platform.isTvOS in debug builds - #41

Merged
DenisovAV merged 2 commits into
devfrom
chore/flutter-3.44.7
Jul 21, 2026
Merged

Bump to Flutter 3.44.7 (1.4.2), fix Platform.isTvOS in debug builds#41
DenisovAV merged 2 commits into
devfrom
chore/flutter-3.44.7

Conversation

@MAUstaoglu

Copy link
Copy Markdown
Member

Two independent changes, one commit each.


1. Flutter 3.44.7 — no engine rebuild

Nothing in 3.44.7 reaches the tvOS engine, so v1.0.1-flutter3.44.7 is byte-identical to v1.0.1-flutter3.44.6, republished under the new name rather than rebuilt.

What's actually in the range:

3.44.6 → 3.44.7
functional change Android only (FlutterRenderer.java, texture SyncFence lifetime)
engine/src/flutter/DEPS byte-identical (same SHA1)
Dart submodule unchanged
darwin/ · ios/ · impeller/ untouched

The other four commits are CI config and changelog text. The unchanged Dart submodule is what makes this safe — the SDK hash our AOT artifacts embed doesn't move, so gen_snapshot and the patched flutter_patched_sdk stay kernel-compatible. (Patch bumps have needed a rebuild before, when Dart did move.)

Tagged v1.0.1, not v1.0.0: a v1.0.0-flutter3.44.7 would read as though it predates the metallib fix.

Verified rather than assumed — artifacts fetched fresh through precache with the local artifacts/ cache moved aside to force the download path:

AOT/profile, physical Apple TV 4K (26.5)   operatingSystem=tvos  isIOS=true  isTvOS=true
JIT/debug, tvOS 17.5 simulator             clean, zero "Target OS is incompatible"
verify_artifacts.sh                        passed, incl. designated-requirement signing

The 17.5 run is the one that matters: tvOS 26 tolerates a wrong metallib triple and older runtimes don't, so it's the only place the #38 class of bug is visible.


2. Platform.isTvOS now compiles in debug

The README tells apps to distinguish Apple TV with Platform.isTvOS, but that only ever worked in profile/release — a debug build failed with Member not found: 'isTvOS'. Reproduced identically on 1.4.1, so this has been broken since the getter was introduced, and it's unrelated to the version bump.

TvosArtifacts applied the patched-SDK override to precompiled modes only, reasoning that debug resolves platform identity at runtime via the device engine so the compile SDK is irrelevant. That's true for the values — in JIT dart:io comes from the engine's own patched core libraries, which is why operatingSystem and isIOS were already correct in debug. What it misses is that isTvOS is a member the stock SDK doesn't declare at all, and the frontend server type-checks against the compile SDK before any runtime resolution happens.

Debug now uses the same non-product patched SDK as profile. host_debug_unopt already shipped it — verify_artifacts.sh has been asserting that patch is present in it all along; nothing was wiring it up.

Verified, since the old comment's stated worry was disturbing the proven debug path:

debug compile, Platform.isTvOS   builds (was: Member not found)
debug run, tvOS 17.5 simulator   isTvOS=true, isIOS=true, operatingSystem=tvos,
                                 isAndroid/isMacOS unaffected
AOT/profile, physical Apple TV   unchanged
hot reload                       Reloaded 1 of 755 libraries in 190ms
CLI suite                        297 pass; analyze reports no errors/warnings

The two tests asserting debug fell through to stock resolution encoded the old decision and failed — which is what they were for. They now assert the patched SDK, plus a case covering a null mode resolving to the non-product SDK rather than silently picking the product one.

Flutter 3.44.7 contains nothing that reaches the tvOS engine, so the
engine artifacts are republished under the new name rather than rebuilt:
v1.0.1-flutter3.44.7 is byte-identical to v1.0.1-flutter3.44.6.

What is actually in the 3.44.6..3.44.7 range: one functional change,
Android-side (FlutterRenderer.java, texture SyncFence lifetime). DEPS is
byte-identical (same SHA1), the Dart submodule is unchanged, and
darwin/, ios/ and impeller/ are untouched. The remaining four commits
are CI config and changelog text. An unchanged Dart submodule is what
makes this safe — the SDK hash our AOT artifacts embed does not move, so
gen_snapshot and the patched flutter_patched_sdk stay compatible.

Verified rather than assumed, using the artifacts as published and
fetched fresh through precache with the local artifacts/ cache moved
aside to force the download path:

  AOT/profile, physical Apple TV 4K (tvOS 26.5)
    operatingSystem=tvos  isIOS=true  isTvOS=true
    defaultTargetPlatform=TargetPlatform.iOS
  JIT/debug, tvOS 17.5 simulator
    runs clean, zero "Target OS is incompatible"
  verify_artifacts.sh   passed, incl. designated-requirement signing
  CLI suite             297 passed; analyze reports no errors/warnings

The 17.5 run matters because tvOS 26 tolerates a wrong metallib triple
and older runtimes do not — it confirms the issue #38 fix still holds.

Also recorded a pre-existing limitation found while probing: Platform.isTvOS
compiles only in profile/release. Debug compiles against the stock Flutter
SDK, which has no such getter, so an app using it fails to build in debug
with "Member not found: 'isTvOS'". Reproduced identically on 1.4.1, so it
is not introduced here. Platform.operatingSystem == 'tvos' works in every
mode.
The README tells apps to distinguish Apple TV with Platform.isTvOS, but
that only ever worked in profile/release. A debug build failed with
`Member not found: 'isTvOS'`, which reproduces identically on 1.4.1, so
this has been broken since the getter was introduced.

TvosArtifacts pointed the patched flutter_patched_sdk override at
precompiled modes only, reasoning that debug resolves platform identity
at runtime via the device engine so the compile SDK is irrelevant. That
reasoning holds for the *values*: in JIT, dart:io comes from the engine's
own patched core libraries, which is why operatingSystem and isIOS were
already correct in debug. What it misses is that isTvOS is a member the
stock SDK does not declare at all, and the frontend server type-checks
against the compile SDK before any of that runtime resolution happens.

So debug now uses the same non-product patched SDK as profile. The
host_debug_unopt artifact already shipped it — verify_artifacts.sh has
been asserting the isTvOS patch is present in it all along; nothing was
wiring it up.

Verified, since the old comment's worry was disturbing the proven debug
path:

  debug compile, Platform.isTvOS      builds (was: Member not found)
  debug run, tvOS 17.5 simulator      isTvOS=true, isIOS=true,
                                      operatingSystem=tvos,
                                      isAndroid/isMacOS unaffected
  AOT/profile, physical Apple TV 4K   unchanged
  hot reload                          Reloaded 1 of 755 libraries, 190ms
  CLI suite                           297 pass; analyze clean

The two tests asserting debug fell through to stock resolution encoded
the old decision and failed, which is what they were for; they now assert
the patched SDK, plus a case for a null mode resolving to the non-product
SDK rather than silently picking the product one.
@MAUstaoglu
MAUstaoglu requested a review from DenisovAV July 21, 2026 12:56
@DenisovAV
DenisovAV merged commit 4f7af73 into dev Jul 21, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants