diff --git a/.ci.yaml b/.ci.yaml
index e701a57..8b6f694 100755
--- a/.ci.yaml
+++ b/.ci.yaml
@@ -6,6 +6,7 @@
 # More information at:
 #  * https://github.com/flutter/cocoon/blob/main/CI_YAML.md
 enabled_branches:
+  - flutter-2.8-candidate.3
   - main
   - master
   - flutter-\d+\.\d+-candidate\.\d+
diff --git a/bin/internal/engine.version b/bin/internal/engine.version
index 19bc713..e4d51ed 100644
--- a/bin/internal/engine.version
+++ b/bin/internal/engine.version
@@ -1 +1 @@
-40a99c595137e4b2f5b2efa8ff343ea23c1e16b8
+890a5fca2e34db413be624fc83aeea8e61d42ce6
diff --git a/packages/flutter_tools/bin/podhelper.rb b/packages/flutter_tools/bin/podhelper.rb
index 6a8185e..97e073d 100644
--- a/packages/flutter_tools/bin/podhelper.rb
+++ b/packages/flutter_tools/bin/podhelper.rb
@@ -33,9 +33,6 @@
 def flutter_additional_ios_build_settings(target)
   return unless target.platform_name == :ios
 
-  # Return if it's not a Flutter plugin (transitive dependency).
-  return unless target.dependencies.any? { |dependency| dependency.name == 'Flutter' }
-
   # [target.deployment_target] is a [String] formatted as "8.0".
   inherit_deployment_target = target.deployment_target[/\d+/].to_i < 9
 
@@ -52,6 +49,14 @@
   release_framework_dir = File.expand_path(File.join(artifacts_dir, 'ios-release', 'Flutter.xcframework'), __FILE__)
 
   target.build_configurations.each do |build_configuration|
+    # Build both x86_64 and arm64 simulator archs for all dependencies. If a single plugin does not support arm64 simulators,
+    # the app and all frameworks will fall back to x86_64. Unfortunately that case is not detectable in this script.
+    # Therefore all pods must have a x86_64 slice available, or linking a x86_64 app will fail.
+    build_configuration.build_settings['ONLY_ACTIVE_ARCH'] = 'NO' if build_configuration.type == :debug
+
+    # Skip other updates if it's not a Flutter plugin (transitive dependency).
+    next unless target.dependencies.any? { |dependency| dependency.name == 'Flutter' }
+
     # Profile can't be derived from the CocoaPods build configuration. Use release framework (for linking only).
     configuration_engine_dir = build_configuration.type == :debug ? debug_framework_dir : release_framework_dir
     Dir.new(configuration_engine_dir).each_child do |xcframework_file|
diff --git a/packages/flutter_tools/test/integration.shard/ios_content_validation_test.dart b/packages/flutter_tools/test/integration.shard/ios_content_validation_test.dart
index 1d33156..e8cb730 100644
--- a/packages/flutter_tools/test/integration.shard/ios_content_validation_test.dart
+++ b/packages/flutter_tools/test/integration.shard/ios_content_validation_test.dart
@@ -16,6 +16,7 @@
 void main() {
   group('iOS app validation', () {
     String flutterRoot;
+    Directory pluginRoot;
     String projectRoot;
     String flutterBin;
     Directory tempDir;
@@ -29,18 +30,20 @@
         'flutter',
       );
 
+      // Test a plugin example app to allow plugins validation.
       processManager.runSync(<String>[
         flutterBin,
         ...getLocalEngineArguments(),
         'create',
         '--verbose',
         '--platforms=ios',
-        '-i',
-        'objc',
+        '-t',
+        'plugin',
         'hello',
       ], workingDirectory: tempDir.path);
 
-      projectRoot = tempDir.childDirectory('hello').path;
+      pluginRoot = tempDir.childDirectory('hello');
+      projectRoot = pluginRoot.childDirectory('example').path;
     });
 
     tearDownAll(() {
@@ -56,6 +59,7 @@
         File outputFlutterFrameworkBinary;
         Directory outputAppFramework;
         File outputAppFrameworkBinary;
+        File outputPluginFrameworkBinary;
 
         setUpAll(() {
           processManager.runSync(<String>[
@@ -85,11 +89,13 @@
 
           outputAppFramework = frameworkDirectory.childDirectory('App.framework');
           outputAppFrameworkBinary = outputAppFramework.childFile('App');
+
+          outputPluginFrameworkBinary = frameworkDirectory.childDirectory('hello.framework').childFile('hello');
         });
 
         testWithoutContext('flutter build ios builds a valid app', () {
-          // Should only contain Flutter.framework and App.framework.
-          expect(frameworkDirectory.listSync().length, 2);
+          expect(outputPluginFrameworkBinary, exists);
+
           expect(outputAppFrameworkBinary, exists);
           expect(outputAppFramework.childFile('Info.plist'), exists);
 
@@ -202,17 +208,61 @@
         }, skip: !platform.isMacOS || buildMode != BuildMode.release); // [intended] only makes sense on macos.
 
         testWithoutContext('validate obfuscation', () {
-          final ProcessResult grepResult = processManager.runSync(<String>[
+          // HelloPlugin class is present in project.
+          ProcessResult grepResult = processManager.runSync(<String>[
             'grep',
-            '-i',
-            'hello',
+            '-r',
+            'HelloPlugin',
+            pluginRoot.path,
+          ]);
+          // Matches exits 0.
+          expect(grepResult.exitCode, 0);
+
+          // Not present in binary.
+          grepResult = processManager.runSync(<String>[
+            'grep',
+            'HelloPlugin',
             outputAppFrameworkBinary.path,
           ]);
-          expect(grepResult.stdout, isNot(contains('matches')));
+          // Does not match exits 1.
+          expect(grepResult.exitCode, 1);
         });
       });
     }
 
+    testWithoutContext('builds all plugin architectures for simulator', () {
+      final ProcessResult buildSimulator = processManager.runSync(
+        <String>[
+          flutterBin,
+          ...getLocalEngineArguments(),
+          'build',
+          'ios',
+          '--simulator',
+          '--verbose',
+          '--no-codesign',
+        ],
+        workingDirectory: projectRoot,
+      );
+      expect(buildSimulator.exitCode, 0);
+
+      final File pluginFrameworkBinary = fileSystem.file(fileSystem.path.join(
+        projectRoot,
+        'build',
+        'ios',
+        'iphonesimulator',
+        'Runner.app',
+        'Frameworks',
+        'hello.framework',
+        'hello',
+      ));
+      expect(pluginFrameworkBinary, exists);
+      final ProcessResult archs = processManager.runSync(
+        <String>['file', pluginFrameworkBinary.path],
+      );
+      expect(archs.stdout, contains('Mach-O 64-bit dynamically linked shared library x86_64'));
+      expect(archs.stdout, contains('Mach-O 64-bit dynamically linked shared library arm64'));
+    });
+
     testWithoutContext('build for simulator with all available architectures', () {
       final ProcessResult buildSimulator = processManager.runSync(
         <String>[
@@ -250,6 +300,6 @@
       expect(archs.stdout, contains('Mach-O 64-bit dynamically linked shared library arm64'));
     });
   }, skip: !platform.isMacOS, // [intended] only makes sense for macos platform.
-     timeout: const Timeout(Duration(minutes: 5))
+     timeout: const Timeout(Duration(minutes: 7))
   );
 }
