Revert "Add iOS module template (#18830)" (#18902)

This reverts commit 8be198d8a086bc26a9b73536f5ebd7ee327a4f01 that broke the build.
diff --git a/examples/flutter_gallery/ios/Runner.xcodeproj/project.pbxproj b/examples/flutter_gallery/ios/Runner.xcodeproj/project.pbxproj
index d358991..edbd91c 100644
--- a/examples/flutter_gallery/ios/Runner.xcodeproj/project.pbxproj
+++ b/examples/flutter_gallery/ios/Runner.xcodeproj/project.pbxproj
@@ -182,8 +182,6 @@
 				TargetAttributes = {
 					97C146ED1CF9000F007C117D = {
 						CreatedOnToolsVersion = 7.3.1;
-						DevelopmentTeam = EQHXZ8M8AV;
-						ProvisioningStyle = Manual;
 					};
 				};
 			};
@@ -429,8 +427,6 @@
 			baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
 			buildSettings = {
 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
-				CODE_SIGN_STYLE = Manual;
-				DEVELOPMENT_TEAM = EQHXZ8M8AV;
 				ENABLE_BITCODE = NO;
 				FRAMEWORK_SEARCH_PATHS = (
 					"$(inherited)",
@@ -444,8 +440,6 @@
 				);
 				PRODUCT_BUNDLE_IDENTIFIER = io.flutter.examples.gallery;
 				PRODUCT_NAME = "$(TARGET_NAME)";
-				PROVISIONING_PROFILE = "89aa7622-6c03-475d-baed-b7ebcc3c63b2";
-				PROVISIONING_PROFILE_SPECIFIER = "Google Development";
 			};
 			name = Debug;
 		};
@@ -454,8 +448,6 @@
 			baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
 			buildSettings = {
 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
-				CODE_SIGN_STYLE = Manual;
-				DEVELOPMENT_TEAM = EQHXZ8M8AV;
 				ENABLE_BITCODE = NO;
 				FRAMEWORK_SEARCH_PATHS = (
 					"$(inherited)",
@@ -469,8 +461,6 @@
 				);
 				PRODUCT_BUNDLE_IDENTIFIER = io.flutter.examples.gallery;
 				PRODUCT_NAME = "$(TARGET_NAME)";
-				PROVISIONING_PROFILE = "89aa7622-6c03-475d-baed-b7ebcc3c63b2";
-				PROVISIONING_PROFILE_SPECIFIER = "Google Development";
 			};
 			name = Release;
 		};
diff --git a/packages/flutter_tools/bin/xcode_backend.sh b/packages/flutter_tools/bin/xcode_backend.sh
index 2041c4d..69770b0 100755
--- a/packages/flutter_tools/bin/xcode_backend.sh
+++ b/packages/flutter_tools/bin/xcode_backend.sh
@@ -83,20 +83,10 @@
   RunCommand mkdir -p -- "$derived_dir"
   AssertExists "$derived_dir"
 
+  RunCommand rm -rf -- "${derived_dir}/Flutter.framework"
   RunCommand rm -rf -- "${derived_dir}/App.framework"
-
-  if [[ -e "${project_path}/.ios" ]]; then
-    RunCommand rm -rf -- "${derived_dir}/engine"
-    mkdir "${derived_dir}/engine"
-    RunCommand cp -r -- "${framework_path}/Flutter.podspec" "${derived_dir}/engine"
-    RunCommand cp -r -- "${framework_path}/Flutter.framework" "${derived_dir}/engine"
-    RunCommand find "${derived_dir}/engine/Flutter.framework" -type f -exec chmod a-w "{}" \;
-  else
-    RunCommand rm -rf -- "${derived_dir}/Flutter.framework"
-    RunCommand cp -r -- "${framework_path}/Flutter.framework" "${derived_dir}"
-    RunCommand find "${derived_dir}/Flutter.framework" -type f -exec chmod a-w "{}" \;
-  fi
-
+  RunCommand cp -r -- "${framework_path}/Flutter.framework" "${derived_dir}"
+  RunCommand find "${derived_dir}/Flutter.framework" -type f -exec chmod a-w "{}" \;
   RunCommand pushd "${project_path}" > /dev/null
 
   AssertExists "${target_path}"
@@ -165,13 +155,7 @@
         -install_name '@rpath/App.framework/App' \
         -o "${derived_dir}/App.framework/App" -)"
   fi
-
-  local plistPath="${project_path}/ios/Flutter/AppFrameworkInfo.plist"
-  if [[ -e "${project_path}/.ios" ]]; then
-    plistPath="${project_path}/.ios/Flutter/AppFrameworkInfo.plist"
-  fi
-
-  RunCommand cp -- "$plistPath" "${derived_dir}/App.framework/Info.plist"
+  RunCommand cp -- "${project_path}/ios/Flutter/AppFrameworkInfo.plist" "${derived_dir}/App.framework/Info.plist"
 
   local precompilation_flag=""
   if [[ "$CURRENT_ARCH" != "x86_64" ]] && [[ "$build_mode" != "debug" ]]; then
diff --git a/packages/flutter_tools/lib/src/cache.dart b/packages/flutter_tools/lib/src/cache.dart
index b004f20..84915aa 100644
--- a/packages/flutter_tools/lib/src/cache.dart
+++ b/packages/flutter_tools/lib/src/cache.dart
@@ -169,19 +169,6 @@
     return fs.file(fs.path.join(getRoot().path, '$artifactName.stamp'));
   }
 
-  /// Returns `true` if either [file] is older than the tools stamp or if
-  /// [file] doesn't exist.
-  bool fileOlderThanToolsStamp(File file) {
-    if (!file.existsSync()) {
-      return true;
-    }
-    final File flutterToolsStamp = getStampFileFor('flutter_tools');
-    return flutterToolsStamp.existsSync() &&
-        flutterToolsStamp
-            .lastModifiedSync()
-            .isAfter(file.lastModifiedSync());
-  }
-
   bool isUpToDate() => _artifacts.every((CachedArtifact artifact) => artifact.isUpToDate());
 
   Future<String> getThirdPartyFile(String urlStr, String serviceName) async {
diff --git a/packages/flutter_tools/lib/src/commands/create.dart b/packages/flutter_tools/lib/src/commands/create.dart
index 0c69f18..3b3aefb 100644
--- a/packages/flutter_tools/lib/src/commands/create.dart
+++ b/packages/flutter_tools/lib/src/commands/create.dart
@@ -233,20 +233,20 @@
     }
   }
 
