From 6804b8e9a87a374b1664e88a1626d13c6420f9d5 Mon Sep 17 00:00:00 2001 From: Tony Date: Fri, 26 Jun 2026 02:31:32 +0800 Subject: [PATCH] Build engine artifacts without Flutter prebuilt Dart SDK --- .github/workflows/open-shorebird-ci.yml | 31 ++++++++++++------ docs/CI.md | 15 +++++---- flutter | 2 +- scripts/verify_ci_workflow.rb | 32 ++++++++++++++++++- scripts/verify_ios_interpreter_route.sh | 2 ++ .../verify_ios_interpreter_route_validator.sh | 2 ++ 6 files changed, 66 insertions(+), 18 deletions(-) diff --git a/.github/workflows/open-shorebird-ci.yml b/.github/workflows/open-shorebird-ci.yml index e22b9cf..37911b5 100644 --- a/.github/workflows/open-shorebird-ci.yml +++ b/.github/workflows/open-shorebird-ci.yml @@ -790,7 +790,8 @@ jobs: ./flutter/tools/gn \ --runtime-mode=release \ --target-dir=linux_release_x64 \ - --gn-args='dart_dynamic_modules=false dart_enable_aot_patching=true dart_enable_shorebird_interpreter=false shorebird_enable_aot_patching=true shorebird_use_interpreter=false' + --no-prebuilt-dart-sdk \ + --gn-args='dart_dynamic_modules=false dart_enable_aot_patching=true dart_enable_shorebird_interpreter=false shorebird_enable_aot_patching=true shorebird_use_interpreter=false flutter_prebuilt_dart_sdk=false' - name: Build Linux engine working-directory: flutter/engine/src @@ -808,7 +809,8 @@ jobs: dart_enable_aot_patching=true \ dart_enable_shorebird_interpreter=false \ shorebird_enable_aot_patching=true \ - shorebird_use_interpreter=false + shorebird_use_interpreter=false \ + flutter_prebuilt_dart_sdk=false - name: Package Linux engine artifacts run: | @@ -950,7 +952,8 @@ jobs: --runtime-mode=release \ --android-cpu=arm64 \ --target-dir=android_release_arm64 \ - --gn-args='dart_dynamic_modules=false dart_enable_aot_patching=true dart_enable_shorebird_interpreter=false shorebird_enable_aot_patching=true shorebird_use_interpreter=false' + --no-prebuilt-dart-sdk \ + --gn-args='dart_dynamic_modules=false dart_enable_aot_patching=true dart_enable_shorebird_interpreter=false shorebird_enable_aot_patching=true shorebird_use_interpreter=false flutter_prebuilt_dart_sdk=false' - name: Build Android engine working-directory: flutter/engine/src @@ -969,7 +972,8 @@ jobs: dart_enable_aot_patching=true \ dart_enable_shorebird_interpreter=false \ shorebird_enable_aot_patching=true \ - shorebird_use_interpreter=false + shorebird_use_interpreter=false \ + flutter_prebuilt_dart_sdk=false - name: Package Android engine artifacts run: | @@ -1111,7 +1115,8 @@ jobs: --web \ --runtime-mode=release \ --target-dir=wasm_release \ - --gn-args='dart_dynamic_modules=false' + --no-prebuilt-dart-sdk \ + --gn-args='dart_dynamic_modules=false flutter_prebuilt_dart_sdk=false' - name: Build web SDK working-directory: flutter/engine/src @@ -1121,7 +1126,8 @@ jobs: run: | ./scripts/verify_engine_args.sh \ flutter/engine/src/out/wasm_release/args.gn \ - dart_dynamic_modules=false + dart_dynamic_modules=false \ + flutter_prebuilt_dart_sdk=false - name: Package web SDK artifact run: | @@ -1228,7 +1234,8 @@ jobs: --mac-cpu=arm64 \ --target-dir=host_release_arm64 \ --shorebird-interpreter \ - --gn-args='dart_dynamic_modules=false dart_enable_aot_patching=true dart_enable_shorebird_interpreter=true shorebird_use_interpreter=true' + --no-prebuilt-dart-sdk \ + --gn-args='dart_dynamic_modules=false dart_enable_aot_patching=true dart_enable_shorebird_interpreter=true shorebird_use_interpreter=true flutter_prebuilt_dart_sdk=false' - name: Build host snapshotter working-directory: flutter/engine/src @@ -1241,7 +1248,9 @@ jobs: --ios \ --runtime-mode=release \ --target-dir=ios_release \ - --shorebird-interpreter + --shorebird-interpreter \ + --no-prebuilt-dart-sdk \ + --gn-args='flutter_prebuilt_dart_sdk=false' - name: Build iOS engine working-directory: flutter/engine/src @@ -1261,7 +1270,8 @@ jobs: --runtime-mode=release \ --mac-cpu=arm64 \ --target-dir=macos_release_arm64 \ - --gn-args='dart_dynamic_modules=false dart_enable_aot_patching=true dart_enable_shorebird_interpreter=false shorebird_enable_aot_patching=true shorebird_use_interpreter=false' + --no-prebuilt-dart-sdk \ + --gn-args='dart_dynamic_modules=false dart_enable_aot_patching=true dart_enable_shorebird_interpreter=false shorebird_enable_aot_patching=true shorebird_use_interpreter=false flutter_prebuilt_dart_sdk=false' - name: Build macOS engine working-directory: flutter/engine/src @@ -1279,7 +1289,8 @@ jobs: dart_enable_aot_patching=true \ dart_enable_shorebird_interpreter=false \ shorebird_enable_aot_patching=true \ - shorebird_use_interpreter=false + shorebird_use_interpreter=false \ + flutter_prebuilt_dart_sdk=false - name: Package iOS engine artifacts run: | diff --git a/docs/CI.md b/docs/CI.md index c31cee7..4bd2490 100644 --- a/docs/CI.md +++ b/docs/CI.md @@ -441,12 +441,15 @@ verifies the Android artifacts/symbols zips, `flutter.jar`, `libflutter.so`, host snapshot/analyzer tools, args file, manifest, and mirror subtree. `web-sdk` builds the Flutter web SDK archive from `wasm_release` with -`dart_dynamic_modules=false` and uploads `flutter-web-sdk.zip`, a mirror-ready -copy of that SDK archive, `args.gn`, a manifest with the Flutter engine -revision, and a `.sha256` sidecar. Web is still not a Shorebird CodePush release -platform in this CLI/protocol; this job exists to keep the open Flutter SDK/web -artifacts buildable from the workspace. CI extracts the web SDK archive before -upload and verifies the SDK zip, args file, manifest, and mirror subtree. +`dart_dynamic_modules=false` and `flutter_prebuilt_dart_sdk=false`, then uploads +`flutter-web-sdk.zip`, a mirror-ready copy of that SDK archive, `args.gn`, a +manifest with the Flutter engine revision, and a `.sha256` sidecar. The engine +and web jobs use `--no-prebuilt-dart-sdk` because the open workspace disables +Flutter's private prebuilt Dart SDK download path and builds from the linked +Dart checkout instead. Web is still not a Shorebird CodePush release platform +in this CLI/protocol; this job exists to keep the open Flutter SDK/web artifacts +buildable from the workspace. CI extracts the web SDK archive before upload and +verifies the SDK zip, args file, manifest, and mirror subtree. Set `run_gclient_sync=false` only for debugging a runner image that already has all gclient-managed dependencies restored. diff --git a/flutter b/flutter index 3f70a0e..4b30ef3 160000 --- a/flutter +++ b/flutter @@ -1 +1 @@ -Subproject commit 3f70a0e1761f266329163dc972b8ffdfb7c5e7b4 +Subproject commit 4b30ef34f812e355cd217a3e4670f7e1bcd9aa39 diff --git a/scripts/verify_ci_workflow.rb b/scripts/verify_ci_workflow.rb index 0469650..95a04ed 100755 --- a/scripts/verify_ci_workflow.rb +++ b/scripts/verify_ci_workflow.rb @@ -196,6 +196,8 @@ required_files = %w[ flutter/dev/tools/create_api_docs.dart flutter/engine/src/flutter/build/zip_bundle.gni flutter/engine/src/flutter/runtime/dart_isolate.cc + flutter/engine/src/flutter/runtime/shorebird/BUILD.gn + flutter/engine/src/flutter/shell/platform/embedder/BUILD.gn flutter/engine/src/flutter/lib/web_ui/dev/steps/copy_artifacts_step.dart flutter/packages/shorebird_tests/test/shorebird_tests.dart updater/library/src/config.rs @@ -397,6 +399,14 @@ flutter_engine_archives_build = read_repo_file( repo_root, 'flutter/engine/src/flutter/build/archives/BUILD.gn' ) +flutter_runtime_shorebird_build = read_repo_file( + repo_root, + 'flutter/engine/src/flutter/runtime/shorebird/BUILD.gn' +) +flutter_embedder_build = read_repo_file( + repo_root, + 'flutter/engine/src/flutter/shell/platform/embedder/BUILD.gn' +) flutter_linux_build = read_repo_file( repo_root, 'flutter/engine/src/flutter/shell/platform/linux/BUILD.gn' @@ -944,6 +954,14 @@ assert!( !flutter_dart_isolate.include?('#include "flutter/shell/common/shorebird/shorebird.h"'), 'dart_isolate.cc must avoid depending on the full Shorebird wrapper target so GN header checks pass' ) +assert!( + flutter_runtime_shorebird_build.include?('$dart_src/runtime/bin:shared_object_loaders') && + !flutter_runtime_shorebird_build.include?('$dart_src/runtime/bin:elf_loader') && + flutter_embedder_build.include?(%q("$dart_src/runtime/bin:common_embedder_dart_io", + "$dart_src/runtime/bin:shared_object_loaders")) && + !flutter_embedder_build.include?('if (is_ios || is_mac)'), + 'Shorebird patch cache and embedder targets must depend on shared_object_loaders so GN header checks allow both ELF and Mach-O loader includes' +) assert!( flutter_web_ui_copy_artifacts.include?("io.Platform.environment['FLUTTER_STORAGE_BASE_URL']") && flutter_web_ui_copy_artifacts.include?('http://localhost:8080/download.flutter.io') && @@ -1923,7 +1941,9 @@ end assert!( run_text_by_job.fetch('ios-engine').include?('--shorebird-interpreter') && - run_text_by_job.fetch('ios-engine').include?("--gn-args='dart_dynamic_modules=false dart_enable_aot_patching=true dart_enable_shorebird_interpreter=true shorebird_use_interpreter=true'") && + run_text_by_job.fetch('ios-engine').include?('--no-prebuilt-dart-sdk') && + run_text_by_job.fetch('ios-engine').include?("--gn-args='dart_dynamic_modules=false dart_enable_aot_patching=true dart_enable_shorebird_interpreter=true shorebird_use_interpreter=true flutter_prebuilt_dart_sdk=false'") && + run_text_by_job.fetch('ios-engine').include?("--gn-args='flutter_prebuilt_dart_sdk=false'") && run_text_by_job.fetch('ios-engine').include?('verify_ios_interpreter_route.sh') && run_text_by_job.fetch('ios-engine').include?('test -x flutter/engine/src/out/host_release_arm64/gen_snapshot') && run_text_by_job.fetch('ios-engine').include?('host_release_arm64/gen_snapshot') && @@ -1939,6 +1959,7 @@ assert!( verify_ios_interpreter_route.include?('json.load(file)') && verify_ios_interpreter_route.include?('metadata = artifact.get("metadata")') && verify_ios_interpreter_route.scan('require_gn_value "$args_file" dart_enable_aot_patching true').length >= 2 && + verify_ios_interpreter_route.scan('require_gn_value "$args_file" flutter_prebuilt_dart_sdk false').length >= 2 && verify_ios_interpreter_route.include?('sub("[[:space:]]*$", "", value)') && verify_ios_interpreter_route.include?('require(metadata, "runtime_mode", "dart-bytecode-interpreter", "metadata")') && verify_ios_interpreter_route.include?('require(metadata, "target_os", "ios", "metadata")') && @@ -1955,6 +1976,7 @@ assert!( verify_ios_interpreter_route_validator.scan('dart_enable_aot_patching = true').length >= 2 && verify_ios_interpreter_route_validator.include?('dart_enable_aot_patching = false') && verify_ios_interpreter_route_validator.include?('shorebird_use_interpreter = false') && + verify_ios_interpreter_route_validator.scan('flutter_prebuilt_dart_sdk = false').length >= 2 && verify_ios_interpreter_route_validator.include?('write_artifact "$bad_runtime" "dart-dynamic-modules"') && verify_ios_interpreter_route_validator.include?('write_artifact "$bad_target" "dart-bytecode-interpreter" "android"') && verify_ios_interpreter_route_validator.include?('unexpectedly accepted malformed JSON') && @@ -1971,11 +1993,13 @@ assert!( ) assert!( run_text_by_job.fetch('linux-engine').include?('verify_engine_args.sh') && + run_text_by_job.fetch('linux-engine').include?('--no-prebuilt-dart-sdk') && run_text_by_job.fetch('linux-engine').include?('flutter/engine/src/out/linux_release_x64/args.gn') && run_text_by_job.fetch('linux-engine').include?('dart_enable_aot_patching=true') && run_text_by_job.fetch('linux-engine').include?('dart_enable_shorebird_interpreter=false') && run_text_by_job.fetch('linux-engine').include?('shorebird_enable_aot_patching=true') && run_text_by_job.fetch('linux-engine').include?('shorebird_use_interpreter=false') && + run_text_by_job.fetch('linux-engine').include?('flutter_prebuilt_dart_sdk=false') && run_text_by_job.fetch('linux-engine').include?('linux-x64-flutter-gtk.zip') && run_text_by_job.fetch('linux-engine').include?('flutter_patched_sdk_product.zip') && run_text_by_job.fetch('linux-engine').include?('mirror/shorebird/flutter_infra_release/flutter/${engine_revision}/linux-x64-release/artifacts.zip') && @@ -1984,29 +2008,35 @@ assert!( ) assert!( run_text_by_job.fetch('android-engine').include?('verify_engine_args.sh') && + run_text_by_job.fetch('android-engine').include?('--no-prebuilt-dart-sdk') && run_text_by_job.fetch('android-engine').include?('flutter/engine/src/out/android_release_arm64/args.gn') && run_text_by_job.fetch('android-engine').include?('dart_enable_aot_patching=true') && run_text_by_job.fetch('android-engine').include?('dart_enable_shorebird_interpreter=false') && run_text_by_job.fetch('android-engine').include?('shorebird_enable_aot_patching=true') && run_text_by_job.fetch('android-engine').include?('shorebird_use_interpreter=false') && + run_text_by_job.fetch('android-engine').include?('flutter_prebuilt_dart_sdk=false') && run_text_by_job.fetch('android-engine').include?('mirror/shorebird/flutter_infra_release/flutter/${engine_revision}/android-arm64-release/artifacts.zip') && run_text_by_job.fetch('android-engine').include?('mirror/shorebird/flutter_infra_release/flutter/${engine_revision}/android-arm64-release/symbols.zip'), 'Android engine job must build and verify the native AOT patch runtime without DDM or interpreter mode' ) assert!( run_text_by_job.fetch('web-sdk').include?('verify_engine_args.sh') && + run_text_by_job.fetch('web-sdk').include?('--no-prebuilt-dart-sdk') && run_text_by_job.fetch('web-sdk').include?('flutter/engine/src/out/wasm_release/args.gn') && run_text_by_job.fetch('web-sdk').include?('dart_dynamic_modules=false') && + run_text_by_job.fetch('web-sdk').include?('flutter_prebuilt_dart_sdk=false') && run_text_by_job.fetch('web-sdk').include?('mirror/shorebird/flutter_infra_release/flutter/${engine_revision}/flutter-web-sdk.zip'), 'web SDK job must explicitly disable and verify DDM' ) assert!( run_text_by_job.fetch('ios-engine').include?('verify_engine_args.sh') && + run_text_by_job.fetch('ios-engine').include?('--no-prebuilt-dart-sdk') && run_text_by_job.fetch('ios-engine').include?('flutter/engine/src/out/macos_release_arm64/args.gn') && run_text_by_job.fetch('ios-engine').include?('dart_enable_aot_patching=true') && run_text_by_job.fetch('ios-engine').include?('dart_enable_shorebird_interpreter=false') && run_text_by_job.fetch('ios-engine').include?('shorebird_enable_aot_patching=true') && run_text_by_job.fetch('ios-engine').include?('shorebird_use_interpreter=false') && + run_text_by_job.fetch('ios-engine').include?('flutter_prebuilt_dart_sdk=false') && run_text_by_job.fetch('ios-engine').include?('FlutterMacOS.framework.zip') && run_text_by_job.fetch('ios-engine').include?('flutter_patched_sdk_product.zip') && run_text_by_job.fetch('ios-engine').include?('mirror/shorebird/flutter_infra_release/flutter/${engine_revision}/darwin-arm64-release/FlutterMacOS.framework.zip'), diff --git a/scripts/verify_ios_interpreter_route.sh b/scripts/verify_ios_interpreter_route.sh index c7cbfed..cf8c131 100755 --- a/scripts/verify_ios_interpreter_route.sh +++ b/scripts/verify_ios_interpreter_route.sh @@ -71,6 +71,7 @@ verify_ios_engine_args() { require_gn_value "$args_file" dart_enable_shorebird_interpreter true require_gn_value "$args_file" shorebird_use_interpreter true require_gn_value "$args_file" shorebird_enable_aot_patching false + require_gn_value "$args_file" flutter_prebuilt_dart_sdk false } verify_host_engine_args() { @@ -82,6 +83,7 @@ verify_host_engine_args() { require_gn_value "$args_file" dart_enable_aot_patching true require_gn_value "$args_file" dart_enable_shorebird_interpreter true require_gn_value "$args_file" shorebird_use_interpreter true + require_gn_value "$args_file" flutter_prebuilt_dart_sdk false } app_bundle_from_ipa() { diff --git a/scripts/verify_ios_interpreter_route_validator.sh b/scripts/verify_ios_interpreter_route_validator.sh index 64f7947..cef0330 100755 --- a/scripts/verify_ios_interpreter_route_validator.sh +++ b/scripts/verify_ios_interpreter_route_validator.sh @@ -21,6 +21,7 @@ shorebird_use_interpreter = false shorebird_use_interpreter = true shorebird_enable_aot_patching = true shorebird_enable_aot_patching = false +flutter_prebuilt_dart_sdk = false EOF cat > "$HOST_ENGINE_DIR/args.gn" <<'EOF' @@ -33,6 +34,7 @@ dart_enable_shorebird_interpreter = false dart_enable_shorebird_interpreter = true shorebird_use_interpreter = false shorebird_use_interpreter = true +flutter_prebuilt_dart_sdk = false EOF write_artifact() {