Skip to content

[flutter_tools, engine] Add --disable-service-origin-check option to disable VM service origin checks - #5

Closed
bkonyi wants to merge 2939 commits into
masterfrom
disable-vm-origin-checks
Closed

bkonyi wants to merge 2939 commits into
masterfrom
disable-vm-origin-checks

Conversation

@bkonyi

@bkonyi bkonyi commented Jun 29, 2026

Copy link
Copy Markdown
Owner

Introduce a new --disable-service-origin-check flag to both flutter run and flutter test commands to allow connections to the VM service from any origin.

  • Propagate the option through DebuggingOptions to iOS launch arguments, Android (adb shell am start), desktop environments, and flutter_tester.
  • Update the Flutter engine C++ and Java codebases to parse the --disable-service-origin-check switch and forward it to DartServiceIsolate::Startup.
  • Add corresponding unit tests in device_test.dart and run_test.dart to verify flag propagation and serialization.
  • Add integration test verification in disable_service_origin_check_test.dart to verify that origin checks correctly block connections by default and permit connections when the flag is passed.

engine-flutter-autoroll and others added 30 commits June 12, 2026 15:53
flutter/packages@1b56cde...b78ad83

2026-06-12 [email protected] [camera] Fix web
facingMode capability handling (flutter/packages#11728)
2026-06-11 [email protected] Roll Flutter from
c0a1129 to 8bdce07 (13 revisions) (flutter/packages#11885)
2026-06-11 [email protected] [pigeon] make swift enum CaseIterable
(flutter/packages#11702)
2026-06-11 [email protected] Roll Flutter from
66aaa9a to c0a1129 (17 revisions) (flutter/packages#11881)
2026-06-10 [email protected] [ci] Allow mustache_template deps
(flutter/packages#11882)

If this roll has caused a breakage, revert this CL and stop the roller
using the controls here:
https://autoroll.skia.org/r/flutter-packages-flutter-autoroll
Please CC [email protected] on the revert to ensure that a
human
is aware of the problem.

To file a bug in Flutter:
https://github.com/flutter/flutter/issues/new/choose

To report a problem with the AutoRoller itself, please file a bug:
https://issues.skia.org/issues/new?component=1389291&template=1850622

Documentation for the AutoRoller is here:
https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md
…7926)

https://skia.googlesource.com/skia.git/+log/cadbde1ec4b7..8c89bf2b0ee3

2026-06-12
recipe-mega-autoroller@chops-service-accounts.iam.gserviceaccount.com
Roll recipe dependencies (trivial).
2026-06-12 [email protected] Specialize
sk_is_trivially_relocatable for raw_ptr and raw_ref
2026-06-12
recipe-mega-autoroller@chops-service-accounts.iam.gserviceaccount.com
Roll recipe dependencies (trivial).
2026-06-12 [email protected] Roll
vulkan-deps from d3bbae038752 to d8ab95e03469 (6 revisions)
2026-06-12 [email protected] Export SkFontMgr::Request methods
across the DLL boundary

If this roll has caused a breakage, revert this CL and stop the roller
using the controls here:
https://autoroll.skia.org/r/skia-flutter-autoroll
Please CC [email protected],[email protected] on the revert to
ensure that a human
is aware of the problem.

To file a bug in Skia: https://bugs.chromium.org/p/skia/issues/entry
To file a bug in Flutter:
https://github.com/flutter/flutter/issues/new/choose

To report a problem with the AutoRoller itself, please file a bug:
https://issues.skia.org/issues/new?component=1389291&template=1850622

Documentation for the AutoRoller is here:
https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md
…lutter#187876)

Add timeouts to stopApp and uninstallApp

Fixes: flutter#187785

## Pre-launch Checklist

- [X] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [X] I read the [AI contribution guidelines] and understand my
responsibilities, or I am not using AI tools.
- [X] I read the [Tree Hygiene] wiki page, which explains my
responsibilities.
- [X] I read and followed the [Flutter Style Guide], including [Features
we expect every widget to implement].
- [X] I signed the [CLA].
- [X] I listed at least one issue that this PR fixes in the description
above.
- [X] I updated/added relevant documentation (doc comments with `///`).
- [X] I added new tests to check the change I am making, or this PR is
[test-exempt].
- [X] I followed the [breaking change policy] and added [Data Driven
Fixes] where supported.
- [X] All existing and new tests are passing.
…ate (flutter#187218)

This CL addresses potential `std::vector` index out-of-bounds errors in
the Flutter engine's Android native code, detected by libc++ hardening
(go/cc-hardening-assertions). The issues stem from unsafe `&vector[0]`
accesses on potentially empty vectors.

1. **platform_view_android_jni_impl.cc (SetViewportMetrics):** Added
size checks before using `GetIntArrayRegion` on vectors created from JNI
arrays, which can be empty.
2. **platform_view_android_delegate.cc (UpdateSemantics):** Moved buffer
pointer initializations (e.g., `&buffer[0]`) and their usage to be
within `!empty()` checks, preventing access on zero-sized vectors.

These changes ensure safe vector handling, particularly when empty data
is passed via JNI.

See cl/922343981
…#187250)

Fix a critical unit mismatch bug in
"AndroidGradleBuilder._runGradleTask" where
"kMaxRetryTime.inMicroseconds" (10,000,000) was mistakenly used instead
of "inMilliseconds" (10,000) to cap the exponential backoff delay
duration (which is calculated in milliseconds).
This error allowed the backoff delay time to scale up uncapped to 2.77
hours instead of properly capping it at 10 seconds, significantly
hanging failed/unstable builds.

Added a robust unit test using "FakeAsync" to simulate 8 failing build
retries instantaneously, verifying that wait times double correctly
(100ms -> 200ms -> 400ms -> 800ms -> 1600ms -> 3200ms -> 6400ms) and cap
cleanly at exactly 10000ms (10s) on the 8th retry.

Additionally, added a safeguard to cap the exponent in the pow
calculation at 7, preventing potential integer overflow on high retry
counts (when maxRetries is null).

Fixes: flutter#83971

## Pre-launch Checklist

- [X] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [X] I read the [AI contribution guidelines] and understand my
responsibilities, or I am not using AI tools.
- [X] I read the [Tree Hygiene] wiki page, which explains my
responsibilities.
- [X] I read and followed the [Flutter Style Guide], including [Features
we expect every widget to implement].
- [X] I signed the [CLA].
- [X] I listed at least one issue that this PR fixes in the description
above.
- [X] I updated/added relevant documentation (doc comments with `///`).
- [X] I added new tests to check the change I am making, or this PR is
[test-exempt].
- [X] I followed the [breaking change policy] and added [Data Driven
Fixes] where supported.
- [X] All existing and new tests are passing.

---------

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
…s by default (flutter#186080)

Updates the Android Device Testing instructions in the
`integration_test` README to natively support Kotlin-based projects
(which is the default in modern Flutter templates). Retains the
Java-based instructions as a clear fallback for older or legacy
projects.

Includes a complete Kotlin code snippet demonstrating the necessary
usage of JUnit 4 `@Rule` combined with Kotlin's `@JvmField` annotation.

Fixes flutter#62237

## Pre-launch Checklist

- [X] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [X] I read the [AI contribution guidelines] and understand my
responsibilities, or I am not using AI tools.
- [X] I read the [Tree Hygiene] wiki page, which explains my
responsibilities.
- [X] I read and followed the [Flutter Style Guide], including [Features
we expect every widget to implement].
- [X] I signed the [CLA].
- [X] I listed at least one issue that this PR fixes in the description
above.
- [X] I updated/added relevant documentation (doc comments with `///`).
- [X] I added new tests to check the change I am making, or this PR is
[test-exempt].
- [X] I followed the [breaking change policy] and added [Data Driven
Fixes] where supported.
- [X] All existing and new tests are passing.

---------

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
fixes flutter#187738

## Pre-launch Checklist

- [x] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [x] I read the [AI contribution guidelines] and understand my
responsibilities, or I am not using AI tools.
- [x] I read the [Tree Hygiene] wiki page, which explains my
responsibilities.
- [x] I read and followed the [Flutter Style Guide], including [Features
we expect every widget to implement].
- [x] I signed the [CLA].
- [x] I listed at least one issue that this PR fixes in the description
above.
- [x] I updated/added relevant documentation (doc comments with `///`).
- [x] I added new tests to check the change I am making, or this PR is
[test-exempt].
- [x] I followed the [breaking change policy] and added [Data Driven
Fixes] where supported.
- [x] All existing and new tests are passing.

If you need help, consider asking for advice on the #hackers-new channel
on [Discord].

If this change needs to override an active code freeze, provide a
comment explaining why. The code freeze workflow can be overridden by
code reviewers. See pinned issues for any active code freezes with
guidance.

**Note**: The Flutter team is currently trialing the use of [Gemini Code
Assist for
GitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code).
Comments from the `gemini-code-assist` bot should not be taken as
authoritative feedback from the Flutter team. If you find its comments
useful you can update your code accordingly, but if you are unsure or
disagree with the feedback, please feel free to wait for a Flutter team
member's review for guidance on which automated comments should be
addressed.

<!-- Links -->
[Contributor Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview
[AI contribution guidelines]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#ai-contribution-guidelines
[Tree Hygiene]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md
[test-exempt]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#tests
[Flutter Style Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md
[Features we expect every widget to implement]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement
[CLA]: https://cla.developers.google.com/
[flutter/tests]: https://github.com/flutter/tests
[breaking change policy]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes
[Discord]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Chat.md
[Data Driven Fixes]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md
…lutter#186784)

When a widget inside a **modal route** (bottom sheet, dialog, etc.) is
selected in the widget inspector, the on-device overlay (selection box,
layout guide lines, and tooltip) was drawn across the **entire screen**,
including over the scaffold behind the modal. That made inspection
misleading while a modal was open.

This PR scopes inspector overlay behavior to the selected widget’s
**modal route**:

- **`_inspectAt`**: filters hit-test `selection.candidates` to the
active modal route scope (prefers the current route when present;
otherwise uses the smallest-area hit’s route; excludes offstage routes).
- **`_InspectorOverlayLayer`**: skips drawing overlay candidates that do
not share the selected render object’s `ModalRoute`.
- **`InspectorSelection.clearOverlayCandidates()`**: clears stale
candidates when selection is updated via tools (`setSelection`), without
clearing `current` / `currentElement`.

**Before:** selecting a sheet widget could show guide lines over
main-screen widgets behind the sheet.

**After:** overlay candidates and painted guides stay within the modal
route scope. Manual verification: `examples/inspector_overlay_repro`
(optional reviewer aid).

No DevTools changes are required; the overlay is painted in
`widget_inspector.dart`.

Fixes flutter#186782

## Pre-launch Checklist

- [ ] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [ ] I read the [AI contribution guidelines] and understand my
responsibilities, or I am not using AI tools.
- [ ] I read the [Tree Hygiene] wiki page, which explains my
responsibilities.
- [ ] I read and followed the [Flutter Style Guide], including [Features
we expect every widget to implement].
- [ ] I signed the [CLA].
- [x] I listed at least one issue that this PR fixes in the description
above.
- [ ] I updated/added relevant documentation (doc comments with `///`).
- [x] I added new tests to check the change I am making, or this PR is
[test-exempt].
- [ ] I followed the [breaking change policy] and added [Data Driven
Fixes] where supported.
- [ ] All existing and new tests are passing.

If you need help, consider asking for advice on the #hackers-new channel
on [Discord].

If this change needs to override an active code freeze, provide a
comment explaining why. The code freeze workflow can be overridden by
code reviewers. See pinned issues for any active code freezes with
guidance.

**Note**: The Flutter team is currently trialing the use of [Gemini Code
Assist for
GitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code).
Comments from the `gemini-code-assist` bot should not be taken as
authoritative feedback from the Flutter team. If you find its comments
useful you can update your code accordingly, but if you are unsure or
disagree with the feedback, please feel free to wait for a Flutter team
member's review for guidance on which automated comments should be
addressed.

<!-- Links -->
[Contributor Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview
[AI contribution guidelines]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#ai-contribution-guidelines
[Tree Hygiene]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md
[test-exempt]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#tests
[Flutter Style Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md
[Features we expect every widget to implement]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement
[CLA]: https://cla.developers.google.com/
[flutter/tests]: https://github.com/flutter/tests
[breaking change policy]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes
[Discord]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Chat.md
[Data Driven Fixes]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md
Optimize SHA hash calculation of generated APK by using chunked reading
to prevent OutOfMemoryError.

Fixes: flutter#171860.

## Pre-launch Checklist

- [X] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [X] I read the [AI contribution guidelines] and understand my
responsibilities, or I am not using AI tools.
- [X] I read the [Tree Hygiene] wiki page, which explains my
responsibilities.
- [X] I read and followed the [Flutter Style Guide], including [Features
we expect every widget to implement].
- [X] I signed the [CLA].
- [x] I listed at least one issue that this PR fixes in the description
above.
- [X] I updated/added relevant documentation (doc comments with `///`).
- [X] I added new tests to check the change I am making, or this PR is
[test-exempt].
- [X] I followed the [breaking change policy] and added [Data Driven
Fixes] where supported.
- [X] All existing and new tests are passing.

---------

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
…ations (flutter#186031)

Detects if multiple unique adb binaries are installed on the user's PATH
or Android SDK platform-tools. Having multiple adb versions can lead to
conflicting server instances and device detection failures during
development.

This change adds an `OperatingSystemUtils` dependency injection to
`AndroidValidator`, resolves canonical paths using
`resolveSymbolicLinksSync` to avoid duplicate symlink warnings, and
outputs a hint in `flutter doctor` if multiple unique binaries are
found.

Fixes flutter#9709

## Pre-launch Checklist

- [X] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [X] I read the [AI contribution guidelines] and understand my
responsibilities, or I am not using AI tools.
- [X] I read the [Tree Hygiene] wiki page, which explains my
responsibilities.
- [X] I read and followed the [Flutter Style Guide], including [Features
we expect every widget to implement].
- [X] I signed the [CLA].
- [X] I listed at least one issue that this PR fixes in the description
above.
- [X] I updated/added relevant documentation (doc comments with `///`).
- [X] I added new tests to check the change I am making, or this PR is
[test-exempt].
- [X] I followed the [breaking change policy] and added [Data Driven
Fixes] where supported.
- [X] All existing and new tests are passing.
…kends (flutter#179683)

Enables the unit tests that verifies that compute shaders can be
compiled. This unit test was previously only enabled for Metal backends,
however compilation is supported on all backends (provided the ESSL
language version is at least 310), except SKSL.

Closes flutter#179708

## Pre-launch Checklist

- [x] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [x] I read the [Tree Hygiene] wiki page, which explains my
responsibilities.
- [x] I read and followed the [Flutter Style Guide], including [Features
we expect every widget to implement].
- [x] I signed the [CLA].
- [x] I listed at least one issue that this PR fixes in the description
above.
- [ ] I updated/added relevant documentation (doc comments with `///`).
- [ ] I added new tests to check the change I am making, or this PR is
[test-exempt].
- [ ] I followed the [breaking change policy] and added [Data Driven
Fixes] where supported.
- [x] All existing and new tests are passing.

---------

Co-authored-by: gaaclarke <[email protected]>
Fixes flutter#187725, regression was introduced in flutter#187488

`DevFSFileContent.isModifiedAfter` returned `true` whenever the cached
`_fileStat` was `null`, ignoring the time argument entirely. `_fileStat`
is the sync baseline written only by `markClean()` the entries of a
freshly built `AssetBundle` are never marked clean, so `_fileStat` is
always `null` for them and `isModifiedAfter` always reported them as
modified.

## Pre-launch Checklist

- [x] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [x] I read the [AI contribution guidelines] and understand my
responsibilities, or I am not using AI tools.
- [x] I read the [Tree Hygiene] wiki page, which explains my
responsibilities.
- [x] I read and followed the [Flutter Style Guide], including [Features
we expect every widget to implement].
- [x] I signed the [CLA].
- [x] I listed at least one issue that this PR fixes in the description
above.
- [x] I updated/added relevant documentation (doc comments with `///`).
- [x] I added new tests to check the change I am making, or this PR is
[test-exempt].
- [x] I followed the [breaking change policy] and added [Data Driven
Fixes] where supported.
- [x] All existing and new tests are passing.

<!-- Links -->
[Contributor Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview
[AI contribution guidelines]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#ai-contribution-guidelines
[Tree Hygiene]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md
[test-exempt]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#tests
[Flutter Style Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md
[Features we expect every widget to implement]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement
[CLA]: https://cla.developers.google.com/
[flutter/tests]: https://github.com/flutter/tests
[breaking change policy]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes
[Discord]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Chat.md
[Data Driven Fixes]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md

Co-authored-by: Kevin Moore <[email protected]>
…187932)

Fixes flutter#187931.

`DeviceBufferGLES::Flush()` merges dirty ranges from writer threads (for
example the UI thread writing to a flutter_gpu host-visible buffer)
while `BindAndUploadDataIfNecessary()` consumes the range on a reactor
thread. The upload read the dirty range, called `glBufferSubData`, and
cleared `dirty_range_` afterwards, so any flush landing during the
upload was silently discarded and its data never reached the GPU. Draws
could then read stale vertex/instance/uniform data, and when a buffer's
only flush was lost, uninitialized buffer contents.

This change guards `dirty_range_` with a mutex and takes and clears it
before uploading, so a concurrent flush merges into a fresh range that
the next bind uploads.

Also adds `BufferSubData` to the GLES test mocks and a regression test
that flushes from inside the mocked upload, which fails with the
previous ordering.

## Pre-launch Checklist

- [x] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [x] I read the [AI contribution guidelines] and understand my
responsibilities, or I am not using AI tools.
- [x] I read the [Tree Hygiene] wiki page, which explains my
responsibilities.
- [x] I read and followed the [Flutter Style Guide], including [Features
we expect every widget to implement].
- [x] I signed the [CLA].
- [x] I listed at least one issue that this PR fixes in the description
above.
- [x] I updated/added relevant documentation (doc comments with `///`).
- [x] I added new tests to check the change I am making, or this PR is
[test-exempt].
- [x] I followed the [breaking change policy] and added [Data Driven
Fixes] where supported.
- [x] All existing and new tests are passing.

<!-- Links -->
[Contributor Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview
[AI contribution guidelines]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#ai-contribution-guidelines
[Tree Hygiene]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md
[test-exempt]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#tests
[Flutter Style Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md
[Features we expect every widget to implement]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement
[CLA]: https://cla.developers.google.com/
[breaking change policy]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes
[Data Driven Fixes]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md
…#187542)

## Pre-launch Checklist

- [ ] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [ ] I read the [AI contribution guidelines] and understand my
responsibilities, or I am not using AI tools.
- [ ] I read the [Tree Hygiene] wiki page, which explains my
responsibilities.
- [ ] I read and followed the [Flutter Style Guide], including [Features
we expect every widget to implement].
- [ ] I signed the [CLA].
- [ ] I listed at least one issue that this PR fixes in the description
above.
- [ ] I updated/added relevant documentation (doc comments with `///`).
- [ ] I added new tests to check the change I am making, or this PR is
[test-exempt].
- [ ] I followed the [breaking change policy] and added [Data Driven
Fixes] where supported.
- [ ] All existing and new tests are passing.

If you need help, consider asking for advice on the #hackers-new channel
on [Discord].

If this change needs to override an active code freeze, provide a
comment explaining why. The code freeze workflow can be overridden by
code reviewers. See pinned issues for any active code freezes with
guidance.

**Note**: The Flutter team is currently trialing the use of [Gemini Code
Assist for
GitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code).
Comments from the `gemini-code-assist` bot should not be taken as
authoritative feedback from the Flutter team. If you find its comments
useful you can update your code accordingly, but if you are unsure or
disagree with the feedback, please feel free to wait for a Flutter team
member's review for guidance on which automated comments should be
addressed.

<!-- Links -->
[Contributor Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview
[AI contribution guidelines]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#ai-contribution-guidelines
[Tree Hygiene]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md
[test-exempt]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#tests
[Flutter Style Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md
[Features we expect every widget to implement]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement
[CLA]: https://cla.developers.google.com/
[flutter/tests]: https://github.com/flutter/tests
[breaking change policy]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes
[Discord]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Chat.md
[Data Driven Fixes]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md
)

Fixes flutter#187357

Adds a Flutter GPU surface API for rendering into a presentable color
texture and drawing the latest presented image through Flutter. The
surface owns the backing texture pool, tracks acquired frames, keeps the
current image out of reuse, and waits for producer command buffer
completion before a presented texture can be reused.

The API is shaped as a small family so later destinations (a Flutter
canvas, and eventually the window swapchain) can share one per-frame
contract. `GpuSurface` and `GpuSurfaceFrame` are the
destination-agnostic base types. This PR ships the first concrete
destination, `GpuImageSurface`, which Flutter draws as a `ui.Image`.

Two parts of the contract are uniform across all future destinations,
even though the image destination never exercises them.
`acquireNextFrame` is nullable, because a window swapchain can skip a
frame. `present` returns a `GpuPresentStatus`, because a window
swapchain can report that it needs reconfiguring. For an image surface,
acquire always returns a frame and present always reports success, and
the published image is read from `GpuImageSurface.currentImage`.

The API keeps depth, stencil, MSAA, and intermediate attachments
renderer-owned. `GpuSurfaceFrame.colorTexture` is only the final color
target handed back to Flutter as a `ui.Image`.

A minimal example.

```dart
final surface = gpu.gpuContext.createImageSurface(width, height);
final frame = surface.acquireNextFrame();

final commandBuffer = gpu.gpuContext.createCommandBuffer();
commandBuffer.createRenderPass(
  gpu.RenderTarget.singleColor(
    gpu.ColorAttachment(texture: frame.colorTexture),
  ),
);

// Bind a pipeline, bind resources, and draw.

frame.present(commandBuffer);
commandBuffer.submit();
canvas.drawImageRect(surface.currentImage!, src, dst, paint);
```

Depth and stencil remain normal renderer-owned attachments.

```dart
final frame = surface.acquireNextFrame();
final depthStencil = gpu.gpuContext.createTexture(
  gpu.StorageMode.deviceTransient,
  width,
  height,
  format: gpu.gpuContext.defaultDepthStencilFormat,
  enableRenderTargetUsage: true,
  enableShaderReadUsage: false,
);

final commandBuffer = gpu.gpuContext.createCommandBuffer();
commandBuffer.createRenderPass(
  gpu.RenderTarget.singleColor(
    gpu.ColorAttachment(texture: frame.colorTexture),
    depthStencilAttachment: gpu.DepthStencilAttachment(texture: depthStencil),
  ),
);
```

Tests cover surface acquisition, presentation, current image behavior,
discard, resize, and rendering a clear color into a surface.

## Pre-launch Checklist

- [x] I read the Contributor Guide and followed the process outlined
there for submitting PRs.
- [x] I read the AI contribution guidelines and understand my
responsibilities, or I am not using AI tools.
- [x] I read the Tree Hygiene wiki page, which explains my
responsibilities.
- [x] I read and followed the Flutter Style Guide, including Features we
expect every widget to implement.
- [x] I signed the CLA.
- [x] I listed at least one issue that this PR fixes in the description
above.
- [x] I updated/added relevant documentation (doc comments with `///`).
- [x] I added new tests to check the change I am making, or this PR is
test-exempt.
- [x] I followed the breaking change policy and added Data Driven Fixes
where supported.
- [x] All existing and new tests are passing.
…7968)

https://skia.googlesource.com/skia.git/+log/8c89bf2b0ee3..9ef46390c2d1

2026-06-13 [email protected] Roll
vulkan-deps from d8ab95e03469 to 973a663c1394 (10 revisions)
2026-06-12 [email protected] Fix merge issues with src/base rename
2026-06-12 [email protected] Resolved a Data Race on fStream in
SkTypeface_Mac
2026-06-12 [email protected] Move files from src/base to src/core
2026-06-12 [email protected] [graphite] Use stable collection for
static bindings
2026-06-12 [email protected] Roll ICU to 78.2

If this roll has caused a breakage, revert this CL and stop the roller
using the controls here:
https://autoroll.skia.org/r/skia-flutter-autoroll
Please CC [email protected],[email protected] on the revert to
ensure that a human
is aware of the problem.

To file a bug in Skia: https://bugs.chromium.org/p/skia/issues/entry
To file a bug in Flutter:
https://github.com/flutter/flutter/issues/new/choose

To report a problem with the AutoRoller itself, please file a bug:
https://issues.skia.org/issues/new?component=1389291&template=1850622

Documentation for the AutoRoller is here:
https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md
`ShaderLibrary.fromAsset` now returns a `Future<ShaderLibrary?>` instead
of loading synchronously.

Asset reads can only be asynchronous on some platforms, so a synchronous
loader cannot work everywhere. Making the single loader async gives
every platform one consistent entry point and removes the need for
downstream code to keep a separate async loading path. flutter_gpu is
experimental, so this breaking change is cheap to make now.

On platforms that read synchronously the returned Future still completes
in the same turn, and the library is still cached by asset path, so hot
reload is unaffected.

The engine Dart tests and the renderer fixture harness are updated to
await the loader. The fixture harness drains the microtask queue after
invoking an entry point so the now-async fixtures run to completion.

This is a breaking change to an experimental API, so no `flutter/tests`
migration guide is needed.

## Pre-launch Checklist

- [x] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [x] I read the [AI contribution guidelines] and understand my
responsibilities, or I am not using AI tools.
- [x] I read the [Tree Hygiene] wiki page, which explains my
responsibilities.
- [x] I read and followed the [Flutter Style Guide], including [Features
we expect every widget to implement].
- [x] I signed the [CLA].
- [x] I listed at least one issue that this PR fixes in the description
above.
- [x] I updated/added relevant documentation (doc comments with `///`).
- [x] I added new tests to check the change I am making, or this PR is
[test-exempt].
- [x] I followed the [breaking change policy] and added [Data Driven
Fixes] where supported.
- [x] All existing and new tests are passing.

<!-- Links -->
[Contributor Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview
[AI contribution guidelines]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#ai-contribution-guidelines
[Tree Hygiene]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md
[test-exempt]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#tests
[Flutter Style Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md
[Features we expect every widget to implement]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement
[CLA]: https://cla.developers.google.com/
[breaking change policy]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes
[Data Driven Fixes]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md
…idth/height (flutter#187954)

## What's new?
- Fixed bug where the width and height were swapped in
`FlutterWindowsView::OnFrameGenerated`
- Update the test to NOT use square dimensions so that the error would
be obvious going forward

fixes flutter#187922

## Pre-launch Checklist

- [x] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [x] I read the [AI contribution guidelines] and understand my
responsibilities, or I am not using AI tools.
- [x] I read the [Tree Hygiene] wiki page, which explains my
responsibilities.
- [x] I read and followed the [Flutter Style Guide], including [Features
we expect every widget to implement].
- [x] I signed the [CLA].
- [x] I listed at least one issue that this PR fixes in the description
above.
- [x] I updated/added relevant documentation (doc comments with `///`).
- [x] I added new tests to check the change I am making, or this PR is
[test-exempt].
- [x] I followed the [breaking change policy] and added [Data Driven
Fixes] where supported.
- [x] All existing and new tests are passing.
…187587)

This PR updates the cross imports checker to also check in
`packages/flutter_test` and its subdirectories.

Since `flutter_test` is testing related, I figured it is a good
candidate to be put in the existing check.

To dry run the new check, I fixed one of the violations, along with
updating the relevant test.

Fixes flutter#187528

*If you had to change anything in the [flutter/tests] repo, include a
link to the migration guide as per the [breaking change policy].*

## Pre-launch Checklist

- [x] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [x] I read the [AI contribution guidelines] and understand my
responsibilities, or I am not using AI tools.
- [x] I read the [Tree Hygiene] wiki page, which explains my
responsibilities.
- [x] I read and followed the [Flutter Style Guide], including [Features
we expect every widget to implement].
- [x] I signed the [CLA].
- [x] I listed at least one issue that this PR fixes in the description
above.
- [x] I updated/added relevant documentation (doc comments with `///`).
- [x] I added new tests to check the change I am making, or this PR is
[test-exempt].
- [x] I followed the [breaking change policy] and added [Data Driven
Fixes] where supported.
- [x] All existing and new tests are passing.

If you need help, consider asking for advice on the #hackers-new channel
on [Discord].

If this change needs to override an active code freeze, provide a
comment explaining why. The code freeze workflow can be overridden by
code reviewers. See pinned issues for any active code freezes with
guidance.

**Note**: The Flutter team is currently trialing the use of [Gemini Code
Assist for
GitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code).
Comments from the `gemini-code-assist` bot should not be taken as
authoritative feedback from the Flutter team. If you find its comments
useful you can update your code accordingly, but if you are unsure or
disagree with the feedback, please feel free to wait for a Flutter team
member's review for guidance on which automated comments should be
addressed.

<!-- Links -->
[Contributor Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview
[AI contribution guidelines]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#ai-contribution-guidelines
[Tree Hygiene]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md
[test-exempt]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#tests
[Flutter Style Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md
[Features we expect every widget to implement]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement
[CLA]: https://cla.developers.google.com/
[flutter/tests]: https://github.com/flutter/tests
[breaking change policy]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes
[Discord]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Chat.md
[Data Driven Fixes]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md
The docs no longer lie.

## Pre-launch Checklist

- [x] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [x] I read the [AI contribution guidelines] and understand my
responsibilities, or I am not using AI tools.
- [x] I read the [Tree Hygiene] wiki page, which explains my
responsibilities.
- [x] I read and followed the [Flutter Style Guide], including [Features
we expect every widget to implement].
- [x] I signed the [CLA].
- [x] I listed at least one issue that this PR fixes in the description
above.
- [x] I updated/added relevant documentation (doc comments with `///`).
- [x] I added new tests to check the change I am making, or this PR is
[test-exempt].
- [x] I followed the [breaking change policy] and added [Data Driven
Fixes] where supported.
- [x] All existing and new tests are passing.

If you need help, consider asking for advice on the #hackers-new channel
on [Discord].

If this change needs to override an active code freeze, provide a
comment explaining why. The code freeze workflow can be overridden by
code reviewers. See pinned issues for any active code freezes with
guidance.

**Note**: The Flutter team is currently trialing the use of [Gemini Code
Assist for
GitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code).
Comments from the `gemini-code-assist` bot should not be taken as
authoritative feedback from the Flutter team. If you find its comments
useful you can update your code accordingly, but if you are unsure or
disagree with the feedback, please feel free to wait for a Flutter team
member's review for guidance on which automated comments should be
addressed.

<!-- Links -->
[Contributor Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview
[AI contribution guidelines]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#ai-contribution-guidelines
[Tree Hygiene]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md
[test-exempt]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#tests
[Flutter Style Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md
[Features we expect every widget to implement]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement
[CLA]: https://cla.developers.google.com/
[flutter/tests]: https://github.com/flutter/tests
[breaking change policy]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes
[Discord]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Chat.md
[Data Driven Fixes]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md
Updating CHANGELOGs correctly is one of the most common issues for new
contributors in flutter/packages. The way the docs were written
highlights using the `NEXT` section for version-exempt changes first,
because it's unusual and specific to our repo, but given how common it
is for new contributors to use it when they shouldn't, it seems like
this structure is likely confusing for the people who most need the
docs.

This reworks the whole section to discuss the common case first, then
the uncommon case (now explicitly highlighted as uncommon) second. The
new structure is a little longer, but should hopefully be more clear,
which seems like a tradeoff worth trying given the frequency of issues.

Also includes some minor fixes I noticed while I was in the file
(grammar, inconsistent backticks for file names), and addition of
references to the new flutter/core-packages.
Rusino and others added 20 commits June 29, 2026 13:44
Replace g_object_add_weak_pointer with GWeakRef for tracking the
connected instance, so the helper only disconnects the signal if the
instance is still alive and uses the thread-safe weak reference API.
…utter#188702)

A forced dispose (gtk_widget_destroy) runs even while the raster thread
holds a strong reference on the view and is presenting onto the
compositor. Releasing the compositor in dispose could free it
mid-present, causing a use-after-free. Move the release to finalize so
it lives until the last reference (held transitively by the raster
thread) is dropped.

Fixes flutter#188659
When an FlView holding the text input focus is destroyed, the text input
handler kept a dangling pointer to the view, causing a crash. Clear the
handler's widget in fl_view_dispose and make set_widget null-safe.

Fixes flutter#188657
flutter/packages@c1f7d92...656ccaa

2026-06-26 [email protected] [material_ui]
Enable `icon_button_test` (flutter/packages#12015)
2026-06-26 [email protected] [material_ui]
Enable `list_tile_test` (flutter/packages#12017)
2026-06-26 [email protected] [material_ui]
Enable `calendar_date_picker_test` (flutter/packages#12006)
2026-06-26 [email protected] [material_ui]
Enable `filter_chip_test` (flutter/packages#12013)
2026-06-26 [email protected] [material_ui]
Enable `ink_well_test` (flutter/packages#12016)
2026-06-26 [email protected] [material_ui]
Enable `radio_list_tile_test` (flutter/packages#12019)
2026-06-26 [email protected] [material_ui]
Enable `tabs_test` (flutter/packages#12021)
2026-06-26 [email protected] [material_ui]
Remove widgets import in `bottom_sheet_test.dart`
(flutter/packages#12001)
2026-06-26 [email protected] [material_ui]
Remove widgets import in `dialog_test.dart`, `dropdown_menu_test.dart`
and `sliver_app_bar_test.dart` (flutter/packages#12002)
2026-06-26 [email protected] [various] Check in auto-upgrade to
analysis options (flutter/packages#11969)
2026-06-26 [email protected]
[video_player_platform_interface] Add
preventsDisplaySleepDuringVideoPlayback option (flutter/packages#11546)
2026-06-26 [email protected] [video_player_avfoundation] Add video
track selection support (flutter/packages#11476)

If this roll has caused a breakage, revert this CL and stop the roller
using the controls here:
https://autoroll.skia.org/r/flutter-packages-flutter-autoroll
Please CC [email protected] on the revert to ensure that a
human
is aware of the problem.

To file a bug in Flutter:
https://github.com/flutter/flutter/issues/new/choose

To report a problem with the AutoRoller itself, please file a bug:
https://issues.skia.org/issues/new?component=1389291&template=1850622

Documentation for the AutoRoller is here:
https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md
Update `flutter test --platform=chrome ...` to use the new DDC module
system.

* Updates bootstrap generation in test runner to load the modules needed
to run the test.
* Uses `org-dartlang-app:///` URIs (with three slashes) more
consistently in the DDC logic.

From the PR history flutter#65984 and
the hidden nature of the
`--platform=chrome` CLI flag I am assuming this codepath is unsupported
and only used for
flutter framework tests.

Fixes: flutter#187797
Issue: flutter#142060

## Pre-launch Checklist

- [x] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [x] I read the [AI contribution guidelines] and understand my
responsibilities, or I am not using AI tools.
- [x] I read the [Tree Hygiene] wiki page, which explains my
responsibilities.
- [x] I read and followed the [Flutter Style Guide], including [Features
we expect every widget to implement].
- [x] I signed the [CLA].
- [x] I listed at least one issue that this PR fixes in the description
above.
- [x] I updated/added relevant documentation (doc comments with `///`).
- [x] I added new tests to check the change I am making, or this PR is
[test-exempt].
- [x] I followed the [breaking change policy] and added [Data Driven
Fixes] where supported.
- [x] All existing and new tests are passing.

<!-- Links -->
[Contributor Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview
[AI contribution guidelines]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#ai-contribution-guidelines
[Tree Hygiene]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md
[test-exempt]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#tests
[Flutter Style Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md
[Features we expect every widget to implement]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement
[CLA]: https://cla.developers.google.com/
[flutter/tests]: https://github.com/flutter/tests
[breaking change policy]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes
[Discord]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Chat.md
[Data Driven Fixes]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md
…r#188453)

The Flutter tool crashes with a `FormatException: Missing extension
byte` when helper processes output non-UTF-8 bytes (e.g., on Windows/WSL
under certain non-UTF-8 system locales).

This change updates the process streaming mechanism to use the
fault-tolerant `utf8AllowMalformedLineDecoder` instead of the strict
`utf8LineDecoder`. This replaces invalid bytes with the Unicode
replacement character (`U+FFFD`) instead of throwing a fatal
`FormatException`, preventing crashes while preserving log output.

Fixes flutter#188448
…lutter#187947)

[flutter_tools] Track asset transformer dependencies for hot reload

Allow asset transformers to register additional input dependencies for
hot reload by passing a `--depfile` flag to the transformer subprocess
and parsing the resulting Ninja-format depfile.

Key changes:
- `AssetTransformer` now passes `--depfile` and parses it using
`DepfileService`, returning dependencies in a new
`AssetTransformationResult`.
- `DevelopmentAssetTransformer` tracks these dependencies and provides
them to `DevFS`.
- `DevFS.updateBundle` does not skip transformed assets on startup,
running the transformer to collect dependencies but optimizing by not
uploading them to the device unless requested (e.g., for Web).
- `DevFS.updateBundle` checks if any tracked dependencies are
invalidated and triggers re-transformation.
- `DevFS.update` and `WebDevFS.update` append collected dependencies to
the watched `sources` set.
- `copyAssets` build target collects and adds these dependencies to its
inputs to ensure correct rebuilds.
- Added unit and integration tests to verify the behavior.

Fixes flutter#187051
…r#188387)

This PR addresses the issue where `flutter test` (specifically
integration tests) hangs at teardown on CPU-starved CI runners because
the Dart Development Service (DDS) fails to exit cleanly.

### Changes
* Modify `DartDevelopmentService.shutdown` to return `Future<void>` and
properly await the underlying DDS instance shutdown.
* Update `IntegrationTestTestDevice.kill` to await the DDS shutdown with
a configurable timeout (defaulting to 5 seconds, using
`ddsShutdownTimeout`), preventing permanent hangs if DDS fails to exit.
* Update `ResidentRunner.shutdownDartDevelopmentService` to also be
asynchronous and await all DDS shutdowns with a 10-second safety timeout
to prevent `flutter run` from hanging on exit.
* Propagate the async `shutdown` signature to all callers and mock
implementations in tests.
* Add a regression test in `integration_test_device_test.dart` to verify
that `kill()` completes even if DDS shutdown hangs (times out).

### Verification
* Ran static analysis (`dart analyze`) on the entire
`packages/flutter_tools` package with zero issues.
* Ran all unit tests in `integration_test_device_test.dart` and they
passed (including the new regression test).
* Verified that integration tests on Linux desktop run and exit cleanly.

Fixes flutter#187984
Once flutter/cocoon#5091 has landed, the revert
workflow can just use the `revert` label since cocoon is no longer using
it.
…flutter#187910)

Edited:
This pull request updates the getSimulatorPath method in Xcode to look
for DeviceHub.app instead of Simulator.app when the Xcode version is 27
or higher, and adds comprehensive unit tests for this behavior.
Feedback suggested simplifying this logic by directly checking the
filesystem for DeviceHub.app and falling back to Simulator.app, which
eliminates the need for version parsing and future cleanup.

  ## Tests

  Added four unit tests to `xcode_test.dart` covering:
  - Xcode < 27 returns `Simulator.app`
  - Xcode ≥ 27 returns `DeviceHub.app`
  - Returns `null` when the app directory does not exist
  - Returns `null` when `xcode-select` is unavailable

Fixes flutter#187759
Closes flutter#187759

## Pre-launch Checklist

- [x] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [x] I read the [AI contribution guidelines] and understand my
responsibilities, or I am not using AI tools.
- [x] I read the [Tree Hygiene] wiki page, which explains my
responsibilities.
- [x] I read and followed the [Flutter Style Guide], including [Features
we expect every widget to implement].
- [x] I signed the [CLA].
- [x] I listed at least one issue that this PR fixes in the description
above.
- [x] I updated/added relevant documentation (doc comments with `///`).
- [x] I added new tests to check the change I am making, or this PR is
[test-exempt].
- [x] I followed the [breaking change policy] and added [Data Driven
Fixes] where supported.
- [x] All existing and new tests are passing.

If you need help, consider asking for advice on the #hackers-new channel
on [Discord].

If this change needs to override an active code freeze, provide a
comment explaining why. The code freeze workflow can be overridden by
code reviewers. See pinned issues for any active code freezes with
guidance.

**Note**: The Flutter team is currently trialing the use of [Gemini Code
Assist for
GitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code).
Comments from the `gemini-code-assist` bot should not be taken as
authoritative feedback from the Flutter team. If you find its comments
useful you can update your code accordingly, but if you are unsure or
disagree with the feedback, please feel free to wait for a Flutter team
member's review for guidance on which automated comments should be
addressed.

<!-- Links -->
[Contributor Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview
[AI contribution guidelines]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#ai-contribution-guidelines
[Tree Hygiene]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md
[test-exempt]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#tests
[Flutter Style Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md
[Features we expect every widget to implement]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement
[CLA]: https://cla.developers.google.com/
[flutter/tests]: https://github.com/flutter/tests
[breaking change policy]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes
[Discord]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Chat.md
[Data Driven Fixes]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md

---------

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
… to read goldens from flutter asset URI (flutter#188587)

Cleanup related to flutter#182123

- add support for reading the golden image from flutter asset URI
- use that instead of writing golden to temp
- add widget tests for comparator behavior
- update readme



## Pre-launch Checklist

- [x] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [x] I read the [AI contribution guidelines] and understand my
responsibilities, or I am not using AI tools.
- [x] I read the [Tree Hygiene] wiki page, which explains my
responsibilities.
- [x] I read and followed the [Flutter Style Guide], including [Features
we expect every widget to implement].
- [x] I signed the [CLA].
- [x] I listed at least one issue that this PR fixes in the description
above.
- [x] I updated/added relevant documentation (doc comments with `///`).
- [x] I added new tests to check the change I am making, or this PR is
[test-exempt].
- [x] I followed the [breaking change policy] and added [Data Driven
Fixes] where supported.
- [x] All existing and new tests are passing.

<!-- Links -->
[Contributor Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview
[AI contribution guidelines]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#ai-contribution-guidelines
[Tree Hygiene]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md
[test-exempt]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#tests
[Flutter Style Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md
[Features we expect every widget to implement]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement
[CLA]: https://cla.developers.google.com/
[flutter/tests]: https://github.com/flutter/tests
[breaking change policy]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes
[Discord]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Chat.md
[Data Driven Fixes]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md
<!--
Thanks for filing a pull request!
Reviewers are typically assigned within a week of filing a request.
To learn more about code review, see our documentation on Tree Hygiene:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md
-->

Flutter desktop on Windows currently has no equivalent of the `--flavor`
plumbing that already exists for Android, iOS, and macOS: `flutter build
windows --flavor X` is rejected at the command-parser level, `flutter
run -d windows --flavor X` emits a "flavor only supported on Android,
iOS, macOS" warning, and there is no convention for producing per-flavor
binaries or build directories. This PR wires the existing flavor
infrastructure end-to-end on Windows so that multiple flavors can
coexist in the same project without colliding on disk or in the runner.

### What changes

- **`flutter build windows`** accepts `--flavor` via the shared
`usesFlavorOption()` helper.
- **`WindowsDevice.supportsFlavors`** returns `true`, so `flutter run -d
windows --flavor X` no longer warns and now drives the flavored build
pipeline.
- **Build directory** is namespaced per flavor:
`build/windows/<arch>/<flavor>/runner/<Config>/` (parity with
Android/iOS/macOS). Projects that don't pass `--flavor` keep the legacy
`build/windows/<arch>/runner/<Config>/` layout — no migration required.
- **CMake configure** receives `-DFLUTTER_APP_FLAVOR=<flavor>` so the
generated project can react to the flavor at configure time.
- **Generated CMake template** (`windows.tmpl/CMakeLists.txt.tmpl`)
suffixes `BINARY_NAME` with `-<flavor>` when `FLUTTER_APP_FLAVOR` is
defined. The branch is guarded by `if(DEFINED FLUTTER_APP_FLAVOR AND NOT
FLUTTER_APP_FLAVOR STREQUAL "")`, so existing projects regenerated from
this template behave identically when no flavor is passed.
- **Runner template** (`windows.tmpl/runner/CMakeLists.txt` +
`main.cpp.tmpl`) exposes `FLUTTER_APP_FLAVOR` as a compile-time
preprocessor define via `target_compile_definitions` and uses it to
suffix the Win32 window title, giving projects a one-line entry point
for flavor-aware native behavior without any additional Flutter tool
surface area.
- **Runner resource template** (`windows.tmpl/runner/Runner.rc.tmpl`)
introduces a `FLUTTER_BINARY_NAME` preprocessor define — injected via
the same `target_compile_definitions` mechanism already used for
`FLUTTER_VERSION_*` — and uses it for the `InternalName` and
`OriginalFilename` PE metadata fields, so the version resource stays in
sync with the actual on-disk binary name regardless of flavor.
- **Dart-side** continues to use the existing `appFlavor` getter from
`package:flutter/services.dart`, which reads `FLUTTER_APP_FLAVOR` from
the dart-defines that `toEnvironmentConfig()` already produces. No
framework changes required.

### Design choices

- **Build directory nests flavor above `runner/<Config>`**: the
`runner/<Config>` leaf reflects the Visual Studio multi-config generator
(Debug/Profile/Release are subdirectories chosen at build time, not at
CMake configure time). Inserting the flavor above this segment keeps the
VS solution reusable across modes for a given flavor.
- **`FLUTTER_BINARY_NAME` in `Runner.rc`**: PE metadata correctness
matters because tools (installers, code-signing pipelines, Windows Error
Reporting) read `OriginalFilename` and `InternalName` from the version
resource. Passing the CMake variable as a preprocessor define costs
nothing and avoids any `configure_file` indirection in the template.
- Per-flavor assets, icons, `Package.appxmanifest`, and installer
scripts remain the project's responsibility — this PR intentionally
keeps the tool agnostic and only standardizes the plumbing.

### Tests

- New `test/general.shard/windows/build_windows_flavor_test.dart`
covers:
- `flutter build windows --flavor apple` invokes CMake with
`-DFLUTTER_APP_FLAVOR=apple` and a flavor-namespaced working directory,
and the success log references
`build\windows\x64\apple\runner\Release\`.
- `getCmakeExecutableName` returns the base binary name without a
flavor, and `name-flavor` when a flavor is provided (empty string
treated as no flavor).
- `getWindowsBuildDirectory` returns the legacy path without a flavor
and inserts the flavor segment when one is provided.
- Existing `test/commands.shard/hermetic/build_windows_test.dart`
continues to pass with no changes, confirming the legacy no-flavor path
is unaffected.

### Manual verification

Generated an example project, then ran the full matrix:

```
flutter build windows --flavor apple   # → build\windows\x64\apple\runner\Release\example-apple.exe
flutter build windows --flavor banana  # → build\windows\x64\banana\runner\Release\example-banana.exe
flutter build windows                  # → build\windows\x64\runner\Release\example.exe (unchanged)
flutter run -d windows --flavor apple  # launches, no "unsupported flavor" warning
```

All three builds coexist in `build\windows\x64\` without overwriting
each other, the Win32 window title reflects the flavor, and the Dart UI
reads `appFlavor` correctly at runtime in each binary. PE metadata
(`InternalName`, `OriginalFilename`) matches the actual filename in all
three cases.

### Backward compatibility

- Projects that never pass `--flavor` see no change: same build
directory, same binary name, same generated CMake.
- Existing projects do not need to regenerate `windows/CMakeLists.txt`
to keep working; they only need to regenerate (or hand-patch the
`if(DEFINED FLUTTER_APP_FLAVOR)` branch) to opt into flavor support.

Fixes flutter#98994

## Pre-launch Checklist

- [X] I read the [[Contributor
Guide](https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview)]
and followed the process outlined there for submitting PRs.
- [X] I read the [[AI contribution
guidelines](https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#ai-contribution-guidelines)]
and understand my responsibilities, or I am not using AI tools.
- [X] I read the [[Tree
Hygiene](https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md)]
wiki page, which explains my responsibilities.
- [X] I read and followed the [[Flutter Style
Guide](https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md)],
including [[Features we expect every widget to
implement](https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement)].
- [X] I signed the [[CLA](https://cla.developers.google.com/)].
- [X] I listed at least one issue that this PR fixes in the description
above.
- [X] I updated/added relevant documentation (doc comments with `///`).
- [X] I added new tests to check the change I am making, or this PR is
[[test-exempt](https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#tests)].
- [X] I followed the [[breaking change
policy](https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes)]
and added [[Data Driven
Fixes](https://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md)]
where supported.
- [X] All existing and new tests are passing.

<!-- Links -->
[Contributor Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview
[AI contribution guidelines]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#ai-contribution-guidelines
[Tree Hygiene]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md
[test-exempt]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#tests
[Flutter Style Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md
[Features we expect every widget to implement]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement
[CLA]: https://cla.developers.google.com/
[flutter/tests]: https://github.com/flutter/tests
[breaking change policy]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes
[Discord]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Chat.md
[Data Driven Fixes]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md
issue: flutter#188640

This follows the pattern from
flutter#161249

This duplicates the logic of
https://github.com/flutter/cocoon/blob/main/app_dart/bin/validate_task_ownership.dart

Note that the TESTOWNERS file format seems straightforward but it is
actually weird where things that look like comments have semantic
meaning.

## Pre-launch Checklist

- [x] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [x] I read the [AI contribution guidelines] and understand my
responsibilities, or I am not using AI tools.
- [x] I read the [Tree Hygiene] wiki page, which explains my
responsibilities.
- [x] I read and followed the [Flutter Style Guide], including [Features
we expect every widget to implement].
- [x] I signed the [CLA].
- [x] I listed at least one issue that this PR fixes in the description
above.
- [x] I updated/added relevant documentation (doc comments with `///`).
- [x] I added new tests to check the change I am making, or this PR is
[test-exempt].
- [x] I followed the [breaking change policy] and added [Data Driven
Fixes] where supported.
- [x] All existing and new tests are passing.

If you need help, consider asking for advice on the #hackers-new channel
on [Discord].

If this change needs to override an active code freeze, provide a
comment explaining why. The code freeze workflow can be overridden by
code reviewers. See pinned issues for any active code freezes with
guidance.

**Note**: The Flutter team is currently trialing the use of [Gemini Code
Assist for
GitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code).
Comments from the `gemini-code-assist` bot should not be taken as
authoritative feedback from the Flutter team. If you find its comments
useful you can update your code accordingly, but if you are unsure or
disagree with the feedback, please feel free to wait for a Flutter team
member's review for guidance on which automated comments should be
addressed.

<!-- Links -->
[Contributor Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview
[AI contribution guidelines]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#ai-contribution-guidelines
[Tree Hygiene]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md
[test-exempt]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#tests
[Flutter Style Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md
[Features we expect every widget to implement]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement
[CLA]: https://cla.developers.google.com/
[flutter/tests]: https://github.com/flutter/tests
[breaking change policy]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes
[Discord]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Chat.md
[Data Driven Fixes]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md
…Xcode 27 (flutter#188520)

Fixes flutter#187762

## Pre-launch Checklist

- [x] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [x] I read the [AI contribution guidelines] and understand my
responsibilities, or I am not using AI tools.
- [x] I read the [Tree Hygiene] wiki page, which explains my
responsibilities.
- [x] I read and followed the [Flutter Style Guide], including [Features
we expect every widget to implement].
- [x] I signed the [CLA].
- [x] I listed at least one issue that this PR fixes in the description
above.
- [x] I updated/added relevant documentation (doc comments with `///`).
- [x] I added new tests to check the change I am making, or this PR is
[test-exempt].
- [x] I followed the [breaking change policy] and added [Data Driven
Fixes] where supported.
- [x] All existing and new tests are passing.
<!--
Thanks for filing a pull request!
Reviewers are typically assigned within a week of filing a request.
To learn more about code review, see our documentation on Tree Hygiene:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md
-->
This PR adds a new benchmark test
(`complex_layout_android__impeller_gles_start_up`) that measures app
startup performance with Impeller renderer forced to use OpenGLES
backend on Android low-end devices (mokey).

### Purpose

This benchmark is designed to:

- Measure startup performance when Impeller uses OpenGLES backend on
Android devices
- Provide baseline metrics for tracking startup time improvements on
low-end Android devices
- Enable performance comparison for PRs that modify the IO context setup
for OpenGLES

### Test Configuration

- __Device:__ mokey (Android low-end device)
- __Renderer:__ Impeller with OpenGLES backend (forced via
`forceOpenGLES: true`)
- __Test App:__ complex_layout benchmark
- __Metric:__ App startup time
### Related Work

This benchmark supports the performance validation for
[](https://github.com/flutter/flutter/pull/185723)<https://github.com/flutter/flutter/pull/185723>,
which improves startup time on low-end devices by using IO context for
OpenGLES setup.

### Expected Outcome

This benchmark will provide measurable data to demonstrate the
performance improvements from PR flutter#185723 by comparing:

1. Baseline measurements (before IO context changes)
2. Post-merge measurements (after IO context changes are applied)


## Pre-launch Checklist

- [x] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [x] I read the [AI contribution guidelines] and understand my
responsibilities, or I am not using AI tools.
- [x] I read the [Tree Hygiene] wiki page, which explains my
responsibilities.
- [x] I read and followed the [Flutter Style Guide], including [Features
we expect every widget to implement].
- [x] I signed the [CLA].
- [x] I listed at least one issue that this PR fixes in the description
above.
- [x] I updated/added relevant documentation (doc comments with `///`).
- [x] I added new tests to check the change I am making, or this PR is
[test-exempt].
- [x] I followed the [breaking change policy] and added [Data Driven
Fixes] where supported.
- [x] All existing and new tests are passing.

If you need help, consider asking for advice on the #hackers-new channel
on [Discord].

If this change needs to override an active code freeze, provide a
comment explaining why. The code freeze workflow can be overridden by
code reviewers. See pinned issues for any active code freezes with
guidance.

**Note**: The Flutter team is currently trialing the use of [Gemini Code
Assist for
GitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code).
Comments from the `gemini-code-assist` bot should not be taken as
authoritative feedback from the Flutter team. If you find its comments
useful you can update your code accordingly, but if you are unsure or
disagree with the feedback, please feel free to wait for a Flutter team
member's review for guidance on which automated comments should be
addressed.

<!-- Links -->
[Contributor Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview
[AI contribution guidelines]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#ai-contribution-guidelines
[Tree Hygiene]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md
[test-exempt]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#tests
[Flutter Style Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md
[Features we expect every widget to implement]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement
[CLA]: https://cla.developers.google.com/
[flutter/tests]: https://github.com/flutter/tests
[breaking change policy]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes
[Discord]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Chat.md
[Data Driven Fixes]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md
…M service origin checks

Introduce a new `--disable-service-origin-check` flag to both `flutter run` and `flutter test` commands to allow connections to the VM service from any origin.

* Propagate the option through `DebuggingOptions` to iOS launch arguments, Android (`adb shell am start`), desktop environments, and `flutter_tester`.
* Update the Flutter engine C++ and Java codebases to parse the `--disable-service-origin-check` switch and forward it to `DartServiceIsolate::Startup`.
* Add corresponding unit tests in `device_test.dart` and `run_test.dart` to verify flag propagation and serialization.
* Add integration test verification in `disable_service_origin_check_test.dart` to verify that origin checks correctly block connections by default and permit connections when the flag is passed.
@bkonyi bkonyi closed this Jun 29, 2026
bkonyi pushed a commit that referenced this pull request Sep 4, 2026
… NDK fallback to public DSL (flutter#192116)

This is PR 5 of 11 in the AGP 9.1.0 / public `gradle-api` / newdsl
migration stack.

Add externalNativeBuild to the shared type. Extracted some shared
mocking logic to a utility.
No external visible changes expected. 
Also improved the README.md so that the test file for multiple agp
versions was a markdown link.

- @reidbaker

---
Standard review context for this pr stack

This is PR is part of an 11 pr stack to migrate the "newdsl"
`gradle-api` specifically in agp 9.1.0.

All of the code was LLM authored. A mix of manual prompting, automatic
prompting, several models and adversarial review. The combined sessions
are enough that I cannot include relevant prompts like I have been doing
on other prs.

If you want to review the pr stack you can find it here. These prs will
be abandoned/closed as prs land into flutter/flutter.
1. reidbaker-agent#1 (branch:
agp-api-doc)
2. reidbaker-agent#2 (branch:
agp-internal-utils)
3. reidbaker-agent#3 (branch:
agp-buildmode-deps)
4. reidbaker-agent#4 (branch:
agp-plugin-buildtypes)
5. reidbaker-agent#5 (branch:
agp-ndk-fallback)
6. reidbaker-agent#6 (branch:
agp-assets-onvariants)
7. reidbaker-agent#7 (branch:
agp-apk-copy-versioncode)
8. reidbaker-agent#8 (branch:
agp-add-to-app)
9. reidbaker-agent#9 (branch:
agp-aar-script)
10. reidbaker-agent#10 (branch:
agp-newdsl-flip)
11. reidbaker-agent#11 (branch:
agp-gradle-api)

This work is urgent in the sense that we are worried that android will
publish agp 10 with no opt out but not so urgent that we are willing to
break flutter users because we didn't review or understand the code
because we were in a rush.

Breaking changes are expected as part of this work. There are patterns
the android team explicitly does not want apps to use and apis that have
no equivalent.

As part of the effort to ensure this work does not slip into ai slop,
prs from this stack will be reviewed by me (@reidbaker) before asking
for review. Then we will have 2 android expert reviewers also review
every pr.

---
Agent authored description.
This is PR 5 of 11 in the AGP 9.1.0 / public `gradle-api` migration
stack (flutter#180137, flutter#166550).

### Key Changes
- **Public DSL Wrapper `externalNativeBuild`**: Exposes `val
externalNativeBuild: ExternalNativeBuild` in
`AgpCommonExtensionWrapper.kt` dispatching across
`ApplicationExtension`, `LibraryExtension`, `DynamicFeatureExtension`,
and `TestExtension` without referencing `CommonExtension` (bypassing AGP
binary incompatibility).
- **Zero Legacy `BaseExtension` in Production Sources**: Deletes
`getLegacyAndroidExtension(project: Project): BaseExtension` and removes
the `com.android.build.gradle.BaseExtension` import from
`FlutterPluginUtils.kt`.
- **Public DSL NDK Fallback Configuration**: Migrates `forceNdkDownload`
and `configureSyntheticExternalNativeBuildFallback` in
`FlutterPluginUtils.kt` to `getAndroidExtension(gradleProject)` using
`externalNativeBuild.cmake` / `externalNativeBuild.ndkBuild`. Sets
`cmake.path = File(...)`, `cmake.buildStagingDirectory = ...`, and
`buildType.externalNativeBuild.cmake.arguments += ...` through the
public DSL while preserving the upstream PR flutter#187201 `ndkBuild.path`
check.
- **Unit Test Public DSL Mocking & Cleanup**: Migrates unit tests in
`FlutterPluginUtilsTest.kt` to mock public DSL types
(`ApplicationExtension`, `Cmake`, `NdkBuild`), asserts CMake arguments
by list content, deletes obsolete tests asserting
`ApplicationExtension`-vs-`BaseExtension` `ndkVersion` preference, and
removes unused `import io.mockk.called` as well as all legacy
`com.android.build.gradle.internal.*` imports.

## Pre-launch Checklist

- [x] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [x] I read the [AI contribution guidelines] and understand my
responsibilities, or I am not using AI tools.
- [x] I read the [Tree Hygiene] wiki page, which explains my
responsibilities.
- [x] I read and followed the [Flutter Style Guide], including [Features
we expect every widget to implement].
- [x] I signed the [CLA].
- [x] I listed at least one issue that this PR fixes in the description
above.
- [x] I updated/added relevant documentation (doc comments with `///`).
- [x] I added new tests to check the change I am making, or this PR is
[test-exempt].
- [x] I followed the [breaking change policy] and added [Data Driven
Fixes] where supported.
- [x] All existing and new tests are passing.
bkonyi added a commit that referenced this pull request Nov 6, 2026
…tures

Only include the UTF-8 encoding remediation hint in `TestCommand.verifyThenRunCommand` when `readAsStringSync` fails due to a UTF-8 decoding error (`err.osError == null` and `readAsBytesSync` succeeds), rather than on OS or filesystem read failures. Add a hermetic regression test for OS `FileSystemException`s and document the AppleDouble and UTF-16 LE byte-array fixtures in `test_test.dart`.

Previous output (AppleDouble sidecar files):
```
Failed to decode data using encoding 'utf-8', path = '/usr/local/google/home/bkonyi/.gemini/jetski/brain/ee6d5e68-1051-40e6-a23a-a289ca33c97a/scratch/repro_app/test/._a_test.dart'
dart:io                                          _File.readAsStringSync
package:test_core/src/runner/loader.dart 41:22   Loader.parseSuiteMetadata.<fn>.<fn>
package:async/src/result/result.dart 67:40       new Result
package:test_core/src/runner/loader.dart 38:14   Loader.parseSuiteMetadata.<fn>
dart:_compact_hash                               _LinkedHashMapMixin.putIfAbsent
package:test_core/src/runner/loader.dart 36:35   Loader.parseSuiteMetadata
package:test_core/src/runner/loader.dart 266:41  Loader.loadFile

This is an unexpected error. Please file an issue at http://github.com/dart-lang/test
with the stack trace and instructions for reproducing the error.

FileSystemException: Failed to decode data using encoding 'utf-8', path = '/usr/local/google/home/bkonyi/.gemini/jetski/brain/ee6d5e68-1051-40e6-a23a-a289ca33c97a/scratch/repro_app/test/._widget_test.dart'
#0      _File._tryDecode (dart:io/file_impl.dart:704:7)
#1      _File.readAsStringSync (dart:io/file_impl.dart:715:7)
#2      Loader.parseSuiteMetadata.<anonymous closure>.<anonymous closure> (package:test_core/src/runner/loader.dart:41:22)
#3      new Result (package:async/src/result/result.dart:67:40)
#4      Loader.parseSuiteMetadata.<anonymous closure> (package:test_core/src/runner/loader.dart:38:14)
#5      _LinkedHashMapMixin.putIfAbsent (dart:_compact_hash:631:23)
#6      Loader.parseSuiteMetadata (package:test_core/src/runner/loader.dart:36:35)
flutter#7      Loader.loadFile (package:test_core/src/runner/loader.dart:266:41)
<asynchronous suspension>

Feature flags enabled: enable-web, enable-linux-desktop, enable-macos-desktop, enable-windows-desktop, enable-android, enable-ios, cli-animations, enable-native-assets, enable-record-use, enable-swift-package-manager, omit-legacy-version-file, enable-lldb-debugging, enable-uiscene-migration, enable-riscv64, enable-hcpp
```

Current output (AppleDouble sidecar files):
```
00:00 +0: loading /usr/local/google/home/bkonyi/.gemini/jetski/brain/ee6d5e68-1051-40e6-a23a-a289ca33c97a/scratch/repro_app/test/widget_test.dart
00:00 +0: passes
00:00 +1: All tests passed!
```

Previous output (non-UTF-8 test files):
```
Failed to decode data using encoding 'utf-8', path = '/usr/local/google/home/bkonyi/.gemini/jetski/brain/ee6d5e68-1051-40e6-a23a-a289ca33c97a/scratch/repro_app/test/non_utf8_1_test.dart'
dart:io                                          _File.readAsStringSync
package:test_core/src/runner/loader.dart 41:22   Loader.parseSuiteMetadata.<fn>.<fn>
package:async/src/result/result.dart 67:40       new Result
package:test_core/src/runner/loader.dart 38:14   Loader.parseSuiteMetadata.<fn>
dart:_compact_hash                               _LinkedHashMapMixin.putIfAbsent
package:test_core/src/runner/loader.dart 36:35   Loader.parseSuiteMetadata
package:test_core/src/runner/loader.dart 266:41  Loader.loadFile

This is an unexpected error. Please file an issue at http://github.com/dart-lang/test
with the stack trace and instructions for reproducing the error.

FileSystemException: Failed to decode data using encoding 'utf-8', path = '/usr/local/google/home/bkonyi/.gemini/jetski/brain/ee6d5e68-1051-40e6-a23a-a289ca33c97a/scratch/repro_app/test/non_utf8_2_test.dart'
#0      _File._tryDecode (dart:io/file_impl.dart:704:7)
#1      _File.readAsStringSync (dart:io/file_impl.dart:715:7)
#2      Loader.parseSuiteMetadata.<anonymous closure>.<anonymous closure> (package:test_core/src/runner/loader.dart:41:22)
#3      new Result (package:async/src/result/result.dart:67:40)
#4      Loader.parseSuiteMetadata.<anonymous closure> (package:test_core/src/runner/loader.dart:38:14)
#5      _LinkedHashMapMixin.putIfAbsent (dart:_compact_hash:631:23)
#6      Loader.parseSuiteMetadata (package:test_core/src/runner/loader.dart:36:35)
flutter#7      Loader.loadFile (package:test_core/src/runner/loader.dart:266:41)
<asynchronous suspension>

Feature flags enabled: enable-web, enable-linux-desktop, enable-macos-desktop, enable-windows-desktop, enable-android, enable-ios, cli-animations, enable-native-assets, enable-record-use, enable-swift-package-manager, omit-legacy-version-file, enable-lldb-debugging, enable-uiscene-migration, enable-riscv64, enable-hcpp
```

Current output (non-UTF-8 test files):
```
Failed to read test file
"/usr/local/google/home/bkonyi/.gemini/jetski/brain/ee6d5e68-1051-40e6-a23a-a289
ca33c97a/scratch/repro_app/test/non_utf8_1_test.dart": Failed to decode data
using encoding 'utf-8'.
Ensure that the file is a valid UTF-8 encoded Dart test file.
```
bkonyi added a commit that referenced this pull request Nov 9, 2026
… overwrite test

Updates `native_assets_flutter_test_manifest_overwrite_test.dart` to invoke `flutterBin` (`test_utils.dart`) with `@Timeout(Duration(minutes: 5))` instead of manually compiling `bin/flutter_tools.dart` to `flutter_tools.dill`, and uses `loadPackageConfig`, `PackageConfig`, `Package`, `LanguageVersion`, and `savePackageConfig` from `package:package_config/package_config.dart` to construct the offline test project's `.dart_tool/package_config.json`.

Previous output:
```
Unhandled exception:
FileSystemException: Cannot rename file to '/usr/local/google/home/bkonyi/.gemini/jetski/brain/0a669702-1e2d-46a6-9c37-fdc4d2ca98a9/scratch/repro_196121_dst.tmp', path = '/tmp/repro_196121_src.tmp' (OS Error: Invalid cross-device link, errno = 18)
#0      _File.throwIfError (dart:io/file_impl.dart:779:7)
#1      _File.renameSync (dart:io/file_impl.dart:396:5)
#2      ForwardingFileSystemEntity.renameSync (package:file/src/forwarding/forwarding_file_system_entity.dart:50:49)
#3      ErrorHandlingFile.renameSync.<anonymous closure> (package:flutter_tools/src/base/error_handling_io.dart:430:31)
#4      _runSync (package:flutter_tools/src/base/error_handling_io.dart:1116:16)
#5      ErrorHandlingFile.renameSync (package:flutter_tools/src/base/error_handling_io.dart:429:12)
#6      main (file:///usr/local/google/home/bkonyi/.gemini/jetski/brain/0a669702-1e2d-46a6-9c37-fdc4d2ca98a9/scratch/repro_exdev.dart:24:37)
flutter#7      _delayEntrypointInvocation.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:313:19)
flutter#8      _RawReceivePort._handleMessage (dart:isolate-patch/isolate_patch.dart:192:12)
```

Current output:
```
Flutter failed to rename file at "/tmp/repro_196121_src.tmp" to "/usr/local/google/home/bkonyi/.gemini/jetski/brain/0a669702-1e2d-46a6-9c37-fdc4d2ca98a9/scratch/repro_196121_dst.tmp".
A file system operation failed across different volumes or mount points.
FileSystemException: Cannot rename file to '/usr/local/google/home/bkonyi/.gemini/jetski/brain/0a669702-1e2d-46a6-9c37-fdc4d2ca98a9/scratch/repro_196121_dst.tmp', path = '/tmp/repro_196121_src.tmp' (OS Error: Invalid cross-device link, errno = 18)
Ensure that the project, build output, and temporary directories are on the same writable volume, or check external volume and security software settings.
```

Previous output (flutter test overwriting existing native_assets.json):
```
Flutter failed to delete file at
"/usr/local/google/home/bkonyi/.gemini/jetski/brain/0a669702-1e2d-46a6-9c37-fdc4
d2ca98a9/scratch/repro_app/build/native_assets/linux/native_assets.json".
Please ensure that the SDK and/or project is installed in a location that has
read/write permissions for the current user.
Try running:
  sudo chown -R $(whoami)
  /usr/local/google/home/bkonyi/.gemini/jetski/brain/0a669702-1e2d-46a6-9c37-fdc
  4d2ca98a9/scratch/repro_app/build/native_assets/linux/native_assets.json
```

Current output (flutter test overwriting existing native_assets.json):
```
00:00 +0: loading /usr/local/google/home/bkonyi/.gemini/jetski/brain/0a669702-1e2d-46a6-9c37-fdc4d2ca98a9/scratch/repro_app/test/smoke_test.dart
00:00 +0: smoke test
00:00 +1: All tests passed!
```

Fixes flutter#196121
bkonyi added a commit that referenced this pull request Nov 9, 2026
Simplifies the fix and tests for avoiding redundant `native_assets.json` deletion and handling `EXDEV`:
- Restores `ErrorHandlingFileSystem.deleteIfExists` to upstream and removes custom `ForwardingFileSystem` test doubles in `error_handling_io_test.dart`, testing `EXDEV` (`errno = 18`) directly with `MemoryFileSystem.test(opHandle: exceptionHandler.opHandle)`.
- Streams `targetDir.list(followLinks: false)` in `_copyNativeCodeAssetsForOS` with `entity is File` instead of `.toList()` and `typeSync`, and deduplicates `installCodeAssets` test setup in `native_assets_test.dart`.
- Removes the redundant `flutter test` subprocess integration test (`native_assets_flutter_test_manifest_overwrite_test.dart`).

Reproduction notes: Both output pairs below were captured on a Linux host, which cannot reproduce the macOS external-volume behavior directly. The first pair comes from a small Dart script (`repro_exdev.dart`) calling `ErrorHandlingFileSystem.file(...).renameSync(...)` from `/tmp` (`tmpfs`) to an `ext4` directory to trigger a real kernel `EXDEV` (`errno = 18`). The second pair comes from running `BOT=true flutter test --no-pub -r expanded` on a minimal app after making `build/native_assets/linux` read-only (`chmod 0555`) while leaving `native_assets.json` writable (`0644`), so `unlink(2)` fails while in-place truncation succeeds; with a writable `build/native_assets/linux` directory, the unfixed tool passes with the same 3-line test output. Local workspace paths inside the fenced output blocks are preserved verbatim to match exact command output.

Previous output:
```
Unhandled exception:
FileSystemException: Cannot rename file to '/usr/local/google/home/bkonyi/.gemini/jetski/brain/0a669702-1e2d-46a6-9c37-fdc4d2ca98a9/scratch/repro_196121_dst.tmp', path = '/tmp/repro_196121_src.tmp' (OS Error: Invalid cross-device link, errno = 18)
#0      _File.throwIfError (dart:io/file_impl.dart:779:7)
#1      _File.renameSync (dart:io/file_impl.dart:396:5)
#2      ForwardingFileSystemEntity.renameSync (package:file/src/forwarding/forwarding_file_system_entity.dart:50:49)
#3      ErrorHandlingFile.renameSync.<anonymous closure> (package:flutter_tools/src/base/error_handling_io.dart:430:31)
#4      _runSync (package:flutter_tools/src/base/error_handling_io.dart:1116:16)
#5      ErrorHandlingFile.renameSync (package:flutter_tools/src/base/error_handling_io.dart:429:12)
#6      main (file:///usr/local/google/home/bkonyi/.gemini/jetski/brain/0a669702-1e2d-46a6-9c37-fdc4d2ca98a9/scratch/repro_exdev.dart:24:37)
flutter#7      _delayEntrypointInvocation.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:313:19)
flutter#8      _RawReceivePort._handleMessage (dart:isolate-patch/isolate_patch.dart:192:12)
```

Current output:
```
Flutter failed to rename file at "/tmp/repro_196121_src.tmp" to "/usr/local/google/home/bkonyi/.gemini/jetski/brain/0a669702-1e2d-46a6-9c37-fdc4d2ca98a9/scratch/repro_196121_dst.tmp".
A file system operation failed across different volumes or mount points.
FileSystemException: Cannot rename file to '/usr/local/google/home/bkonyi/.gemini/jetski/brain/0a669702-1e2d-46a6-9c37-fdc4d2ca98a9/scratch/repro_196121_dst.tmp', path = '/tmp/repro_196121_src.tmp' (OS Error: Invalid cross-device link, errno = 18)
Ensure that the project, build output, and temporary directories are on the same writable volume, or check external volume and security software settings.
```

Previous output (flutter test overwriting existing native_assets.json):
```
Flutter failed to delete file at
"/usr/local/google/home/bkonyi/.gemini/jetski/brain/0a669702-1e2d-46a6-9c37-fdc4
d2ca98a9/scratch/repro_app/build/native_assets/linux/native_assets.json".
Please ensure that the SDK and/or project is installed in a location that has
read/write permissions for the current user.
Try running:
  sudo chown -R $(whoami)
  /usr/local/google/home/bkonyi/.gemini/jetski/brain/0a669702-1e2d-46a6-9c37-fdc
  4d2ca98a9/scratch/repro_app/build/native_assets/linux/native_assets.json
```

Current output (flutter test overwriting existing native_assets.json):
```
00:00 +0: loading /usr/local/google/home/bkonyi/.gemini/jetski/brain/0a669702-1e2d-46a6-9c37-fdc4d2ca98a9/scratch/repro_app/test/smoke_test.dart
00:00 +0: smoke test
00:00 +1: All tests passed!
```

Fixes flutter#196121
bkonyi added a commit that referenced this pull request Nov 9, 2026
…ative assets

Restores `.toList()` on `targetDir.list(followLinks: false)` in `_copyNativeCodeAssetsForOS` so directory enumeration completes before deleting stale entries in `targetDir`, avoiding concurrent directory stream mutation issues on Windows and network filesystems.

Reproduction notes: Both output pairs below were captured on a Linux host, which cannot reproduce the macOS external-volume behavior directly. The first pair comes from a small Dart script (`repro_exdev.dart`) calling `ErrorHandlingFileSystem.file(...).renameSync(...)` from `/tmp` (`tmpfs`) to an `ext4` directory to trigger a real kernel `EXDEV` (`errno = 18`). The second pair comes from running `BOT=true flutter test --no-pub -r expanded` on a minimal app after making `build/native_assets/linux` read-only (`chmod 0555`) while leaving `native_assets.json` writable (`0644`), so `unlink(2)` fails while in-place truncation succeeds; with a writable `build/native_assets/linux` directory, the unfixed tool passes with the same 3-line test output. Local workspace paths inside the fenced output blocks are preserved verbatim to match exact command output.

Previous output:
```
Unhandled exception:
FileSystemException: Cannot rename file to '/usr/local/google/home/bkonyi/.gemini/jetski/brain/0a669702-1e2d-46a6-9c37-fdc4d2ca98a9/scratch/repro_196121_dst.tmp', path = '/tmp/repro_196121_src.tmp' (OS Error: Invalid cross-device link, errno = 18)
#0      _File.throwIfError (dart:io/file_impl.dart:779:7)
#1      _File.renameSync (dart:io/file_impl.dart:396:5)
#2      ForwardingFileSystemEntity.renameSync (package:file/src/forwarding/forwarding_file_system_entity.dart:50:49)
#3      ErrorHandlingFile.renameSync.<anonymous closure> (package:flutter_tools/src/base/error_handling_io.dart:430:31)
#4      _runSync (package:flutter_tools/src/base/error_handling_io.dart:1116:16)
#5      ErrorHandlingFile.renameSync (package:flutter_tools/src/base/error_handling_io.dart:429:12)
#6      main (file:///usr/local/google/home/bkonyi/.gemini/jetski/brain/0a669702-1e2d-46a6-9c37-fdc4d2ca98a9/scratch/repro_exdev.dart:24:37)
flutter#7      _delayEntrypointInvocation.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:313:19)
flutter#8      _RawReceivePort._handleMessage (dart:isolate-patch/isolate_patch.dart:192:12)
```

Current output:
```
Flutter failed to rename file at "/tmp/repro_196121_src.tmp" to "/usr/local/google/home/bkonyi/.gemini/jetski/brain/0a669702-1e2d-46a6-9c37-fdc4d2ca98a9/scratch/repro_196121_dst.tmp".
A file system operation failed across different volumes or mount points.
FileSystemException: Cannot rename file to '/usr/local/google/home/bkonyi/.gemini/jetski/brain/0a669702-1e2d-46a6-9c37-fdc4d2ca98a9/scratch/repro_196121_dst.tmp', path = '/tmp/repro_196121_src.tmp' (OS Error: Invalid cross-device link, errno = 18)
Ensure that the project, build output, and temporary directories are on the same writable volume, or check external volume and security software settings.
```

Previous output (flutter test overwriting existing native_assets.json):
```
Flutter failed to delete file at
"/usr/local/google/home/bkonyi/.gemini/jetski/brain/0a669702-1e2d-46a6-9c37-fdc4
d2ca98a9/scratch/repro_app/build/native_assets/linux/native_assets.json".
Please ensure that the SDK and/or project is installed in a location that has
read/write permissions for the current user.
Try running:
  sudo chown -R $(whoami)
  /usr/local/google/home/bkonyi/.gemini/jetski/brain/0a669702-1e2d-46a6-9c37-fdc
  4d2ca98a9/scratch/repro_app/build/native_assets/linux/native_assets.json
```

Current output (flutter test overwriting existing native_assets.json):
```
00:00 +0: loading /usr/local/google/home/bkonyi/.gemini/jetski/brain/0a669702-1e2d-46a6-9c37-fdc4d2ca98a9/scratch/repro_app/test/smoke_test.dart
00:00 +0: smoke test
00:00 +1: All tests passed!
```

Fixes flutter#196121
bkonyi added a commit that referenced this pull request Nov 11, 2026
…lutter#196134)

Previously, `installCodeAssets` invoked `_copyNativeCodeAssetsForOS` on
every `flutter test` run, which listed `build/native_assets/<os>/` and
deleted `native_assets.json` right before `_writeNativeAssetsJson`
truncated and overwrote that same file in place. On macOS external
volumes (for example `/Volumes/...` where endpoint-security or
recycle-bin interposers intercept `unlink(2)` and attempt a cross-volume
`rename(2)`), unlinking `native_assets.json` failed with
`FileSystemException (OS Error: Cross-device link, errno = 18)`
(`EXDEV`). In addition, `_handlePosixException` did not map `EXDEV`
(`errno = 18`) to a `ToolExit`.

This change:
1. Skips deleting `native_assets.json` in `_copyNativeCodeAssetsForOS`
when it already exists on disk as a regular file, since
`_writeNativeAssetsJson` immediately truncates and overwrites it in
place (while still deleting stale bundled native asset artifacts,
directories, and symlinks).
2. Handles POSIX `EXDEV` (`errno = 18`) in `_handlePosixException` on
Linux and macOS by throwing an actionable `ToolExit` instead of crashing
with an unhandled `FileSystemException`.

Reproduction notes: Both output pairs below were captured on a Linux
host, which cannot reproduce the macOS external-volume behavior
directly. The first pair comes from a small Dart script
(`repro_exdev.dart`) calling
`ErrorHandlingFileSystem.file(...).renameSync(...)` from `/tmp`
(`tmpfs`) to an `ext4` directory to trigger a real kernel `EXDEV`
(`errno = 18`). The second pair comes from running `BOT=true flutter
test --no-pub -r expanded` on a minimal app after making
`build/native_assets/linux` read-only (`chmod 0555`) while leaving
`native_assets.json` writable (`0644`), so `unlink(2)` fails while
in-place truncation succeeds; with a writable
`build/native_assets/linux` directory, the unfixed tool passes with the
same 3-line test output. Local workspace paths inside the fenced output
blocks are preserved verbatim to match exact command output.

Previous output:
```
Unhandled exception:
FileSystemException: Cannot rename file to '/usr/local/google/home/bkonyi/.gemini/jetski/brain/0a669702-1e2d-46a6-9c37-fdc4d2ca98a9/scratch/repro_196121_dst.tmp', path = '/tmp/repro_196121_src.tmp' (OS Error: Invalid cross-device link, errno = 18)
#0      _File.throwIfError (dart:io/file_impl.dart:779:7)
#1      _File.renameSync (dart:io/file_impl.dart:396:5)
#2      ForwardingFileSystemEntity.renameSync (package:file/src/forwarding/forwarding_file_system_entity.dart:50:49)
#3      ErrorHandlingFile.renameSync.<anonymous closure> (package:flutter_tools/src/base/error_handling_io.dart:430:31)
#4      _runSync (package:flutter_tools/src/base/error_handling_io.dart:1116:16)
#5      ErrorHandlingFile.renameSync (package:flutter_tools/src/base/error_handling_io.dart:429:12)
#6      main (file:///usr/local/google/home/bkonyi/.gemini/jetski/brain/0a669702-1e2d-46a6-9c37-fdc4d2ca98a9/scratch/repro_exdev.dart:24:37)
flutter#7      _delayEntrypointInvocation.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:313:19)
flutter#8      _RawReceivePort._handleMessage (dart:isolate-patch/isolate_patch.dart:192:12)
```

Current output:
```
Flutter failed to rename file at "/tmp/repro_196121_src.tmp" to "/usr/local/google/home/bkonyi/.gemini/jetski/brain/0a669702-1e2d-46a6-9c37-fdc4d2ca98a9/scratch/repro_196121_dst.tmp".
A file system operation failed across different volumes or mount points.
FileSystemException: Cannot rename file to '/usr/local/google/home/bkonyi/.gemini/jetski/brain/0a669702-1e2d-46a6-9c37-fdc4d2ca98a9/scratch/repro_196121_dst.tmp', path = '/tmp/repro_196121_src.tmp' (OS Error: Invalid cross-device link, errno = 18)
Ensure that the project, build output, and temporary directories are on the same writable volume, or check external volume and security software settings.
```

Previous output (flutter test overwriting existing native_assets.json):
```
Flutter failed to delete file at
"/usr/local/google/home/bkonyi/.gemini/jetski/brain/0a669702-1e2d-46a6-9c37-fdc4
d2ca98a9/scratch/repro_app/build/native_assets/linux/native_assets.json".
Please ensure that the SDK and/or project is installed in a location that has
read/write permissions for the current user.
Try running:
  sudo chown -R $(whoami)
  /usr/local/google/home/bkonyi/.gemini/jetski/brain/0a669702-1e2d-46a6-9c37-fdc
  4d2ca98a9/scratch/repro_app/build/native_assets/linux/native_assets.json
```

Current output (flutter test overwriting existing native_assets.json):
```
00:00 +0: loading /usr/local/google/home/bkonyi/.gemini/jetski/brain/0a669702-1e2d-46a6-9c37-fdc4d2ca98a9/scratch/repro_app/test/smoke_test.dart
00:00 +0: smoke test
00:00 +1: All tests passed!
```

Fixes flutter#196121
bkonyi added a commit that referenced this pull request Nov 12, 2026
flutter#196136)

Previously, `ErrorHandlingFile.readAsStringSync` dropped its `encoding`
parameter when calling `delegate.readAsStringSync()`, forcing UTF-8
decoding even when callers requested another encoding (unlike
`readAsString`, `readAsLines`, and `readAsLinesSync`, which already
forwarded `encoding`). Because `flutter_tools` wraps `LocalFileSystem`
in `ErrorHandlingFileSystem`, callers such as
`ScreenshotCommand.ensureOutputIsNotJsonRpcError` (which passes
`AsciiCodec(allowInvalid: true)` when checking small screenshot files
for JSON-RPC error payloads) crashed with a `FileSystemException`.

Forward `encoding` to `delegate.readAsStringSync(encoding: encoding)`
and add regression tests covering `ErrorHandlingFile.readAsStringSync`
backed by `LocalFileSystem` and
`ScreenshotCommand.ensureOutputIsNotJsonRpcError` on
`ErrorHandlingFileSystem`.

Fixes flutter#196225

Previous output:
```
Screenshot written to flutter_01.skp (0kB).

FileSystemException: Failed to decode data using encoding 'utf-8', path = '/tmp/repro_screenshot_skp.QPQNLT/flutter_01.skp'
#0      _File._tryDecode (dart:io/file_impl.dart:704:7)
#1      _File.readAsStringSync (dart:io/file_impl.dart:715:7)
#2      ForwardingFile.readAsStringSync (package:file/src/forwarding/forwarding_file.dart:99:16)
#3      ErrorHandlingFile.readAsStringSync.<anonymous closure> (package:flutter_tools/src/base/error_handling_io.dart:258:22)
#4      _runSync (package:flutter_tools/src/base/error_handling_io.dart:1116:16)
#5      ErrorHandlingFile.readAsStringSync (package:flutter_tools/src/base/error_handling_io.dart:257:12)
#6      ScreenshotCommand.ensureOutputIsNotJsonRpcError (package:flutter_tools/src/commands/screenshot.dart:198:39)
flutter#7      ScreenshotCommand.runSkia (package:flutter_tools/src/commands/screenshot.dart:180:5)
<asynchronous suspension>
flutter#8      ScreenshotCommand.runCommand (package:flutter_tools/src/commands/screenshot.dart:123:19)
<asynchronous suspension>
flutter#9      FlutterCommand.run.<anonymous closure> (package:flutter_tools/src/runner/flutter_command.dart:876:27)
<asynchronous suspension>
flutter#10     AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:174:19)
<asynchronous suspension>
flutter#11     CommandRunner.runCommand (package:args/command_runner.dart:212:13)
<asynchronous suspension>
flutter#12     FlutterCommandRunner.runCommand.<anonymous closure> (package:flutter_tools/src/runner/flutter_command_runner.dart:689:9)
<asynchronous suspension>
flutter#13     AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:174:19)
<asynchronous suspension>
flutter#14     FlutterCommandRunner.runCommand (package:flutter_tools/src/runner/flutter_command_runner.dart:619:5)
<asynchronous suspension>
flutter#15     FlutterCommandRunner.run (package:flutter_tools/src/runner/flutter_command_runner.dart:379:5)
<asynchronous suspension>
flutter#16     run.<anonymous closure>.<anonymous closure>.<anonymous closure>.<anonymous closure> (package:flutter_tools/runner.dart:419:19)
<asynchronous suspension>
flutter#17     AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:174:19)
<asynchronous suspension>
flutter#18     AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:174:19)
<asynchronous suspension>
flutter#19     AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:174:19)
<asynchronous suspension>
flutter#20     main (package:flutter_tools/executable.dart:133:3)
<asynchronous suspension>

Feature flags enabled: enable-web, enable-linux-desktop, enable-macos-desktop, enable-windows-desktop, enable-android, enable-ios, cli-animations, enable-native-assets, enable-record-use, enable-swift-package-manager, omit-legacy-version-file, enable-lldb-debugging, enable-uiscene-migration, enable-riscv64, enable-hcpp
```

Current output:
```
Screenshot written to flutter_01.skp (0kB).
```
bkonyi added a commit that referenced this pull request Nov 12, 2026
Update `screenshot_test.dart` to write its synthetic package configuration via `writePackageConfigFiles`, resolve local engine paths via `LocalEngineLocator` and `getLocalEngineArguments()` with a normalized absolute `flutterBin` path, and register `flutter_tester` teardown immediately after process startup with early-exit reporting.

Previous output:
```
_flutter.screenshotSkp: (-32000) Cannot capture SKP screenshot with Impeller enabled.
#0      new _OutstandingRequest (package:vm_service/src/vm_service.dart:280:34)
#1      VmService._call.<anonymous closure> (package:vm_service/src/vm_service.dart:1962:25)
#2      VmService._call (package:vm_service/src/vm_service.dart:1974:8)
#3      VmService.callServiceExtension (package:vm_service/src/vm_service.dart:1905:14)
#4      FlutterVmService._checkedCallServiceExtension (package:flutter_tools/src/vmservice.dart:835:28)
#5      FlutterVmService.screenshotSkp (package:flutter_tools/src/vmservice.dart:1069:12)
#6      ScreenshotCommand.runSkia (package:flutter_tools/src/commands/screenshot.dart:167:54)
<asynchronous suspension>
flutter#7      ScreenshotCommand.runCommand (package:flutter_tools/src/commands/screenshot.dart:123:19)
<asynchronous suspension>
flutter#8      FlutterCommand.run.<anonymous closure> (package:flutter_tools/src/runner/flutter_command.dart:876:27)
<asynchronous suspension>
flutter#9      AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:174:19)
<asynchronous suspension>
flutter#10     CommandRunner.runCommand (package:args/command_runner.dart:212:13)
<asynchronous suspension>
flutter#11     FlutterCommandRunner.runCommand.<anonymous closure> (package:flutter_tools/src/runner/flutter_command_runner.dart:689:9)
<asynchronous suspension>
flutter#12     AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:174:19)
<asynchronous suspension>
flutter#13     FlutterCommandRunner.runCommand (package:flutter_tools/src/runner/flutter_command_runner.dart:619:5)
<asynchronous suspension>
flutter#14     FlutterCommandRunner.run (package:flutter_tools/src/runner/flutter_command_runner.dart:379:5)
<asynchronous suspension>
flutter#15     run.<anonymous closure>.<anonymous closure>.<anonymous closure>.<anonymous closure> (package:flutter_tools/runner.dart:419:19)
<asynchronous suspension>
flutter#16     AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:174:19)
<asynchronous suspension>
flutter#17     AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:174:19)
<asynchronous suspension>
flutter#18     AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:174:19)
<asynchronous suspension>
flutter#19     main (package:flutter_tools/executable.dart:133:3)
<asynchronous suspension>

Feature flags enabled: enable-web, enable-linux-desktop, enable-macos-desktop, enable-windows-desktop, enable-android, enable-ios, cli-animations, enable-native-assets, enable-record-use, enable-swift-package-manager, omit-legacy-version-file, enable-lldb-debugging, enable-uiscene-migration, enable-riscv64, enable-hcpp
```

Current output:
```
The Skia picture request failed: Cannot capture SKP screenshot with Impeller enabled.
```

Fixes flutter#196119
bkonyi added a commit that referenced this pull request Nov 13, 2026
…#196132)

Previously, running `flutter screenshot --type=skia` against an
application with Impeller enabled crashed with an unhandled
`vm_service.RPCError` (`-32000`) because the engine rejects
`_flutter.screenshotSkp` requests under Impeller and
`ScreenshotCommand.runSkia` did not catch `RPCError`. Catch
`vm_service.RPCError` in `ScreenshotCommand.runSkia` and exit cleanly
via `throwToolExit` with the engine's error message.

Previous output:
```
_flutter.screenshotSkp: (-32000) Cannot capture SKP screenshot with Impeller enabled.
#0      new _OutstandingRequest (package:vm_service/src/vm_service.dart:280:34)
#1      VmService._call.<anonymous closure> (package:vm_service/src/vm_service.dart:1962:25)
#2      VmService._call (package:vm_service/src/vm_service.dart:1974:8)
#3      VmService.callServiceExtension (package:vm_service/src/vm_service.dart:1905:14)
#4      FlutterVmService._checkedCallServiceExtension (package:flutter_tools/src/vmservice.dart:835:28)
#5      FlutterVmService.screenshotSkp (package:flutter_tools/src/vmservice.dart:1069:12)
#6      ScreenshotCommand.runSkia (package:flutter_tools/src/commands/screenshot.dart:167:54)
<asynchronous suspension>
flutter#7      ScreenshotCommand.runCommand (package:flutter_tools/src/commands/screenshot.dart:123:19)
<asynchronous suspension>
flutter#8      FlutterCommand.run.<anonymous closure> (package:flutter_tools/src/runner/flutter_command.dart:876:27)
<asynchronous suspension>
flutter#9      AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:174:19)
<asynchronous suspension>
flutter#10     CommandRunner.runCommand (package:args/command_runner.dart:212:13)
<asynchronous suspension>
flutter#11     FlutterCommandRunner.runCommand.<anonymous closure> (package:flutter_tools/src/runner/flutter_command_runner.dart:689:9)
<asynchronous suspension>
flutter#12     AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:174:19)
<asynchronous suspension>
flutter#13     FlutterCommandRunner.runCommand (package:flutter_tools/src/runner/flutter_command_runner.dart:619:5)
<asynchronous suspension>
flutter#14     FlutterCommandRunner.run (package:flutter_tools/src/runner/flutter_command_runner.dart:379:5)
<asynchronous suspension>
flutter#15     run.<anonymous closure>.<anonymous closure>.<anonymous closure>.<anonymous closure> (package:flutter_tools/runner.dart:419:19)
<asynchronous suspension>
flutter#16     AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:174:19)
<asynchronous suspension>
flutter#17     AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:174:19)
<asynchronous suspension>
flutter#18     AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:174:19)
<asynchronous suspension>
flutter#19     main (package:flutter_tools/executable.dart:133:3)
<asynchronous suspension>

Feature flags enabled: enable-web, enable-linux-desktop, enable-macos-desktop, enable-windows-desktop, enable-android, enable-ios, cli-animations, enable-native-assets, enable-record-use, enable-swift-package-manager, omit-legacy-version-file, enable-lldb-debugging, enable-uiscene-migration, enable-riscv64, enable-hcpp
```

Current output:
```
The Skia picture request failed: Cannot capture SKP screenshot with Impeller enabled.
```

Fixes flutter#196119
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.