-  Future<int> _generateModule(String path, Map<String, dynamic> templateContext) async {
+  Future<int> _generateModule(String dirPath, Map<String, dynamic> templateContext) async {
     int generatedCount = 0;
     final String description = argResults.wasParsed('description')
         ? argResults['description']
         : 'A new flutter module project.';
     templateContext['description'] = description;
-    generatedCount += _renderTemplate(fs.path.join('module', 'common'), path, templateContext);
+    generatedCount += _renderTemplate(fs.path.join('module', 'common'), dirPath, templateContext);
     if (argResults['pub']) {
       await pubGet(
         context: PubContext.create,
-        directory: path,
+        directory: dirPath,
         offline: argResults['offline'],
       );
-      final FlutterProject project = new FlutterProject.fromPath(path);
+      final FlutterProject project = new FlutterProject(fs.directory(dirPath));
       await project.ensureReadyForPlatformSpecificTooling();
     }
     return generatedCount;
@@ -303,23 +303,23 @@
     return generatedCount;
   }
 
-  Future<int> _generateApp(String projectPath, Map<String, dynamic> templateContext) async {
+  Future<int> _generateApp(String appPath, Map<String, dynamic> templateContext) async {
     int generatedCount = 0;
-    generatedCount += _renderTemplate('create', projectPath, templateContext);
-    generatedCount += _injectGradleWrapper(projectPath);
+    generatedCount += _renderTemplate('create', appPath, templateContext);
+    generatedCount += _injectGradleWrapper(appPath);
 
     if (argResults['with-driver-test']) {
-      final String testPath = fs.path.join(projectPath, 'test_driver');
+      final String testPath = fs.path.join(appPath, 'test_driver');
       generatedCount += _renderTemplate('driver', testPath, templateContext);
     }
 
     if (argResults['pub']) {
-      await pubGet(context: PubContext.create, directory: projectPath, offline: argResults['offline']);
-      await new FlutterProject.fromPath(projectPath).ensureReadyForPlatformSpecificTooling();
+      await pubGet(context: PubContext.create, directory: appPath, offline: argResults['offline']);
+      await new FlutterProject(fs.directory(appPath)).ensureReadyForPlatformSpecificTooling();
     }
 
     if (android_sdk.androidSdk != null)
-      await gradle.updateLocalProperties(projectPath: projectPath);
+      await gradle.updateLocalProperties(projectPath: appPath);
 
     return generatedCount;
   }
diff --git a/packages/flutter_tools/lib/src/commands/inject_plugins.dart b/packages/flutter_tools/lib/src/commands/inject_plugins.dart
index 832b642..8d8b47c 100644
--- a/packages/flutter_tools/lib/src/commands/inject_plugins.dart
+++ b/packages/flutter_tools/lib/src/commands/inject_plugins.dart
@@ -4,8 +4,6 @@
 
 import 'dart:async';
 
-import '../base/file_system.dart';
-import '../flutter_manifest.dart';
 import '../globals.dart';
 import '../plugins.dart';
 import '../runner/flutter_command.dart';
@@ -26,9 +24,7 @@
 
   @override
   Future<Null> runCommand() async {
-    final String projectPath = fs.currentDirectory.path;
-    final FlutterManifest manifest = await FlutterManifest.createFromPath(projectPath);
-    injectPlugins(projectPath: projectPath, manifest: manifest);
+    injectPlugins();
     final bool result = hasPlugins();
     if (result) {
       printStatus('GeneratedPluginRegistrants successfully written.');
diff --git a/packages/flutter_tools/lib/src/commands/packages.dart b/packages/flutter_tools/lib/src/commands/packages.dart
index ff71446..471e0a6 100644
--- a/packages/flutter_tools/lib/src/commands/packages.dart
+++ b/packages/flutter_tools/lib/src/commands/packages.dart
@@ -5,6 +5,7 @@
 import 'dart:async';
 
 import '../base/common.dart';
+import '../base/file_system.dart';
 import '../base/os.dart';
 import '../dart/pub.dart';
 import '../project.dart';
@@ -80,7 +81,7 @@
     }
 
     await _runPubGet(target);
-    final FlutterProject rootProject = new FlutterProject.fromPath(target);
+    final FlutterProject rootProject = new FlutterProject(fs.directory(target));
     await rootProject.ensureReadyForPlatformSpecificTooling();
 
     // Get/upgrade packages in example app as well
diff --git a/packages/flutter_tools/lib/src/ios/cocoapods.dart b/packages/flutter_tools/lib/src/ios/cocoapods.dart
index 9904812..40b6e2b 100644
--- a/packages/flutter_tools/lib/src/ios/cocoapods.dart
+++ b/packages/flutter_tools/lib/src/ios/cocoapods.dart
@@ -15,7 +15,6 @@
 import '../base/process_manager.dart';
 import '../base/version.dart';
 import '../cache.dart';
-import '../flutter_manifest.dart';
 import '../globals.dart';
 import 'xcodeproj.dart';
 
@@ -151,14 +150,11 @@
   /// Ensures the `ios` sub-project of the Flutter project at [appDirectory]
   /// contains a suitable `Podfile` and that its `Flutter/Xxx.xcconfig` files
   /// include pods configuration.
-  void setupPodfile(String appDirectory, FlutterManifest manifest) {
+  void setupPodfile(String appDirectory) {
     if (!xcodeProjectInterpreter.isInstalled) {
       // Don't do anything for iOS when host platform doesn't support it.
       return;
     }
-    if (!fs.directory(fs.path.join(appDirectory, 'ios')).existsSync()) {
-      return;
-    }
     final String podfilePath = fs.path.join(appDirectory, 'ios', 'Podfile');
     if (!fs.file(podfilePath).existsSync()) {
       final bool isSwift = xcodeProjectInterpreter.getBuildSettings(
@@ -175,7 +171,6 @@
       ));
       podfileTemplate.copySync(podfilePath);
     }
-
     _addPodsDependencyToFlutterXcconfig(appDirectory, 'Debug');
     _addPodsDependencyToFlutterXcconfig(appDirectory, 'Release');
   }
diff --git a/packages/flutter_tools/lib/src/ios/mac.dart b/packages/flutter_tools/lib/src/ios/mac.dart
index 2860303..44c4f14 100644
--- a/packages/flutter_tools/lib/src/ios/mac.dart
+++ b/packages/flutter_tools/lib/src/ios/mac.dart
@@ -20,7 +20,6 @@
 import '../base/process_manager.dart';
 import '../base/utils.dart';
 import '../build_info.dart';
-import '../flutter_manifest.dart';
 import '../globals.dart';
 import '../plugins.dart';
 import '../services.dart';
@@ -243,15 +242,11 @@
   final Directory appDirectory = fs.directory(app.appDirectory);
   await _addServicesToBundle(appDirectory);
 
-  final FlutterManifest manifest = await FlutterManifest.createFromPath(
-    fs.currentDirectory.childFile('pubspec.yaml').path,
-  );
-  updateGeneratedXcodeProperties(
+  await updateGeneratedXcodeProperties(
     projectPath: fs.currentDirectory.path,
     buildInfo: buildInfo,
     targetOverride: targetOverride,
     previewDart2: buildInfo.previewDart2,
-    manifest: manifest,
   );
 
   if (hasPlugins()) {
diff --git a/packages/flutter_tools/lib/src/ios/xcodeproj.dart b/packages/flutter_tools/lib/src/ios/xcodeproj.dart
index b9bf73d..8099b89 100644
--- a/packages/flutter_tools/lib/src/ios/xcodeproj.dart
+++ b/packages/flutter_tools/lib/src/ios/xcodeproj.dart
@@ -2,9 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+import 'dart:async';
+
 import 'package:meta/meta.dart';
 
 import '../artifacts.dart';
+import '../base/common.dart';
 import '../base/context.dart';
 import '../base/file_system.dart';
 import '../base/io.dart';
@@ -25,30 +28,21 @@
   return fs.path.normalize(fs.path.dirname(artifacts.getArtifactPath(Artifact.flutterFramework, TargetPlatform.ios, mode)));
 }
 
-String _generatedXcodePropertiesPath({@required String projectPath, @required FlutterManifest manifest}) {
-  if (manifest.isModule) {
-    return fs.path.join(projectPath, '.ios', 'Flutter', 'Generated.xcconfig');
-  } else {
-    return fs.path.join(projectPath, 'ios', 'Flutter', 'Generated.xcconfig');
-  }
+String _generatedXcodePropertiesPath(String projectPath) {
+  return fs.path.join(projectPath, 'ios', 'Flutter', 'Generated.xcconfig');
 }
 
 /// Writes default Xcode properties files in the Flutter project at [projectPath],
-/// if project is an iOS project and such files are out of date or do not
-/// already exist.
-void generateXcodeProperties({String projectPath, FlutterManifest manifest}) {
-  if (manifest.isModule || fs.isDirectorySync(fs.path.join(projectPath, 'ios'))) {
-    final File propertiesFile = fs.file(_generatedXcodePropertiesPath(projectPath: projectPath, manifest: manifest));
-    if (!Cache.instance.fileOlderThanToolsStamp(propertiesFile)) {
+/// if project is an iOS project and such files do not already exist.
+Future<void> generateXcodeProperties(String projectPath) async {
+  if (fs.isDirectorySync(fs.path.join(projectPath, 'ios'))) {
+    if (fs.file(_generatedXcodePropertiesPath(projectPath)).existsSync())
       return;
-    }
-
-    updateGeneratedXcodeProperties(
+    await updateGeneratedXcodeProperties(
       projectPath: projectPath,
-      manifest: manifest,
       buildInfo: BuildInfo.debug,
       targetOverride: bundle.defaultMainPath,
-      previewDart2: true,
+      previewDart2: false,
     );
   }
 }
@@ -57,13 +51,14 @@
 ///
 /// targetOverride: Optional parameter, if null or unspecified the default value
 /// from xcode_backend.sh is used 'lib/main.dart'.
-void updateGeneratedXcodeProperties({
+///
+/// Returns the number of files written.
+Future<void> updateGeneratedXcodeProperties({
   @required String projectPath,
-  @required FlutterManifest manifest,
   @required BuildInfo buildInfo,
   String targetOverride,
   @required bool previewDart2,
-}) {
+}) async {
   final StringBuffer localsBuffer = new StringBuffer();
 
   localsBuffer.writeln('// This is a generated file; do not edit or check into version control.');
@@ -86,11 +81,14 @@
 
   localsBuffer.writeln('SYMROOT=\${SOURCE_ROOT}/../${getIosBuildDirectory()}');
 
-  if (!manifest.isModule) {
-    // For module projects we do not want to write the FLUTTER_FRAMEWORK_DIR
-    // explicitly. Rather we rely on the xcode backend script and the Podfile
-    // logic to derive it from FLUTTER_ROOT and FLUTTER_BUILD_MODE.
-    localsBuffer.writeln('FLUTTER_FRAMEWORK_DIR=${flutterFrameworkDir(buildInfo.mode)}');
+  localsBuffer.writeln('FLUTTER_FRAMEWORK_DIR=${flutterFrameworkDir(buildInfo.mode)}');
+
+  final String flutterManifest = fs.path.join(projectPath, bundle.defaultManifestPath);
+  FlutterManifest manifest;
+  try {
+    manifest = await FlutterManifest.createFromPath(flutterManifest);
+  } catch (error) {
+    throwToolExit('Failed to load pubspec.yaml: $error');
   }
 
   final String buildName = buildInfo?.buildName ?? manifest.buildName;
@@ -125,7 +123,7 @@
     localsBuffer.writeln('TRACK_WIDGET_CREATION=true');
   }
 
-  final File localsFile = fs.file(_generatedXcodePropertiesPath(projectPath: projectPath, manifest: manifest));
+  final File localsFile = fs.file(_generatedXcodePropertiesPath(projectPath));
   localsFile.createSync(recursive: true);
   localsFile.writeAsStringSync(localsBuffer.toString());
 }
diff --git a/packages/flutter_tools/lib/src/plugins.dart b/packages/flutter_tools/lib/src/plugins.dart
index e99c19a..f72463c 100644
--- a/packages/flutter_tools/lib/src/plugins.dart
+++ b/packages/flutter_tools/lib/src/plugins.dart
@@ -8,18 +8,9 @@
 
 import 'base/file_system.dart';
 import 'dart/package_map.dart';
-import 'flutter_manifest.dart';
 import 'globals.dart';
 import 'ios/cocoapods.dart';
 
-void _renderTemplateToFile(String template, dynamic context, String filePath) {
-  final String renderedTemplate =
-     new mustache.Template(template).renderString(context);
-  final File file = fs.file(filePath);
-  file.createSync(recursive: true);
-  file.writeAsStringSync(renderedTemplate);
-}
-
 class Plugin {
   final String name;
   final String path;
@@ -69,7 +60,7 @@
   return new Plugin.fromYaml(name, packageRootPath, flutterConfig['plugin']);
 }
 
-List<Plugin> findPlugins(String directory) {
+List<Plugin> _findPlugins(String directory) {
   final List<Plugin> plugins = <Plugin>[];
   Map<String, Uri> packages;
   try {
@@ -155,9 +146,14 @@
     'plugins': androidPlugins,
   };
 
+  final String pluginRegistry =
+      new mustache.Template(_androidPluginRegistryTemplate).renderString(context);
   final String javaSourcePath = fs.path.join(directory, 'src', 'main', 'java');
-  final String registryPath = fs.path.join(javaSourcePath, 'io', 'flutter', 'plugins', 'GeneratedPluginRegistrant.java');
-  _renderTemplateToFile(_androidPluginRegistryTemplate, context, registryPath);
+  final Directory registryDirectory =
+      fs.directory(fs.path.join(javaSourcePath, 'io', 'flutter', 'plugins'));
+  registryDirectory.createSync(recursive: true);
+  final File registryFile = registryDirectory.childFile('GeneratedPluginRegistrant.java');
+  registryFile.writeAsStringSync(pluginRegistry);
 }
 
 const String _iosPluginRegistryHeaderTemplate = '''//
@@ -196,32 +192,7 @@
 @end
 ''';
 
-const String _iosPluginRegistrantPodspecTemplate = '''
-#
-# Generated file, do not edit.
-#
-
-Pod::Spec.new do |s|
-  s.name             = 'FlutterPluginRegistrant'
-  s.version          = '0.0.1'
-  s.summary          = 'Registers plugins with your flutter app'
-  s.description      = <<-DESC
-Depends on all your plugins, and provides a function to register them.
-                       DESC
-  s.homepage         = 'https://flutter.io'
-  s.license          = { :type => 'BSD' }
-  s.author           = { 'Flutter Dev Team' => 'flutter-dev@googlegroups.com' }
-  s.ios.deployment_target = '7.0'
-  s.source_files =  "Classes", "Classes/**/*.{h,m}"
-  s.source           = { :path => '.' }
-  s.public_header_files = './Classes/**/*.h'
-  {{#plugins}}
-  s.dependency '{{name}}'
-  {{/plugins}}
-end
-''';
-
-void _writeIOSPluginRegistrant(String directory, FlutterManifest manifest, List<Plugin> plugins) {
+void _writeIOSPluginRegistrant(String directory, List<Plugin> plugins) {
   final List<Map<String, dynamic>> iosPlugins = plugins
       .where((Plugin p) => p.pluginClass != null)
       .map((Plugin p) => <String, dynamic>{
@@ -234,41 +205,16 @@
     'plugins': iosPlugins,
   };
 
-  if (manifest.isModule) {
-    // In a module create the GeneratedPluginRegistrant as a pod to be included
-    // from a hosting app.
-    final String registryDirectory = fs.path.join(directory, 'FlutterPluginRegistrant');
-    final String registryClassesDirectory = fs.path.join(registryDirectory, 'Classes');
-    _renderTemplateToFile(
-      _iosPluginRegistrantPodspecTemplate,
-      context,
-      fs.path.join(registryDirectory, 'FlutterPluginRegistrant.podspec'),
-    );
-    _renderTemplateToFile(
-      _iosPluginRegistryHeaderTemplate,
-      context,
-      fs.path.join(registryClassesDirectory, 'GeneratedPluginRegistrant.h'),
-    );
-    _renderTemplateToFile(
-      _iosPluginRegistryImplementationTemplate,
-      context,
-      fs.path.join(registryClassesDirectory, 'GeneratedPluginRegistrant.m'),
-    );
-  } else {
-    // For a non-module create the GeneratedPluginRegistrant as source files
-    // directly in the ios project.
-    final String runnerDirectory = fs.path.join(directory, 'Runner');
-    _renderTemplateToFile(
-      _iosPluginRegistryHeaderTemplate,
-      context,
-      fs.path.join(runnerDirectory, 'GeneratedPluginRegistrant.h'),
-    );
-    _renderTemplateToFile(
-      _iosPluginRegistryImplementationTemplate,
-      context,
-      fs.path.join(runnerDirectory, 'GeneratedPluginRegistrant.m'),
-    );
-  }
+  final String pluginRegistryHeader =
+      new mustache.Template(_iosPluginRegistryHeaderTemplate).renderString(context);
+  final String pluginRegistryImplementation =
+      new mustache.Template(_iosPluginRegistryImplementationTemplate).renderString(context);
+  final Directory registryDirectory = fs.directory(fs.path.join(directory, 'ios', 'Runner'));
+  registryDirectory.createSync(recursive: true);
+  final File registryHeaderFile = registryDirectory.childFile('GeneratedPluginRegistrant.h');
+  registryHeaderFile.writeAsStringSync(pluginRegistryHeader);
+  final File registryImplementationFile = registryDirectory.childFile('GeneratedPluginRegistrant.m');
+  registryImplementationFile.writeAsStringSync(pluginRegistryImplementation);
 }
 
 class InjectPluginsResult{
@@ -283,23 +229,22 @@
 }
 
 /// Injects plugins found in `pubspec.yaml` into the platform-specific projects.
-void injectPlugins({@required String projectPath, @required FlutterManifest manifest}) {
-  final List<Plugin> plugins = findPlugins(projectPath);
-  final bool changed = _writeFlutterPluginsList(projectPath, plugins);
-  if (manifest.isModule) {
-    _writeAndroidPluginRegistrant(fs.path.join(projectPath, '.android', 'Flutter'), plugins);
-  } else if (fs.isDirectorySync(fs.path.join(projectPath, 'android', 'app'))) {
-    _writeAndroidPluginRegistrant(fs.path.join(projectPath, 'android', 'app'), plugins);
+void injectPlugins({String directory}) {
+  directory ??= fs.currentDirectory.path;
+  final List<Plugin> plugins = _findPlugins(directory);
+  final bool changed = _writeFlutterPluginsList(directory, plugins);
+  if (fs.isDirectorySync(fs.path.join(directory, '.android', 'Flutter'))) {
+    _writeAndroidPluginRegistrant(fs.path.join(directory, '.android', 'Flutter'), plugins);
+  } else if (fs.isDirectorySync(fs.path.join(directory, 'android', 'app'))) {
+    _writeAndroidPluginRegistrant(fs.path.join(directory, 'android', 'app'), plugins);
   }
-  if (manifest.isModule) {
-    _writeIOSPluginRegistrant(fs.path.join(projectPath, '.ios'), manifest, plugins);
-  } else if (fs.isDirectorySync(fs.path.join(projectPath, 'ios'))) {
-    _writeIOSPluginRegistrant(fs.path.join(projectPath, 'ios'), manifest, plugins);
+  if (fs.isDirectorySync(fs.path.join(directory, 'ios'))) {
+    _writeIOSPluginRegistrant(directory, plugins);
     final CocoaPods cocoaPods = new CocoaPods();
     if (plugins.isNotEmpty)
-      cocoaPods.setupPodfile(projectPath, manifest);
+      cocoaPods.setupPodfile(directory);
     if (changed)
-      cocoaPods.invalidatePodInstallOutput(projectPath);
+      cocoaPods.invalidatePodInstallOutput(directory);
   }
 }
 
diff --git a/packages/flutter_tools/lib/src/project.dart b/packages/flutter_tools/lib/src/project.dart
index d3f2e66..dae7772 100644
--- a/packages/flutter_tools/lib/src/project.dart
+++ b/packages/flutter_tools/lib/src/project.dart
@@ -8,7 +8,6 @@
 
 import 'android/gradle.dart' as gradle;
 import 'base/file_system.dart';
-import 'bundle.dart' as bundle;
 import 'cache.dart';
 import 'flutter_manifest.dart';
 import 'ios/xcodeproj.dart' as xcode;
@@ -17,20 +16,11 @@
 
 /// Represents the contents of a Flutter project at the specified [directory].
 class FlutterProject {
-
   FlutterProject(this.directory);
-  FlutterProject.fromPath(String projectPath) : directory = fs.directory(projectPath);
 
   /// The location of this project.
   final Directory directory;
 
-  Future<FlutterManifest> get manifest {
-    return _manifest ??= FlutterManifest.createFromPath(
-      directory.childFile(bundle.defaultManifestPath).path,
-    );
-  }
-  Future<FlutterManifest> _manifest;
-
   /// Asynchronously returns the organization names found in this project as
   /// part of iOS product bundle identifier, Android application ID, or
   /// Gradle group ID.
@@ -64,17 +54,11 @@
   /// The generated AndroidModule sub project of this module project.
   AndroidModuleProject get androidModule => new AndroidModuleProject(directory.childDirectory('.android'));
 
-  /// The generated IosModule sub project of this module project.
-  IosModuleProject get iosModule => new IosModuleProject(directory.childDirectory('.ios'));
-
   /// Returns true if this project has an example application
-  bool get hasExampleApp => _exampleDirectory.childFile('pubspec.yaml').existsSync();
+  bool get hasExampleApp => directory.childDirectory('example').childFile('pubspec.yaml').existsSync();
 
   /// The example sub project of this (package or plugin) project.
-  FlutterProject get example => new FlutterProject(_exampleDirectory);
-
-  /// The directory that will contain the example if an example exists.
-  Directory get _exampleDirectory => directory.childDirectory('example');
+  FlutterProject get example => new FlutterProject(directory.childDirectory('example'));
 
   /// Generates project files necessary to make Gradle builds work on Android
   /// and CocoaPods+Xcode work on iOS, for app and module projects only.
@@ -84,13 +68,12 @@
     if (!directory.existsSync() || hasExampleApp) {
       return 0;
     }
-    final FlutterManifest manifest = await this.manifest;
+    final FlutterManifest manifest = await FlutterManifest.createFromPath(directory.childFile('pubspec.yaml').path);
     if (manifest.isModule) {
       await androidModule.ensureReadyForPlatformSpecificTooling(manifest);
-      await iosModule.ensureReadyForPlatformSpecificTooling(manifest);
     }
-    xcode.generateXcodeProperties(projectPath: directory.path, manifest: manifest);
-    injectPlugins(projectPath: directory.path, manifest: manifest);
+    injectPlugins(directory: directory.path);
+    await xcode.generateXcodeProperties(directory.path);
   }
 }
 
@@ -107,25 +90,6 @@
   }
 }
 
-/// Represents the contents of the .ios/ folder of a Flutter module
-/// project.
-class IosModuleProject {
-  IosModuleProject(this.directory);
-
-  final Directory directory;
-
-  Future<void> ensureReadyForPlatformSpecificTooling(FlutterManifest manifest) async {
-    if (_shouldRegenerate()) {
-      final Template template = new Template.fromName(fs.path.join('module', 'ios'));
-      template.render(directory, <String, dynamic>{}, printStatusWhenWriting: false);
-    }
-  }
-
-  bool _shouldRegenerate() {
-    return Cache.instance.fileOlderThanToolsStamp(directory.childFile('podhelper.rb'));
-  }
-}
-
 /// Represents the contents of the android/ folder of a Flutter project.
 class AndroidProject {
   static final RegExp _applicationIdPattern = new RegExp('^\\s*applicationId\\s+[\'\"](.*)[\'\"]\\s*\$');
@@ -165,7 +129,14 @@
   }
 
   bool _shouldRegenerate() {
-    return Cache.instance.fileOlderThanToolsStamp(directory.childFile('build.gradle'));
+    final File flutterToolsStamp = Cache.instance.getStampFileFor('flutter_tools');
+    final File buildDotGradleFile = directory.childFile('build.gradle');
+    if (!buildDotGradleFile.existsSync())
+      return true;
+    return flutterToolsStamp.existsSync() &&
+        flutterToolsStamp
+            .lastModifiedSync()
+            .isAfter(buildDotGradleFile.lastModifiedSync());
   }
 }
 
diff --git a/packages/flutter_tools/templates/module/ios/AppFrameworkInfo.plist.copy.tmpl b/packages/flutter_tools/templates/module/ios/AppFrameworkInfo.plist.copy.tmpl
deleted file mode 100644
index 9367d48..0000000
--- a/packages/flutter_tools/templates/module/ios/AppFrameworkInfo.plist.copy.tmpl
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-  <key>CFBundleDevelopmentRegion</key>
-  <string>en</string>
-  <key>CFBundleExecutable</key>
-  <string>App</string>
-  <key>CFBundleIdentifier</key>
-  <string>io.flutter.flutter.app</string>
-  <key>CFBundleInfoDictionaryVersion</key>
-  <string>6.0</string>
-  <key>CFBundleName</key>
-  <string>App</string>
-  <key>CFBundlePackageType</key>
-  <string>FMWK</string>
-  <key>CFBundleShortVersionString</key>
-  <string>1.0</string>
-  <key>CFBundleSignature</key>
-  <string>????</string>
-  <key>CFBundleVersion</key>
-  <string>1.0</string>
-  <key>MinimumOSVersion</key>
-  <string>8.0</string>
-</dict>
-</plist>
diff --git a/packages/flutter_tools/templates/module/ios/README.md.copy.tmpl b/packages/flutter_tools/templates/module/ios/README.md.copy.tmpl
deleted file mode 100644
index e8a3521..0000000
--- a/packages/flutter_tools/templates/module/ios/README.md.copy.tmpl
+++ /dev/null
@@ -1,2 +0,0 @@
-This directory contains support code for embedding the Flutter project in an iOS app.
-It should not be edited or checked in.
diff --git a/packages/flutter_tools/templates/module/ios/podhelper.rb.copy.tmpl b/packages/flutter_tools/templates/module/ios/podhelper.rb.copy.tmpl
deleted file mode 100644
index b3b9f83..0000000
--- a/packages/flutter_tools/templates/module/ios/podhelper.rb.copy.tmpl
+++ /dev/null
@@ -1,77 +0,0 @@
-# This file should be used from the target section of the host-app's Podfile like this:
-# ```
-# target 'host' do
-#     flutter_application_path = /"(.*)\/.ios\/Generated.xcconfig"/.match(File.read("./Flutter/FlutterConfig.xcconfig"))[1]
-#     eval(File.read(File.join(flutter_application_path, '.ios', 'podhelper.rb')))
-# end
-# ```
-
-def parse_KV_file(file, separator='=')
-    file_abs_path = File.expand_path(file)
-    if !File.exists? file_abs_path
-        return [];
-    end
-    pods_array = []
-    skip_line_start_symbols = ["#", "/"]
-    File.foreach(file_abs_path) { |line|
-        next if skip_line_start_symbols.any? { |symbol| line =~ /^\s*#{symbol}/ }
-        plugin = line.split(pattern=separator)
-        if plugin.length == 2
-            podname = plugin[0].strip()
-            path = plugin[1].strip()
-            podpath = File.expand_path("#{path}", file_abs_path)
-            pods_array.push({:name => podname, :path => podpath});
-         else
-            puts "Invalid plugin specification: #{line}"
-        end
-    }
-    return pods_array
-end
-
-# Prepare symlinks folder. We use symlinks to avoid having Podfile.lock
-# referring to absolute paths on developers' machines.
-system('rm -rf .symlinks')
-system('mkdir -p .symlinks/plugins')
-
-def flutter_root(f)
-    generated_xcode_build_settings = parse_KV_file(File.join(f, File.join('.ios', 'Generated.xcconfig')))
-    if generated_xcode_build_settings.empty?
-        puts "Generated.xcconfig must exist. Make sure `flutter packages get` is executed in ${f}."
-        exit
-    end
-    generated_xcode_build_settings.map { |p|
-        if p[:name] == 'FLUTTER_ROOT'
-            return p[:path]
-        end
-    }
-end
-
-framework_dir = File.join(File.expand_path(File.dirname(__FILE__)), 'Flutter')
-engine_dir = File.join(framework_dir, 'engine')
-if !File.exist?(engine_dir)
-    # Copy the debug engine to have something to link against if the xcode backend script has not run yet.
-    debug_framework_dir = File.join(flutter_root(flutter_application_path), 'bin', 'cache', 'artifacts', 'engine', 'ios')
-    FileUtils.mkdir(engine_dir)
-    FileUtils.cp_r(File.join(debug_framework_dir, 'Flutter.framework'), engine_dir)
-    FileUtils.cp(File.join(debug_framework_dir, 'Flutter.podspec'), engine_dir)
-end
-
-symlink = File.join('.symlinks', 'flutter')
-
-File.symlink(framework_dir, symlink)
-pod 'Flutter', :path => File.join(symlink, 'engine')
-
-
-plugin_pods = parse_KV_file(File.join(flutter_application_path, '.flutter-plugins'))
-
-plugin_pods.map { |r|
-    symlink = File.join('.symlinks', 'plugins', r[:name])
-
-    File.symlink(r[:path], symlink)
-    pod r[:name], :path => File.join(symlink, 'ios')
-}
-
-symlink = File.join('.symlinks', 'FlutterApp')
-File.symlink(File.absolute_path(flutter_application_path), symlink)
-
-pod 'FlutterPluginRegistrant', :path => File.join(symlink, '.ios', 'FlutterPluginRegistrant')
diff --git a/packages/flutter_tools/test/ios/cocoapods_test.dart b/packages/flutter_tools/test/ios/cocoapods_test.dart
index b65e757..3bb165b 100644
--- a/packages/flutter_tools/test/ios/cocoapods_test.dart
+++ b/packages/flutter_tools/test/ios/cocoapods_test.dart
@@ -9,8 +9,6 @@
 import 'package:flutter_tools/src/base/common.dart';
 import 'package:flutter_tools/src/base/io.dart';
 import 'package:flutter_tools/src/cache.dart';
-import 'package:flutter_tools/src/flutter_manifest.dart';
-import 'package:flutter_tools/src/project.dart';
 import 'package:flutter_tools/src/ios/cocoapods.dart';
 import 'package:flutter_tools/src/ios/xcodeproj.dart';
 import 'package:mockito/mockito.dart';
@@ -134,25 +132,21 @@
       podFile = fs.file(fs.path.join('project', 'ios', 'Podfile'));
     });
 
-    testUsingContext('creates objective-c Podfile when not present', () async {
-      final FlutterManifest manifest =
-          await new FlutterProject.fromPath('project').manifest;
-      cocoaPodsUnderTest.setupPodfile('project', manifest);
+    testUsingContext('creates objective-c Podfile when not present', () {
+      cocoaPodsUnderTest.setupPodfile('project');
 
       expect(podFile.readAsStringSync(), 'Objective-C podfile template');
     }, overrides: <Type, Generator>{
       FileSystem: () => fs,
     });
 
-    testUsingContext('creates swift Podfile if swift', () async {
+    testUsingContext('creates swift Podfile if swift', () {
       when(mockXcodeProjectInterpreter.isInstalled).thenReturn(true);
       when(mockXcodeProjectInterpreter.getBuildSettings(any, any)).thenReturn(<String, String>{
         'SWIFT_VERSION': '4.0',
       });
 
-      final FlutterManifest manifest =
-          await new FlutterProject.fromPath('project').manifest;
-      cocoaPodsUnderTest.setupPodfile('project', manifest);
+      cocoaPodsUnderTest.setupPodfile('project');
 
       expect(podFile.readAsStringSync(), 'Swift podfile template');
     }, overrides: <Type, Generator>{
@@ -160,24 +154,20 @@
       XcodeProjectInterpreter: () => mockXcodeProjectInterpreter,
     });
 
-    testUsingContext('does not recreate Podfile when already present', () async {
+    testUsingContext('does not recreate Podfile when already present', () {
       podFile..createSync()..writeAsStringSync('Existing Podfile');
 
-      final FlutterManifest manifest =
-          await new FlutterProject.fromPath('project').manifest;
-      cocoaPodsUnderTest.setupPodfile('project', manifest);
+      cocoaPodsUnderTest.setupPodfile('project');
 
       expect(podFile.readAsStringSync(), 'Existing Podfile');
     }, overrides: <Type, Generator>{
       FileSystem: () => fs,
     });
 
-    testUsingContext('does not create Podfile when we cannot interpret Xcode projects', () async {
+    testUsingContext('does not create Podfile when we cannot interpret Xcode projects', () {
       when(mockXcodeProjectInterpreter.isInstalled).thenReturn(false);
 
-      final FlutterManifest manifest =
-          await new FlutterProject.fromPath('project').manifest;
-      cocoaPodsUnderTest.setupPodfile('project', manifest);
+      cocoaPodsUnderTest.setupPodfile('project');
 
       expect(podFile.existsSync(), false);
     }, overrides: <Type, Generator>{
@@ -185,14 +175,12 @@
       XcodeProjectInterpreter: () => mockXcodeProjectInterpreter,
     });
 
-    testUsingContext('includes Pod config in xcconfig files, if not present', () async {
+    testUsingContext('includes Pod config in xcconfig files, if not present', () {
       podFile..createSync()..writeAsStringSync('Existing Podfile');
       debugConfigFile..createSync(recursive: true)..writeAsStringSync('Existing debug config');
       releaseConfigFile..createSync(recursive: true)..writeAsStringSync('Existing release config');
 
-      final FlutterManifest manifest =
-          await new FlutterProject.fromPath('project').manifest;
-      cocoaPodsUnderTest.setupPodfile('project', manifest);
+      cocoaPodsUnderTest.setupPodfile('project');
 
       final String debugContents = debugConfigFile.readAsStringSync();
       expect(debugContents, contains(
diff --git a/packages/flutter_tools/test/ios/xcodeproj_test.dart b/packages/flutter_tools/test/ios/xcodeproj_test.dart
index 3f01783..621e992 100644
--- a/packages/flutter_tools/test/ios/xcodeproj_test.dart
+++ b/packages/flutter_tools/test/ios/xcodeproj_test.dart
@@ -11,8 +11,6 @@
 import 'package:flutter_tools/src/build_info.dart';
 import 'package:flutter_tools/src/bundle.dart' as bundle;
 import 'package:flutter_tools/src/cache.dart';
-import 'package:flutter_tools/src/flutter_manifest.dart';
-import 'package:flutter_tools/src/project.dart';
 import 'package:flutter_tools/src/ios/xcodeproj.dart';
 import 'package:mockito/mockito.dart';
 import 'package:platform/platform.dart';
@@ -286,16 +284,12 @@
     testUsingOsxContext('sets ARCHS=armv7 when armv7 local engine is set', () async {
       when(mockArtifacts.getArtifactPath(Artifact.flutterFramework, TargetPlatform.ios, any)).thenReturn('engine');
       when(mockArtifacts.engineOutPath).thenReturn(fs.path.join('out', 'ios_profile_arm'));
-
       const BuildInfo buildInfo = const BuildInfo(BuildMode.debug, null,
         previewDart2: true,
         targetPlatform: TargetPlatform.ios,
       );
-      final FlutterManifest manifest =
-        await new FlutterProject.fromPath('path/to/project').manifest;
-      updateGeneratedXcodeProperties(
+      await updateGeneratedXcodeProperties(
         projectPath: 'path/to/project',
-        manifest: manifest,
         buildInfo: buildInfo,
         previewDart2: true,
       );
@@ -315,11 +309,8 @@
         trackWidgetCreation: true,
         targetPlatform: TargetPlatform.ios,
       );
-      final FlutterManifest manifest =
-          await new FlutterProject.fromPath('path/to/project').manifest;
-      updateGeneratedXcodeProperties(
+      await updateGeneratedXcodeProperties(
         projectPath: 'path/to/project',
-        manifest: manifest,
         buildInfo: buildInfo,
         previewDart2: true,
       );
@@ -338,11 +329,8 @@
         previewDart2: true,
         targetPlatform: TargetPlatform.ios,
       );
-      final FlutterManifest manifest =
-          await new FlutterProject.fromPath('path/to/project').manifest;
-      updateGeneratedXcodeProperties(
+      await updateGeneratedXcodeProperties(
         projectPath: 'path/to/project',
-        manifest: manifest,
         buildInfo: buildInfo,
         previewDart2: true,
       );
@@ -361,12 +349,8 @@
         previewDart2: true,
         targetPlatform: TargetPlatform.ios,
       );
-
-      final FlutterManifest manifest =
-          await new FlutterProject.fromPath('path/to/project').manifest;
-      updateGeneratedXcodeProperties(
+      await updateGeneratedXcodeProperties(
         projectPath: 'path/to/project',
-        manifest: manifest,
         buildInfo: buildInfo,
         previewDart2: true,
       );
@@ -410,18 +394,15 @@
     }
 
     Future<void> checkBuildVersion({
-      String manifestString,
+      String manifest,
       BuildInfo buildInfo,
       String expectedBuildName,
       String expectedBuildNumber,
     }) async {
-      final String projectPath = await createMinimalProject(manifestString);
+      final String projectPath = await createMinimalProject(manifest);
 
-      final FlutterManifest manifest =
-          await new FlutterProject.fromPath(projectPath).manifest;
-      updateGeneratedXcodeProperties(
+      await updateGeneratedXcodeProperties(
         projectPath: projectPath,
-        manifest: manifest,
         buildInfo: buildInfo,
         targetOverride: bundle.defaultMainPath,
         previewDart2: false,
@@ -446,7 +427,7 @@
 
       const BuildInfo buildInfo = const BuildInfo(BuildMode.release, null);
       await checkBuildVersion(
-        manifestString: manifest,
+        manifest: manifest,
         buildInfo: buildInfo,
         expectedBuildName: '1.0.0',
         expectedBuildNumber: '1',
@@ -464,7 +445,7 @@
 ''';
       const BuildInfo buildInfo = const BuildInfo(BuildMode.release, null);
       await checkBuildVersion(
-        manifestString: manifest,
+        manifest: manifest,
         buildInfo: buildInfo,
         expectedBuildName: '1.0.0',
         expectedBuildNumber: null,
@@ -482,7 +463,7 @@
 ''';
       const BuildInfo buildInfo = const BuildInfo(BuildMode.release, null, buildName: '1.0.2');
       await checkBuildVersion(
-        manifestString: manifest,
+        manifest: manifest,
         buildInfo: buildInfo,
         expectedBuildName: '1.0.2',
         expectedBuildNumber: '1',
@@ -500,7 +481,7 @@
 ''';
       const BuildInfo buildInfo = const BuildInfo(BuildMode.release, null, buildNumber: 3);
       await checkBuildVersion(
-        manifestString: manifest,
+        manifest: manifest,
         buildInfo: buildInfo,
         expectedBuildName: '1.0.0',
         expectedBuildNumber: '3',
@@ -518,7 +499,7 @@
 ''';
       const BuildInfo buildInfo = const BuildInfo(BuildMode.release, null, buildName: '1.0.2', buildNumber: 3);
       await checkBuildVersion(
-        manifestString: manifest,
+        manifest: manifest,
         buildInfo: buildInfo,
         expectedBuildName: '1.0.2',
         expectedBuildNumber: '3',
@@ -536,7 +517,7 @@
 ''';
       const BuildInfo buildInfo = const BuildInfo(BuildMode.release, null, buildName: '1.0.2', buildNumber: 3);
       await checkBuildVersion(
-        manifestString: manifest,
+        manifest: manifest,
         buildInfo: buildInfo,
         expectedBuildName: '1.0.2',
         expectedBuildNumber: '3',
@@ -553,7 +534,7 @@
 ''';
       const BuildInfo buildInfo = const BuildInfo(BuildMode.release, null, buildName: '1.0.2', buildNumber: 3);
       await checkBuildVersion(
-        manifestString: manifest,
+        manifest: manifest,
         buildInfo: buildInfo,
         expectedBuildName: '1.0.2',
         expectedBuildNumber: '3',
diff --git a/packages/flutter_tools/test/project_test.dart b/packages/flutter_tools/test/project_test.dart
index ee5f20e..8955187 100644
--- a/packages/flutter_tools/test/project_test.dart
+++ b/packages/flutter_tools/test/project_test.dart
@@ -15,14 +15,7 @@
   group('Project', () {
     testInMemory('knows location', () {
       final Directory directory = fs.directory('myproject');
-      expect(
-        new FlutterProject(directory).directory.absolute.path,
-        directory.absolute.path,
-      );
-      expect(
-        new FlutterProject.fromPath(directory.path).directory.absolute.path,
-        directory.absolute.path,
-      );
+      expect(new FlutterProject(directory).directory, directory);
     });
     group('ensure ready for platform-specific tooling', () {
       testInMemory('does nothing, if project is not created', () async {
@@ -101,7 +94,7 @@
   });
 }
 
-FlutterProject someProject() => new FlutterProject.fromPath('some_project');
+FlutterProject someProject() => new FlutterProject(fs.directory('some_project'));
 
 FlutterProject aProjectWithIos() {
   final Directory directory = fs.directory('ios_project');