diff --git a/packages/flutter_tools/lib/src/commands/inject_plugins.dart b/packages/flutter_tools/lib/src/commands/inject_plugins.dart
index f1df432..bf53cb5 100644
--- a/packages/flutter_tools/lib/src/commands/inject_plugins.dart
+++ b/packages/flutter_tools/lib/src/commands/inject_plugins.dart
@@ -24,7 +24,7 @@
 
   @override
   Future<Null> runCommand() async {
-    final bool result = injectPlugins().hasPlugin;
+    final bool result = injectPlugins();
     if (result) {
       printStatus('GeneratedPluginRegistrants successfully written.');
     } else {
diff --git a/packages/flutter_tools/lib/src/ios/cocoapods.dart b/packages/flutter_tools/lib/src/ios/cocoapods.dart
index f935821..78fd425 100644
--- a/packages/flutter_tools/lib/src/ios/cocoapods.dart
+++ b/packages/flutter_tools/lib/src/ios/cocoapods.dart
@@ -57,17 +57,15 @@
 
   Future<Null> processPods({
     @required Directory appIosDir,
+    @required String iosEngineDir,
     bool isSwift: false,
-    bool pluginOrFlutterPodChanged: true,
   }) async {
     if (await _checkPodCondition()) {
       if (!fs.file(fs.path.join(appIosDir.path, 'Podfile')).existsSync()) {
         await _createPodfile(appIosDir, isSwift);
       } // TODO(xster): Add more logic for handling merge conflicts.
-      if (_checkIfRunPodInstall(appIosDir.path, pluginOrFlutterPodChanged))
-        await _runPodInstall(appIosDir);
-    } else {
-      throwToolExit('CocoaPods not available for project using Flutter plugins');
+
+      await _runPodInstall(appIosDir, iosEngineDir);
     }
   }
 
@@ -110,12 +108,13 @@
     podfileTemplate.copySync(fs.path.join(bundle.path, 'Podfile'));
   }
 
-  Future<Null> _runPodInstall(Directory bundle) async {
+  Future<Null> _runPodInstall(Directory bundle, String engineDirectory) async {
     final Status status = logger.startProgress('Running pod install...', expectSlowOperation: true);
     final ProcessResult result = await processManager.run(
       <String>['pod', 'install', '--verbose'],
       workingDirectory: bundle.path,
       environment: <String, String>{
+        'FLUTTER_FRAMEWORK_DIR': engineDirectory,
         // See https://github.com/flutter/flutter/issues/10873.
         // CocoaPods analytics adds a lot of latency.
         'COCOAPODS_DISABLE_STATS': 'true',
@@ -138,28 +137,6 @@
     }
   }
 
-  // Check if you need to run pod install.
-  // The pod install will run if any of below is true.
-  // 1.Any plugins changed (add/update/delete)
-  // 2.The flutter.framework has changed (debug/release/profile)
-  // 3.The podfile.lock doesn't exists
-  // 4.The Pods/manifest.lock doesn't exists
-  // 5.The podfile.lock doesn't match Pods/manifest.lock.
-  bool _checkIfRunPodInstall(String appDir, bool pluginOrFlutterPodChanged) {
-    if (pluginOrFlutterPodChanged)
-      return true;
-    // Check if podfile.lock and Pods/Manifest.lock exists and matches.
-    final File podfileLockFile = fs.file(fs.path.join(appDir, 'Podfile.lock'));
-    final File manifestLockFile =
-        fs.file(fs.path.join(appDir, 'Pods', 'Manifest.lock'));
-    if (!podfileLockFile.existsSync() ||
-        !manifestLockFile.existsSync() ||
-        podfileLockFile.readAsStringSync() !=
-            manifestLockFile.readAsStringSync())
-      return true;
-    return false;
-  }
-
   void _diagnosePodInstallFailure(ProcessResult result) {
     if (result.stdout is String && result.stdout.contains('out-of-date source repos')) {
       printError(
diff --git a/packages/flutter_tools/lib/src/ios/mac.dart b/packages/flutter_tools/lib/src/ios/mac.dart
index 00abe0e..e3ead3b 100644
--- a/packages/flutter_tools/lib/src/ios/mac.dart
+++ b/packages/flutter_tools/lib/src/ios/mac.dart
@@ -254,9 +254,14 @@
   // copied over to a location that is suitable for Xcodebuild to find them.
   final Directory appDirectory = fs.directory(app.appDirectory);
   await _addServicesToBundle(appDirectory);
-  final InjectPluginsResult injectionResult = injectPlugins();
-  final bool hasFlutterPlugins = injectionResult.hasPlugin;
-  final String priorGeneratedXCConfig = readGeneratedXCConfig(app.appDirectory);
+  final bool hasFlutterPlugins = injectPlugins();
+
+  if (hasFlutterPlugins)
+    await cocoaPods.processPods(
+      appIosDir: appDirectory,
+      iosEngineDir: flutterFrameworkDir(buildInfo.mode),
+      isSwift: app.isSwift,
+    );
 
   updateXcodeGeneratedProperties(
     projectPath: fs.currentDirectory.path,
@@ -266,15 +271,6 @@
     previewDart2: buildInfo.previewDart2,
   );
 
-  if (hasFlutterPlugins) {
-    final String currentGeneratedXCConfig = readGeneratedXCConfig(app.appDirectory);
-    await cocoaPods.processPods(
-        appIosDir: appDirectory,
-        isSwift: app.isSwift,
-        pluginOrFlutterPodChanged: (injectionResult.hasChanged ||
-            priorGeneratedXCConfig != currentGeneratedXCConfig));
-  }
-
   final List<String> commands = <String>[
     '/usr/bin/env',
     'xcrun',
@@ -359,17 +355,7 @@
   }
 }
 
-String readGeneratedXCConfig(String appPath) {
-  final String generateXCConfigPath =
-      fs.path.join(fs.currentDirectory.path, appPath, 'Flutter','Generated.xcconfig');
-  final File generateXCConfigFile = fs.file(generateXCConfigPath);
-  if (!generateXCConfigFile.existsSync())
-    return null;
-  return generateXCConfigFile.readAsStringSync();
-}
-
-Future<Null> diagnoseXcodeBuildFailure(
-    XcodeBuildResult result, BuildableIOSApp app) async {
+Future<Null> diagnoseXcodeBuildFailure(XcodeBuildResult result, BuildableIOSApp app) async {
   if (result.xcodeBuildExecution != null &&
       result.xcodeBuildExecution.buildForPhysicalDevice &&
       result.stdout?.contains('BCEROR') == true &&
diff --git a/packages/flutter_tools/lib/src/plugins.dart b/packages/flutter_tools/lib/src/plugins.dart
index 0eeaac7..19d7bc0 100644
--- a/packages/flutter_tools/lib/src/plugins.dart
+++ b/packages/flutter_tools/lib/src/plugins.dart
@@ -77,10 +77,8 @@
   return plugins;
 }
 
-// Return true if .flutter-plugins has changed, otherwise return false.
-bool _writeFlutterPluginsList(String directory, List<Plugin> plugins) {
+void _writeFlutterPluginsList(String directory, List<Plugin> plugins) {
   final File pluginsProperties = fs.file(fs.path.join(directory, '.flutter-plugins'));
-  final String priorFlutterPlugins = (pluginsProperties.existsSync() ? pluginsProperties.readAsStringSync() : null);
   final String pluginManifest =
     plugins.map((Plugin p) => '${p.name}=${escapePath(p.path)}').join('\n');
   if (pluginManifest.isNotEmpty) {
@@ -90,8 +88,6 @@
       pluginsProperties.deleteSync();
     }
   }
-  final String currentFlutterPlugins = (pluginsProperties.existsSync() ? pluginsProperties.readAsStringSync() : null);
-  return currentFlutterPlugins != priorFlutterPlugins;
 }
 
 const String _androidPluginRegistryTemplate = '''package io.flutter.plugins;
@@ -210,25 +206,17 @@
 
 }
 
-class InjectPluginsResult{
-  InjectPluginsResult({this.hasPlugin : false, this.hasChanged : false});
-  /// True if any flutter plugin exists, otherwise false.
-  final bool hasPlugin;
-  /// True if plugins have changed since last build.
-  final bool hasChanged;
-}
-
 /// Finds Flutter plugins in the pubspec.yaml, creates platform injection
 /// registries classes and add them to the build dependencies.
 ///
 /// Returns whether any Flutter plugins are added.
-InjectPluginsResult injectPlugins({String directory}) {
+bool injectPlugins({String directory}) {
   directory ??= fs.currentDirectory.path;
   final List<Plugin> plugins = _findPlugins(directory);
-  final bool hasPluginsChanged = _writeFlutterPluginsList(directory, plugins);
+  _writeFlutterPluginsList(directory, plugins);
   if (fs.isDirectorySync(fs.path.join(directory, 'android')))
     _writeAndroidPluginRegistry(directory, plugins);
   if (fs.isDirectorySync(fs.path.join(directory, 'ios')))
     _writeIOSPluginRegistry(directory, plugins);
-  return new InjectPluginsResult(hasPlugin: plugins.isNotEmpty, hasChanged: hasPluginsChanged);
-}
\ No newline at end of file
+  return plugins.isNotEmpty;
+}
diff --git a/packages/flutter_tools/templates/cocoapods/Podfile-objc b/packages/flutter_tools/templates/cocoapods/Podfile-objc
index 8350f1e..90b5f65 100644
--- a/packages/flutter_tools/templates/cocoapods/Podfile-objc
+++ b/packages/flutter_tools/templates/cocoapods/Podfile-objc
@@ -1,42 +1,30 @@
 # Uncomment this line to define a global platform for your project
 # platform :ios, '9.0'
 
-def parse_KV_file(file,seperator='=')
-  file_abs_path = File.expand_path(file)
-  if !File.exists? file_abs_path
-    puts "Generated.xcconfig or .flutter-plugins expected but not present. If you're running pod install manually, make sure flutter build or flutter run is executed once first."
-    return [];
-  end
-  pods_ary = []
-  File.foreach(file_abs_path) { |line|
-      plugin = line.split(pattern=seperator)
-      if plugin.length == 2
-        podname = plugin[0].strip()
-        path = plugin[1].strip()
-        podpath = File.expand_path("#{path}", file_abs_path)
-        pods_ary.push({:name => podname,:path=>podpath});
-      else
-        puts "Invalid plugin specification: #{line}"
-      end
-  }
-  return pods_ary
+if ENV['FLUTTER_FRAMEWORK_DIR'] == nil
+  abort('Please set FLUTTER_FRAMEWORK_DIR to the directory containing Flutter.framework')
 end
 
 target 'Runner' do
-  use_frameworks!
-  # Flutter Pods
-  generated_xcode_build_settings = parse_KV_file("./Flutter/Generated.xcconfig")
-    generated_xcode_build_settings.map{ |p|
-    if p[:name]=='FLUTTER_FRAMEWORK_DIR'
-      pod 'Flutter', :path => p[:path]
-    end
-  }
+  # Pods for Runner
 
-  # Plugin Pods
-  plugin_pods = parse_KV_file("../.flutter-plugins")
-  plugin_pods.map{ |p|
-    pod p[:name], :path => File.expand_path("ios",p[:path])
-  }
+  # Flutter Pods
+  pod 'Flutter', :path => ENV['FLUTTER_FRAMEWORK_DIR']
+
+  if File.exists? '../.flutter-plugins'
+    flutter_root = File.expand_path('..')
+    File.foreach('../.flutter-plugins') { |line|
+      plugin = line.split(pattern='=')
+      if plugin.length == 2
+        name = plugin[0].strip()
+        path = plugin[1].strip()
+        resolved_path = File.expand_path("#{path}/ios", flutter_root)
+        pod name, :path => resolved_path
+      else
+        puts "Invalid plugin specification: #{line}"
+      end
+    }
+  end
 end
 
 post_install do |installer|
@@ -45,4 +33,4 @@
       config.build_settings['ENABLE_BITCODE'] = 'NO'
     end
   end
-end
\ No newline at end of file
+end
diff --git a/packages/flutter_tools/templates/cocoapods/Podfile-swift b/packages/flutter_tools/templates/cocoapods/Podfile-swift
index 8350f1e..74b3de0 100644
--- a/packages/flutter_tools/templates/cocoapods/Podfile-swift
+++ b/packages/flutter_tools/templates/cocoapods/Podfile-swift
@@ -1,42 +1,32 @@
 # Uncomment this line to define a global platform for your project
 # platform :ios, '9.0'
 
-def parse_KV_file(file,seperator='=')
-  file_abs_path = File.expand_path(file)
-  if !File.exists? file_abs_path
-    puts "Generated.xcconfig or .flutter-plugins expected but not present. If you're running pod install manually, make sure flutter build or flutter run is executed once first."
-    return [];
-  end
-  pods_ary = []
-  File.foreach(file_abs_path) { |line|
-      plugin = line.split(pattern=seperator)
-      if plugin.length == 2
-        podname = plugin[0].strip()
-        path = plugin[1].strip()
-        podpath = File.expand_path("#{path}", file_abs_path)
-        pods_ary.push({:name => podname,:path=>podpath});
-      else
-        puts "Invalid plugin specification: #{line}"
-      end
-  }
-  return pods_ary
+if ENV['FLUTTER_FRAMEWORK_DIR'] == nil
+  abort('Please set FLUTTER_FRAMEWORK_DIR to the directory containing Flutter.framework')
 end
 
 target 'Runner' do
   use_frameworks!
-  # Flutter Pods
-  generated_xcode_build_settings = parse_KV_file("./Flutter/Generated.xcconfig")
-    generated_xcode_build_settings.map{ |p|
-    if p[:name]=='FLUTTER_FRAMEWORK_DIR'
-      pod 'Flutter', :path => p[:path]
-    end
-  }
 
-  # Plugin Pods
-  plugin_pods = parse_KV_file("../.flutter-plugins")
-  plugin_pods.map{ |p|
-    pod p[:name], :path => File.expand_path("ios",p[:path])
-  }
+  # Pods for Runner
+
+  # Flutter Pods
+  pod 'Flutter', :path => ENV['FLUTTER_FRAMEWORK_DIR']
+
+  if File.exists? '../.flutter-plugins'
+    flutter_root = File.expand_path('..')
+    File.foreach('../.flutter-plugins') { |line|
+      plugin = line.split(pattern='=')
+      if plugin.length == 2
+        name = plugin[0].strip()
+        path = plugin[1].strip()
+        resolved_path = File.expand_path("#{path}/ios", flutter_root)
+        pod name, :path => resolved_path
+      else
+        puts "Invalid plugin specification: #{line}"
+      end
+    }
+  end
 end
 
 post_install do |installer|
@@ -45,4 +35,4 @@
       config.build_settings['ENABLE_BITCODE'] = 'NO'
     end
   end
-end
\ No newline at end of file
+end
diff --git a/packages/flutter_tools/test/ios/cocoapods_test.dart b/packages/flutter_tools/test/ios/cocoapods_test.dart
index 73c068d..493468f 100644
--- a/packages/flutter_tools/test/ios/cocoapods_test.dart
+++ b/packages/flutter_tools/test/ios/cocoapods_test.dart
@@ -41,7 +41,7 @@
     when(mockProcessManager.run(
       <String>['pod', 'install', '--verbose'],
       workingDirectory: 'project/ios',
-      environment: <String, String>{'COCOAPODS_DISABLE_STATS': 'true'},
+      environment: <String, String>{'FLUTTER_FRAMEWORK_DIR': 'engine/path', 'COCOAPODS_DISABLE_STATS': 'true'},
     )).thenReturn(exitsHappy);
   });
 
@@ -50,12 +50,13 @@
     () async {
       await cocoaPodsUnderTest.processPods(
         appIosDir: projectUnderTest,
+        iosEngineDir: 'engine/path',
       );
       expect(fs.file(fs.path.join('project', 'ios', 'Podfile')).readAsStringSync() , 'Objective-C podfile template');
       verify(mockProcessManager.run(
         <String>['pod', 'install', '--verbose'],
         workingDirectory: 'project/ios',
-        environment: <String, String>{'COCOAPODS_DISABLE_STATS': 'true'},
+        environment: <String, String>{'FLUTTER_FRAMEWORK_DIR': 'engine/path', 'COCOAPODS_DISABLE_STATS': 'true'},
       ));
     },
     overrides: <Type, Generator>{
@@ -69,13 +70,14 @@
     () async {
       await cocoaPodsUnderTest.processPods(
         appIosDir: projectUnderTest,
+        iosEngineDir: 'engine/path',
         isSwift: true,
       );
       expect(fs.file(fs.path.join('project', 'ios', 'Podfile')).readAsStringSync() , 'Swift podfile template');
       verify(mockProcessManager.run(
         <String>['pod', 'install', '--verbose'],
         workingDirectory: 'project/ios',
-        environment: <String, String>{'COCOAPODS_DISABLE_STATS': 'true'},
+        environment: <String, String>{'FLUTTER_FRAMEWORK_DIR': 'engine/path', 'COCOAPODS_DISABLE_STATS': 'true'},
       ));
     },
     overrides: <Type, Generator>{
@@ -92,11 +94,12 @@
         ..writeAsString('Existing Podfile');
       await cocoaPodsUnderTest.processPods(
         appIosDir: projectUnderTest,
+        iosEngineDir: 'engine/path',
       );      expect(fs.file(fs.path.join('project', 'ios', 'Podfile')).readAsStringSync() , 'Existing Podfile');
       verify(mockProcessManager.run(
         <String>['pod', 'install', '--verbose'],
         workingDirectory: 'project/ios',
-        environment: <String, String>{'COCOAPODS_DISABLE_STATS': 'true'},
+        environment: <String, String>{'FLUTTER_FRAMEWORK_DIR': 'engine/path', 'COCOAPODS_DISABLE_STATS': 'true'},
       ));
     },
     overrides: <Type, Generator>{
@@ -112,13 +115,14 @@
       try {
         await cocoaPodsUnderTest.processPods(
           appIosDir: projectUnderTest,
+          iosEngineDir: 'engine/path',
         );
         fail('Expected tool error');
       } catch (ToolExit) {
         verifyNever(mockProcessManager.run(
           <String>['pod', 'install', '--verbose'],
           workingDirectory: 'project/ios',
-          environment: <String, String>{'COCOAPODS_DISABLE_STATS': 'true'},
+          environment: <String, String>{'FLUTTER_FRAMEWORK_DIR': 'engine/path', 'COCOAPODS_DISABLE_STATS': 'true'},
         ));
       }
     },
@@ -138,7 +142,7 @@
       when(mockProcessManager.run(
         <String>['pod', 'install', '--verbose'],
         workingDirectory: 'project/ios',
-        environment: <String, String>{'COCOAPODS_DISABLE_STATS': 'true'},
+        environment: <String, String>{'FLUTTER_FRAMEWORK_DIR': 'engine/path', 'COCOAPODS_DISABLE_STATS': 'true'},
       )).thenReturn(new ProcessResult(
         1,
         1,
@@ -161,6 +165,7 @@
       try {
         await cocoaPodsUnderTest.processPods(
           appIosDir: projectUnderTest,
+          iosEngineDir: 'engine/path',
         );      expect(fs.file(fs.path.join('project', 'ios', 'Podfile')).readAsStringSync() , 'Existing Podfile');
         fail('Exception expected');
       } catch (ToolExit) {
@@ -172,62 +177,6 @@
       ProcessManager: () => mockProcessManager,
     },
   );
-
-  testUsingContext(
-    'Run pod install if plugins or flutter framework have changes.',
-        () async {
-      fs.file(fs.path.join('project', 'ios', 'Podfile'))
-        ..createSync()
-        ..writeAsString('Existing Podfile');
-      fs.file(fs.path.join('project', 'ios', 'Podfile.lock'))
-        ..createSync()
-        ..writeAsString('Existing lock files.');
-      fs.file(fs.path.join('project', 'ios', 'Pods','Manifest.lock'))
-        ..createSync(recursive: true)
-        ..writeAsString('Existing lock files.');
-      await cocoaPodsUnderTest.processPods(
-          appIosDir: projectUnderTest,
-          pluginOrFlutterPodChanged: true
-      );
-      verify(mockProcessManager.run(
-        <String>['pod', 'install', '--verbose'],
-        workingDirectory: 'project/ios',
-        environment: <String, String>{'COCOAPODS_DISABLE_STATS': 'true'},
-      ));
-    },
-    overrides: <Type, Generator>{
-      FileSystem: () => fs,
-      ProcessManager: () => mockProcessManager,
-    },
-  );
-
-  testUsingContext(
-    'Skip pod install if plugins and flutter framework remain unchanged.',
-        () async {
-      fs.file(fs.path.join('project', 'ios', 'Podfile'))
-        ..createSync()
-        ..writeAsString('Existing Podfile');
-      fs.file(fs.path.join('project', 'ios', 'Podfile.lock'))
-        ..createSync()
-        ..writeAsString('Existing lock files.');
-      fs.file(fs.path.join('project', 'ios', 'Pods','Manifest.lock'))
-        ..createSync(recursive: true)
-        ..writeAsString('Existing lock files.');
-      await cocoaPodsUnderTest.processPods(
-          appIosDir: projectUnderTest,
-          pluginOrFlutterPodChanged: false
-      );
-      verifyNever(mockProcessManager.run(
-        <String>['pod', 'install', '--verbose'],
-        workingDirectory: 'project/ios',
-        environment: <String, String>{'COCOAPODS_DISABLE_STATS': 'true'},
-      ));
-    },
-    overrides: <Type, Generator>{
-      FileSystem: () => fs,
-      ProcessManager: () => mockProcessManager,
-    },
-  );
 }
 
 class MockProcessManager extends Mock implements ProcessManager {}
