Clean App.framework, Generated.xcconfig, flutter_export_environment.sh (#51532)

diff --git a/packages/flutter_tools/lib/src/commands/clean.dart b/packages/flutter_tools/lib/src/commands/clean.dart
index 5035f9c..da967b0 100644
--- a/packages/flutter_tools/lib/src/commands/clean.dart
+++ b/packages/flutter_tools/lib/src/commands/clean.dart
@@ -43,20 +43,16 @@
 
     deleteFile(flutterProject.dartTool);
 
-    final Directory androidEphemeralDirectory = flutterProject.android.ephemeralDirectory;
-    deleteFile(androidEphemeralDirectory);
+    deleteFile(flutterProject.android.ephemeralDirectory);
 
-    final Directory iosEphemeralDirectory = flutterProject.ios.ephemeralDirectory;
-    deleteFile(iosEphemeralDirectory);
+    deleteFile(flutterProject.ios.ephemeralDirectory);
+    deleteFile(flutterProject.ios.generatedXcodePropertiesFile);
+    deleteFile(flutterProject.ios.generatedEnvironmentVariableExportScript);
+    deleteFile(flutterProject.ios.compiledDartFramework);
 
-    final Directory linuxEphemeralDirectory = flutterProject.linux.ephemeralDirectory;
-    deleteFile(linuxEphemeralDirectory);
-
-    final Directory macosEphemeralDirectory = flutterProject.macos.ephemeralDirectory;
-    deleteFile(macosEphemeralDirectory);
-
-    final Directory windowsEphemeralDirectory = flutterProject.windows.ephemeralDirectory;
-    deleteFile(windowsEphemeralDirectory);
+    deleteFile(flutterProject.linux.ephemeralDirectory);
+    deleteFile(flutterProject.macos.ephemeralDirectory);
+    deleteFile(flutterProject.windows.ephemeralDirectory);
 
     return const FlutterCommandResult(ExitStatus.success);
   }
@@ -73,7 +69,7 @@
       final Directory xcodeWorkspace = xcodeProject.xcodeWorkspace;
       final XcodeProjectInfo projectInfo = await xcodeProjectInterpreter.getInfo(xcodeWorkspace.parent.path);
       for (final String scheme in projectInfo.schemes) {
-        xcodeProjectInterpreter.cleanWorkspace(xcodeWorkspace.path, scheme);
+        await xcodeProjectInterpreter.cleanWorkspace(xcodeWorkspace.path, scheme);
       }
     } catch (error) {
       globals.printTrace('Could not clean Xcode workspace: $error');
diff --git a/packages/flutter_tools/lib/src/ios/mac.dart b/packages/flutter_tools/lib/src/ios/mac.dart
index 6e4971a..e6b3060 100644
--- a/packages/flutter_tools/lib/src/ios/mac.dart
+++ b/packages/flutter_tools/lib/src/ios/mac.dart
@@ -429,16 +429,6 @@
     result.stdout.contains('there are two concurrent builds running');
 }
 
-String readGeneratedXcconfig(String appPath) {
-  final String generatedXcconfigPath =
-      globals.fs.path.join(globals.fs.currentDirectory.path, appPath, 'Flutter', 'Generated.xcconfig');
-  final File generatedXcconfigFile = globals.fs.file(generatedXcconfigPath);
-  if (!generatedXcconfigFile.existsSync()) {
-    return null;
-  }
-  return generatedXcconfigFile.readAsStringSync();
-}
-
 Future<void> diagnoseXcodeBuildFailure(XcodeBuildResult result) async {
   if (result.xcodeBuildExecution != null &&
       result.xcodeBuildExecution.buildForPhysicalDevice &&
diff --git a/packages/flutter_tools/lib/src/ios/xcodeproj.dart b/packages/flutter_tools/lib/src/ios/xcodeproj.dart
index d415c39..108436a 100644
--- a/packages/flutter_tools/lib/src/ios/xcodeproj.dart
+++ b/packages/flutter_tools/lib/src/ios/xcodeproj.dart
@@ -357,8 +357,8 @@
     }
   }
 
