Reapply flutter_assets (#13567)

* Revert "Revert engine (#13547)"

This reverts commit ee65db11d4618620ddc286f4618b707239205136.

* Keep flaky mark
diff --git a/packages/flutter_tools/lib/src/ios/mac.dart b/packages/flutter_tools/lib/src/ios/mac.dart
index eb32508..f7b87ff 100644
--- a/packages/flutter_tools/lib/src/ios/mac.dart
+++ b/packages/flutter_tools/lib/src/ios/mac.dart
@@ -206,6 +206,9 @@
   bool codesign: true,
   bool usesTerminalUi: true,
 }) async {
+  if (!await upgradePbxProjWithFlutterAssets(app.name))
+    return new XcodeBuildResult(success: false);
+
   if (!_checkXcodeVersion())
     return new XcodeBuildResult(success: false);
 
@@ -492,3 +495,53 @@
   final Map<String, dynamic> json = <String, dynamic>{ 'services' : jsonServices };
   manifest.writeAsStringSync(JSON.encode(json), mode: FileMode.WRITE, flush: true);
 }
+
+Future<bool> upgradePbxProjWithFlutterAssets(String app) async {
+  final File xcodeProjectFile = fs.file(fs.path.join('ios', 'Runner.xcodeproj',
+                                                     'project.pbxproj'));
+  assert(await xcodeProjectFile.exists());
+  final List<String> lines = await xcodeProjectFile.readAsLines();
+
+  if (lines.any((String line) => line.contains('path = Flutter/flutter_assets')))
+    return true;
+
+  final String l1 = '		3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };';
+  final String l2 = '		2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */ = {isa = PBXBuildFile; fileRef = 2D5378251FAA1A9400D5DBA9 /* flutter_assets */; };';
+  final String l3 = '		3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };';
+  final String l4 = '		2D5378251FAA1A9400D5DBA9 /* flutter_assets */ = {isa = PBXFileReference; lastKnownFileType = folder; name = flutter_assets; path = Flutter/flutter_assets; sourceTree = SOURCE_ROOT; };';
+  final String l5 = '				3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,';
+  final String l6 = '				2D5378251FAA1A9400D5DBA9 /* flutter_assets */,';
+  final String l7 = '				3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,';
+  final String l8 = '				2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */,';
+
+
+  printStatus("Upgrading project.pbxproj of $app' to include the "
+              "'flutter_assets' directory");
+
+  if (!lines.contains(l1) || !lines.contains(l3) ||
+      !lines.contains(l5) || !lines.contains(l7)) {
+    printError('Automatic upgrade of project.pbxproj failed.');
+    printError(' To manually upgrade, open ios/Runner.xcodeproj/project.pbxproj:');
+    printError(' Add the following line in the "PBXBuildFile" section');
+    printError(l2);
+    printError(' Add the following line in the "PBXFileReference" section');
+    printError(l4);
+    printError(' Add the following line in the "children" list of the "Flutter" group in the "PBXGroup" section');
+    printError(l6);
+    printError(' Add the following line in the "files" list of "Resources" in the "PBXResourcesBuildPhase" section');
+    printError(l8);
+    return false;
+  }
+
+  lines.insert(lines.indexOf(l1) + 1, l2);
+  lines.insert(lines.indexOf(l3) + 1, l4);
+  lines.insert(lines.indexOf(l5) + 1, l6);
+  lines.insert(lines.indexOf(l7) + 1, l8);
+
+  // TODO(zarah): Remove lines with 'app.flx' once 'app.flx' is not used anymore.
+
+  final StringBuffer buffer = new StringBuffer();
+  lines.forEach(buffer.writeln);
+  await xcodeProjectFile.writeAsString(buffer.toString());
+  return true;
+}
\ No newline at end of file