Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
51 commits
Select commit Hold shift + click to select a range
76101c9
chore: squash all commits on top of 3.35.7
eseidel Nov 14, 2025
fc41139
chore: run et format
eseidel Nov 14, 2025
1ed7fef
fix: update name to application_library_paths
eseidel Nov 15, 2025
ff1258b
fix: attempt to fix builds
eseidel Nov 15, 2025
6704458
chore: add missing header for ios
eseidel Nov 17, 2025
e32768c
fix: linux android build
eseidel Nov 17, 2025
a868599
fix: attempt to fix shorebird flutter_tools changes
eseidel Nov 17, 2025
3f3c8ff
feat: make it possible to load two patches into the runtime at once (…
eseidel Dec 12, 2025
15182ab
feat: shorebird flutter should work without setting FLUTTER_STORAGE_B…
eseidel Dec 12, 2025
9e14cbb
chore: move build_engine scripts into this repo (#98)
eseidel Dec 12, 2025
3207ad1
chore: update to use new CreateGroupIsolate API (#99)
eseidel Dec 16, 2025
9c591c4
bump updater rev
bryanoltman Dec 19, 2025
9f0182b
fix: crash after patching on iOS
eseidel Dec 31, 2025
47cc697
fix: revert to using Shorebird_SetBaseSnapshots to stop iOS crashers
eseidel Jan 6, 2026
8e81055
chore: fix linux
eseidel Jan 9, 2026
95c8cae
feat: add support for patch_verification_mode (#100)
eseidel Jan 11, 2026
d0f19f5
chore: roll updater to 8691c8f60e69f8eb1f35361f4a22e8c9a7fdf93c to in…
eseidel Jan 11, 2026
63c703e
fix: use of FlutterEngineGroup breaks patching (#101)
eseidel Jan 23, 2026
a84cba5
chore: add a C++ interface onto the updater (#102)
eseidel Jan 23, 2026
983506a
fix: start/success reporting (#103)
eseidel Jan 31, 2026
fc5f5f8
fix: only call shorebird_report_start once (#105)
eseidel Feb 3, 2026
3327d22
feat: show logs when running shorebird_tests (#106)
eseidel Feb 3, 2026
ffe21f7
perf: speed up shorebird_tests with template project and Gradle cache…
eseidel Feb 3, 2026
fe2749b
fix: throw on copy failure in _copyTemplateProject (#109)
eseidel Feb 3, 2026
b7b0a78
chore: split CI into parallel jobs (#110)
eseidel Feb 3, 2026
f73b6ef
feat: add sharded CI build runner (#111)
eseidel Feb 4, 2026
7da3bf6
fix: add Rust build steps to each shard that needs libupdater (#112)
eseidel Feb 4, 2026
94aa3da
fix: remove duplicate --help flag in finalize.dart
eseidel Feb 4, 2026
38839fb
fix: resolve .cmd executables on Windows for gsutil/gcloud
eseidel Feb 5, 2026
fb3dc6d
style: format process.dart
eseidel Feb 5, 2026
2ab1216
fix: remove Rust steps from iOS simulator shards
eseidel Feb 5, 2026
501efe5
fix: restore Rust for x64 iOS simulator shards
eseidel Feb 5, 2026
43f0706
chore: bump dart sdk to shorebird dev 3.11.0 (b8847b5a781cfacf7edd199…
bdero Feb 11, 2026
75c771d
fix: update NDK path for unmodified Android SDK CIPD package
bdero Feb 11, 2026
1d90b19
fix: update dart_io_api reference to common_embedder_dart_io
bdero Feb 11, 2026
0da2fc3
chore: bump dart sdk to 896b3245b1a503560adc6ba8487f6ec42a0716a9
bdero Feb 12, 2026
0176079
chore: bump dart sdk to 4e44af9d1888a6d7ee3cd6ffe1c52b5e97881360
bdero Feb 12, 2026
511f679
chore: bump dart sdk version to a5f0d8808753f5c4990a63e7ee5e93dc2bd978e9
bdero Feb 23, 2026
558c0bb
chore: bump dart sdk version to fc0de217def061c060a0dd6e42ff98428b18e52e
bdero Feb 25, 2026
6fc33ab
fix: format shard_runner config.dart
bdero Feb 25, 2026
85009ad
chore: bump dart-sdk to 12401cce210d164318a7becd9742abfe8391538f
bdero Mar 2, 2026
cd234ef
chore: bump engine version to 85009ad6ecb058715c24af4763f1bdb595913a19
bdero Mar 5, 2026
cf75cce
chore: update dart-sdk to 67f30e6191fc5d7c924d6abe0435a0104aa0d2e2
bdero Mar 12, 2026
460658b
chore: bump engine to cf75cce899a0a7217b56d24b8b6125aa084c7346
bdero Mar 12, 2026
ad4602a
fix: format shard_runner config.dart for stable SDK formatter
bdero Mar 12, 2026
6ea12f2
fix: Update iOS dSYM filename in artifact manifest (#113)
eseidel Mar 13, 2026
9899da7
chore: bump dart-sdk to 912ee5b7a1b5c7a41079ea55888031ebf9381ddf
bdero Mar 13, 2026
569450f
chore: bump engine to 9899da7fccd15f22e047bd2a87e9ed6d6f09daeb
bdero Mar 13, 2026
ccd7e81
feat: Add --trace flag to flutter build apk for build profiling
eseidel Mar 14, 2026
4288514
Add comment about multi-variant trace file collision risk
eseidel Mar 14, 2026
8ea86fb
Add iOS build tracing support
eseidel Mar 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 43 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
name: ci

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

on:
pull_request:
push:
branches:
- main

jobs:
test:
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]

runs-on: ${{ matrix.os }}

name: 🧪 Test

env:
FLUTTER_STORAGE_BASE_URL: https://download.shorebird.dev

steps:
- name: 📚 Git Checkout
uses: actions/checkout@v4
with:
# Fetch all branches and tags to ensure that Flutter can determine its version
fetch-depth: 0

- name: 🎯 Setup Dart
uses: dart-lang/setup-dart@v1

- name: 📦 Install Dependencies
run: |
dart pub get -C ./dev/bots
dart pub get -C ./dev/tools

- name: 🧪 Run Tests
run: dart ./dev/bots/test.dart
140 changes: 140 additions & 0 deletions .github/workflows/shorebird_ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
name: shorebird_ci

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

on:
pull_request:
push:
branches:
- shorebird/dev

jobs:
# NOTE: Windows is not included because shorebird_tests depends on
# flutter_flavorizr which requires Xcode. Additionally, flutter_tools
# tests on Windows would need additional setup work.

flutter-tools-tests:
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest]

runs-on: ${{ matrix.os }}

name: 🛠️ Flutter Tools Tests (${{ matrix.os }})

steps:
- name: 📚 Git Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0

- name: 🎯 Setup Dart
uses: dart-lang/setup-dart@v1

- name: 🐦 Run Flutter Tools Tests
run: ../../bin/flutter test test/general.shard
working-directory: packages/flutter_tools

shard-runner-tests:
runs-on: ubuntu-latest

name: 🧩 Shard Runner Tests

defaults:
run:
working-directory: shorebird/ci/shard_runner

steps:
- name: 📚 Git Checkout
uses: actions/checkout@v4

- name: 🎯 Setup Dart
uses: dart-lang/setup-dart@v1

- name: 📦 Install Dependencies
run: dart pub get

- name: 🔍 Check Formatting
run: dart format --output=none --set-exit-if-changed .

- name: 🔎 Analyze
run: dart analyze --fatal-infos

- name: 🧪 Run Tests
run: dart test

shorebird-android-tests:
# Android tests run on Ubuntu (faster runners, no macOS needed)
runs-on: ubuntu-latest

name: 🤖 Shorebird Android Tests

steps:
- name: 📚 Git Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0

- name: 🎯 Setup Dart
uses: dart-lang/setup-dart@v1

- uses: actions/setup-java@v4
with:
distribution: "zulu"
java-version: "17"

- name: 📦 Cache Gradle
uses: actions/cache@v4
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle-

- name: 🤖 Run Android Tests
run: dart test test/base_test.dart test/android_test.dart
working-directory: packages/shorebird_tests

shorebird-ios-tests:
# iOS tests require macOS for Xcode
runs-on: macos-latest

name: 🍎 Shorebird iOS + Android Smoke Tests

steps:
- name: 📚 Git Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0

- name: 🎯 Setup Dart
uses: dart-lang/setup-dart@v1

- uses: actions/setup-java@v4
with:
distribution: "zulu"
java-version: "17"

- name: 📦 Cache Gradle
uses: actions/cache@v4
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle-

- name: 🍎 Run iOS Tests
run: dart test test/base_test.dart test/ios_test.dart
working-directory: packages/shorebird_tests

- name: 🤖 Run Android Smoke Test (macOS)
# Quick sanity check that Android builds work on macOS too
run: dart test test/android_test.dart --name "can build an apk"
working-directory: packages/shorebird_tests
9 changes: 8 additions & 1 deletion DEPS
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,10 @@ vars = {
'skia_git': 'https://skia.googlesource.com',
'llvm_git': 'https://llvm.googlesource.com',
'skia_revision': '837be28dd21818d2169e1e6789e89e771a55f01d',
"dart_sdk_revision": "912ee5b7a1b5c7a41079ea55888031ebf9381ddf",
"dart_sdk_git": "git@github.com:shorebirdtech/dart-sdk.git",
"updater_git": "https://github.com/shorebirdtech/updater.git",
"updater_rev": "8691c8f60e69f8eb1f35361f4a22e8c9a7fdf93c",

# WARNING: DO NOT EDIT canvaskit_cipd_instance MANUALLY
# See `lib/web_ui/README.md` for how to roll CanvasKit to a new version.
Expand Down Expand Up @@ -294,7 +298,7 @@ deps = {
# Var('flutter_git') + '/third_party/protobuf-gn' + '@' + Var('dart_protobuf_gn_rev'),

'engine/src/flutter/third_party/dart':
Var('dart_git') + '/sdk.git' + '@' + Var('dart_revision'),
Var('dart_sdk_git') + '@' + Var('dart_sdk_revision'),

# WARNING: Unused Dart dependencies in the list below till "WARNING:" marker are removed automatically - see create_updated_flutter_deps.py.

Expand Down Expand Up @@ -491,6 +495,9 @@ deps = {
'engine/src/flutter/third_party/ocmock':
Var('flutter_git') + '/third_party/ocmock' + '@' + Var('ocmock_rev'),

'engine/src/flutter/third_party/updater':
Var('updater_git') + '@' + Var('updater_rev'),

'engine/src/flutter/third_party/libjpeg-turbo/src':
Var('flutter_git') + '/third_party/libjpeg-turbo' + '@' + '0fb821f3b2e570b2783a94ccd9a2fb1f4916ae9f',

Expand Down
2 changes: 1 addition & 1 deletion bin/internal/engine.version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
e4b8dca3f1b4ede4c30371002441c88c12187ed6
9899da7fccd15f22e047bd2a87e9ed6d6f09daeb
2 changes: 1 addition & 1 deletion bin/internal/update_dart_sdk.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ if ((Test-Path $engineStamp) -and ($engineVersion -eq (Get-Content $engineStamp)

$dartSdkBaseUrl = $Env:FLUTTER_STORAGE_BASE_URL
if (-not $dartSdkBaseUrl) {
$dartSdkBaseUrl = "https://storage.googleapis.com"
$dartSdkBaseUrl = "https://download.shorebird.dev"
}
if ($engineRealm) {
$dartSdkBaseUrl = "$dartSdkBaseUrl/$engineRealm"
Expand Down
2 changes: 1 addition & 1 deletion bin/internal/update_dart_sdk.sh
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ if [ ! -f "$ENGINE_STAMP" ] || [ "$ENGINE_VERSION" != `cat "$ENGINE_STAMP"` ]; t
FIND=find
fi

DART_SDK_BASE_URL="${FLUTTER_STORAGE_BASE_URL:-https://storage.googleapis.com}${ENGINE_REALM:+/$ENGINE_REALM}"
DART_SDK_BASE_URL="${FLUTTER_STORAGE_BASE_URL:-https://download.shorebird.dev}${ENGINE_REALM:+/$ENGINE_REALM}"
DART_SDK_URL="$DART_SDK_BASE_URL/flutter_infra_release/flutter/$ENGINE_VERSION/$DART_ZIP_NAME"

# if the sdk path exists, copy it to a temporary location
Expand Down
2 changes: 1 addition & 1 deletion dev/bots/post_process_docs.dart
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ Future<void> postProcess() async {
await runProcessWithValidations(<String>[
'curl',
'-L',
'https://storage.googleapis.com/flutter_infra_release/flutter/$revision/api_docs.zip',
'https://download.shorebird.dev/flutter_infra_release/flutter/$revision/api_docs.zip',
'--output',
zipDestination,
'--fail',
Expand Down
2 changes: 1 addition & 1 deletion dev/bots/unpublish_package.dart
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ import 'package:process/process.dart';
const String gsBase = 'gs://flutter_infra_release';
const String releaseFolder = '/releases';
const String gsReleaseFolder = '$gsBase$releaseFolder';
const String baseUrl = 'https://storage.googleapis.com/flutter_infra_release';
const String baseUrl = 'https://download.shorebird.dev/flutter_infra_release';

/// Exception class for when a process fails to run, so we can catch
/// it and provide something more readable than a stack trace.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ dependencyResolutionManagement {
repositories {
google()
mavenCentral()
def flutterStorageUrl = System.getenv("FLUTTER_STORAGE_BASE_URL") ?: "https://storage.googleapis.com"
def flutterStorageUrl = System.getenv("FLUTTER_STORAGE_BASE_URL") ?: "https://download.shorebird.dev"
maven {
url = uri("$flutterStorageUrl/download.flutter.io")
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ dependencyResolutionManagement {
repositories {
google()
mavenCentral()
val flutterStorageUrl = System.getenv("FLUTTER_STORAGE_BASE_URL") ?: "https://storage.googleapis.com"
val flutterStorageUrl = System.getenv("FLUTTER_STORAGE_BASE_URL") ?: "https://download.shorebird.dev"
maven("$flutterStorageUrl/download.flutter.io")
}
}
Expand Down
4 changes: 2 additions & 2 deletions dev/tools/create_api_docs.dart
Original file line number Diff line number Diff line change
Expand Up @@ -923,8 +923,8 @@ class PlatformDocGenerator {

for (final String platform in kPlatformDocs.keys) {
final String zipFile = kPlatformDocs[platform]!.zipName;
final url =
'https://storage.googleapis.com/${realm}flutter_infra_release/flutter/$engineRevision/$zipFile';
final String url =
'https://download.shorebird.dev/${realm}flutter_infra_release/flutter/$engineRevision/$zipFile';
await _extractDocs(url, platform, kPlatformDocs[platform]!, outputDir);
}
}
Expand Down
10 changes: 9 additions & 1 deletion engine/src/build/config/compiler/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -443,7 +443,10 @@ config("compiler") {
# Example PR: https://github.com/dart-lang/native/pull/1615
ldflags += [
"-Wl,--no-undefined",
"-Wl,--exclude-libs,ALL",

# TODO: Terrible hack, but otherwise libupdater.a symbols can't
# be exported from libflutter.so, even when added to android_exports.lst.
# "-Wl,--exclude-libs,ALL",

# Enable identical code folding to reduce size.
"-Wl,--icf=all",
Expand Down Expand Up @@ -646,6 +649,8 @@ config("runtime_library") {
ldflags += [ "-Wl,--warn-shared-textrel" ]

libs += [
# Rust requires libunwind.
"unwind",
"c",
"dl",
"m",
Expand All @@ -660,6 +665,9 @@ config("runtime_library") {
} else if (current_cpu == "x86") {
current_android_cpu = "i686"
}
# libunwind.a is located in the respective android cpu subdirectories.
# The clang version needs to match the version in the lib_dirs line above.
lib_dirs += [ "${android_toolchain_root}/lib/clang/19/lib/linux/${current_android_cpu}/" ]
libs += [ "clang_rt.builtins-${current_android_cpu}-android" ]
}

Expand Down
5 changes: 4 additions & 1 deletion engine/src/build/toolchain/win/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -204,8 +204,11 @@ template("msvc_toolchain") {
expname = "${dllname}.exp"
pdbname = "${dllname}.pdb"
rspfile = "${dllname}.rsp"
# .def files are used to export symbols from the DLL. This arg will be
# removed by the python tool wrapper if the .def file doesn't exist.
deffile = "${dllname}.def"

link_command = "\"$python_path\" $tool_wrapper_path link-wrapper $env False link.exe /nologo /IMPLIB:$libname /DLL /OUT:$dllname /PDB:${dllname}.pdb @$rspfile"
link_command = "\"$python_path\" $tool_wrapper_path link-wrapper $env False link.exe /nologo /IMPLIB:$libname /DLL /OUT:$dllname /PDB:${dllname}.pdb /DEF:$deffile @$rspfile"

# TODO(brettw) support manifests
#manifest_command = "\"$python_path\" $tool_wrapper_path manifest-wrapper $env mt.exe -nologo -manifest $manifests -out:${dllname}.manifest"
Expand Down
11 changes: 11 additions & 0 deletions engine/src/build/toolchain/win/tool_wrapper.py
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,17 @@ def ExecLinkWrapper(self, arch, use_separate_mspdbsrv, *args):
self._UseSeparateMspdbsrv(env, args)
if sys.platform == 'win32':
args = list(args) # *args is a tuple by default, which is read-only.

# Remove the /DEF arg if not provided. We would ideally be able to do this
# in build\toolchain\win\BUILD.gn, but there doesn't seem to be a way to
# conditionally add args to the command line based on whether a file exists
# or not, so we do it here instead.
def_arg_prefix = "/DEF:"
for arg in args:
if arg.startswith(def_arg_prefix):
def_file = arg[len(def_arg_prefix):]
if not os.path.exists(def_file):
args.remove(arg)
args[0] = args[0].replace('/', '\\')
# https://docs.python.org/2/library/subprocess.html:
# "On Unix with shell=True [...] if args is a sequence, the first item
Expand Down
27 changes: 20 additions & 7 deletions engine/src/flutter/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,9 @@ group("flutter") {

# path_ops
"//flutter/tools/path_ops",

# Built alongside gen_snapshot arm64 targets.
"$dart_src/runtime/bin:analyze_snapshot",
]

if (host_os == "linux" || host_os == "mac") {
Expand All @@ -127,13 +130,6 @@ group("flutter") {
]
}

if (host_os == "linux") {
public_deps += [
# Built alongside gen_snapshot for 64 bit targets
"$dart_src/runtime/bin:analyze_snapshot",
]
}

if (full_dart_sdk) {
public_deps += [ "//flutter/web_sdk" ]
}
Expand Down Expand Up @@ -213,6 +209,7 @@ group("unittests") {
"//flutter/runtime:no_dart_plugin_registrant_unittests",
"//flutter/runtime:runtime_unittests",
"//flutter/shell/common:shell_unittests",
"//flutter/shell/common/shorebird:shorebird_unittests",
"//flutter/shell/geometry:geometry_unittests",
"//flutter/shell/platform/embedder:embedder_a11y_unittests",
"//flutter/shell/platform/embedder:embedder_proctable_unittests",
Expand Down Expand Up @@ -344,3 +341,19 @@ if (host_os == "win") {
outputs = [ "$root_build_dir/gen_snapshot/gen_snapshot.exe" ]
}
}

# A top-level target for analyze_snapshot, modeled after the gen_snapshot
# target above.
if (host_os == "win") {
_analyze_snapshot_target =
"$dart_src/runtime/bin:analyze_snapshot($host_toolchain)"

copy("analyze_snapshot") {
deps = [ _analyze_snapshot_target ]

analyze_snapshot_out_dir =
get_label_info(_analyze_snapshot_target, "root_out_dir")
sources = [ "$analyze_snapshot_out_dir/analyze_snapshot.exe" ]
outputs = [ "$root_build_dir/analyze_snapshot/analyze_snapshot.exe" ]
}
}
Loading
Loading