-  void cleanWorkspace(String workspacePath, String scheme) {
-    _processUtils.runSync(<String>[
+  Future<void> cleanWorkspace(String workspacePath, String scheme) async {
+    await _processUtils.run(<String>[
       _executable,
       '-workspace',
       workspacePath,
diff --git a/packages/flutter_tools/lib/src/project.dart b/packages/flutter_tools/lib/src/project.dart
index 4a9944e..6da9674 100644
--- a/packages/flutter_tools/lib/src/project.dart
+++ b/packages/flutter_tools/lib/src/project.dart
@@ -567,6 +567,10 @@
     .childDirectory('Flutter')
     .childFile('Generated.xcconfig');
 
+  Directory get compiledDartFramework => _flutterLibRoot
+      .childDirectory('Flutter')
+      .childDirectory('App.framework');
+
   Directory get pluginRegistrantHost {
     return isModule
         ? _flutterLibRoot
diff --git a/packages/flutter_tools/test/commands.shard/hermetic/clean_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/clean_test.dart
index cecbc7d..766af14 100644
--- a/packages/flutter_tools/test/commands.shard/hermetic/clean_test.dart
+++ b/packages/flutter_tools/test/commands.shard/hermetic/clean_test.dart
@@ -44,7 +44,12 @@
 
         projectUnderTest.dartTool.createSync(recursive: true);
         projectUnderTest.android.ephemeralDirectory.createSync(recursive: true);
+
         projectUnderTest.ios.ephemeralDirectory.createSync(recursive: true);
+        projectUnderTest.ios.generatedXcodePropertiesFile.createSync(recursive: true);
+        projectUnderTest.ios.generatedEnvironmentVariableExportScript.createSync(recursive: true);
+        projectUnderTest.ios.compiledDartFramework.createSync(recursive: true);
+
         projectUnderTest.linux.ephemeralDirectory.createSync(recursive: true);
         projectUnderTest.macos.ephemeralDirectory.createSync(recursive: true);
         projectUnderTest.windows.ephemeralDirectory.createSync(recursive: true);
@@ -57,7 +62,12 @@
         expect(buildDirectory.existsSync(), isFalse);
         expect(projectUnderTest.dartTool.existsSync(), isFalse);
         expect(projectUnderTest.android.ephemeralDirectory.existsSync(), isFalse);
+
         expect(projectUnderTest.ios.ephemeralDirectory.existsSync(), isFalse);
+        expect(projectUnderTest.ios.generatedXcodePropertiesFile.existsSync(), isFalse);
+        expect(projectUnderTest.ios.generatedEnvironmentVariableExportScript.existsSync(), isFalse);
+        expect(projectUnderTest.ios.compiledDartFramework.existsSync(), isFalse);
+
         expect(projectUnderTest.linux.ephemeralDirectory.existsSync(), isFalse);
         expect(projectUnderTest.macos.ephemeralDirectory.existsSync(), isFalse);
         expect(projectUnderTest.windows.ephemeralDirectory.existsSync(), isFalse);
diff --git a/packages/flutter_tools/test/general.shard/ios/xcodeproj_test.dart b/packages/flutter_tools/test/general.shard/ios/xcodeproj_test.dart
index 19b2077..18f3be4 100644
--- a/packages/flutter_tools/test/general.shard/ios/xcodeproj_test.dart
+++ b/packages/flutter_tools/test/general.shard/ios/xcodeproj_test.dart
@@ -224,12 +224,12 @@
       'FLUTTER_XCODE_CODE_SIGN_STYLE': 'Manual',
       'FLUTTER_XCODE_ARCHS': 'arm64'
     });
-    when(processManager.runSync(
+    when(processManager.run(
       any,
       workingDirectory: anyNamed('workingDirectory')))
-      .thenReturn(ProcessResult(1, 0, '', ''));
-    xcodeProjectInterpreter.cleanWorkspace('workspace_path', 'Runner');
-    final List<dynamic> captured = verify(processManager.runSync(
+      .thenAnswer((_) => Future<ProcessResult>.value(ProcessResult(1, 0, '', '')));
+    await xcodeProjectInterpreter.cleanWorkspace('workspace_path', 'Runner');
+    final List<dynamic> captured = verify(processManager.run(
       captureAny,
       workingDirectory: anyNamed('workingDirectory'),
       environment: anyNamed('environment'))).captured;
diff --git a/packages/flutter_tools/test/src/context.dart b/packages/flutter_tools/test/src/context.dart
index 44a5e09..cc21105 100644
--- a/packages/flutter_tools/test/src/context.dart
+++ b/packages/flutter_tools/test/src/context.dart
@@ -386,7 +386,8 @@
   }
 
   @override
-  void cleanWorkspace(String workspacePath, String scheme) {
+  Future<void> cleanWorkspace(String workspacePath, String scheme) {
+    return null;
   }
 
   @override