From a745fd58bed1db8dd45f463a391aaffc11246986 Mon Sep 17 00:00:00 2001 From: Jakob Andersen Date: Wed, 22 Feb 2017 14:35:49 +0100 Subject: [PATCH] Don't reinstall the app if the latest build is already installed. (#8328) Only implemented for Android devices for now. Compare the installed SHA1 to the latest build. If they match, there's no reason to reinstall the build. Fixes #8295 --- .../lib/src/android/android_device.dart | 32 +++++++++++++------ .../flutter_tools/lib/src/android/gradle.dart | 5 +++ packages/flutter_tools/lib/src/device.dart | 3 ++ .../flutter_tools/lib/src/ios/devices.dart | 3 ++ .../flutter_tools/lib/src/ios/simulators.dart | 3 ++ 5 files changed, 37 insertions(+), 9 deletions(-) diff --git a/packages/flutter_tools/lib/src/android/android_device.dart b/packages/flutter_tools/lib/src/android/android_device.dart index e74f7884ec..233ef0a8b1 100644 --- a/packages/flutter_tools/lib/src/android/android_device.dart +++ b/packages/flutter_tools/lib/src/android/android_device.dart @@ -196,6 +196,10 @@ class AndroidDevice extends Device { return '/data/local/tmp/sky.${app.id}.sha1'; } + String _getDeviceApkSha1(ApplicationPackage app) { + return runSync(adbCommandForDevice(['shell', 'cat', _getDeviceSha1Path(app)])); + } + String _getSourceSha1(ApplicationPackage app) { AndroidApk apk = app; File shaFile = fs.file('${apk.apkPath}.sha1'); @@ -212,6 +216,12 @@ class AndroidDevice extends Device { return LineSplitter.split(listOut).contains("package:${app.id}"); } + @override + bool isLatestBuildInstalled(ApplicationPackage app) { + String installedSha1 = _getDeviceApkSha1(app); + return installedSha1.isNotEmpty && installedSha1 == _getSourceSha1(app); + } + @override bool installApp(ApplicationPackage app) { AndroidApk apk = app; @@ -286,16 +296,20 @@ class AndroidDevice extends Device { ); } - if (isAppInstalled(package)) { - printStatus('Uninstalling old version...'); - if (!uninstallApp(package)) - printError('Warning: uninstalling old version failed'); - } + if (isLatestBuildInstalled(package)) { + printStatus('Latest build already installed.'); + } else { + if (isAppInstalled(package)) { + printStatus('Uninstalling old version...'); + if (!uninstallApp(package)) + printError('Warning: uninstalling old version failed'); + } - printTrace('Installing APK.'); - if (!installApp(package)) { - printTrace('Error: Failed to install APK.'); - return new LaunchResult.failed(); + printTrace('Installing APK.'); + if (!installApp(package)) { + printTrace('Error: Failed to install APK.'); + return new LaunchResult.failed(); + } } final bool traceStartup = platformArgs['trace-startup'] ?? false; diff --git a/packages/flutter_tools/lib/src/android/gradle.dart b/packages/flutter_tools/lib/src/android/gradle.dart index 5b2d0ee78a..6a7b785a84 100644 --- a/packages/flutter_tools/lib/src/android/gradle.dart +++ b/packages/flutter_tools/lib/src/android/gradle.dart @@ -175,5 +175,10 @@ Future buildGradleProjectV2(String gradle, String buildModeName) async { File apkFile = fs.file('$gradleAppOutDir/$apkFilename'); // Copy the APK to app.apk, so `flutter run`, `flutter install`, etc. can find it. apkFile.copySync('$gradleAppOutDir/app.apk'); + + printTrace('calculateSha: $gradleAppOutDir/app.apk'); + File apkShaFile = fs.file('$gradleAppOutDir/app.apk.sha1'); + apkShaFile.writeAsStringSync(calculateSha(apkFile)); + printStatus('Built $apkFilename (${getSizeAsMB(apkFile.lengthSync())}).'); } diff --git a/packages/flutter_tools/lib/src/device.dart b/packages/flutter_tools/lib/src/device.dart index 6a0f76f542..b29be3f9f9 100644 --- a/packages/flutter_tools/lib/src/device.dart +++ b/packages/flutter_tools/lib/src/device.dart @@ -151,6 +151,9 @@ abstract class Device { /// Check if a version of the given app is already installed bool isAppInstalled(ApplicationPackage app); + /// Check if the latest build of the [app] is already installed. + bool isLatestBuildInstalled(ApplicationPackage app); + /// Install an app package on the current device bool installApp(ApplicationPackage app); diff --git a/packages/flutter_tools/lib/src/ios/devices.dart b/packages/flutter_tools/lib/src/ios/devices.dart index c42da97b7d..51fc5daa2e 100644 --- a/packages/flutter_tools/lib/src/ios/devices.dart +++ b/packages/flutter_tools/lib/src/ios/devices.dart @@ -152,6 +152,9 @@ class IOSDevice extends Device { return false; } + @override + bool isLatestBuildInstalled(ApplicationPackage app) => false; + @override bool installApp(ApplicationPackage app) { IOSApp iosApp = app; diff --git a/packages/flutter_tools/lib/src/ios/simulators.dart b/packages/flutter_tools/lib/src/ios/simulators.dart index 4da5284acc..5f0ce8ba5c 100644 --- a/packages/flutter_tools/lib/src/ios/simulators.dart +++ b/packages/flutter_tools/lib/src/ios/simulators.dart @@ -340,6 +340,9 @@ class IOSSimulator extends Device { return SimControl.instance.isInstalled(app.id); } + @override + bool isLatestBuildInstalled(ApplicationPackage app) => false; + @override bool installApp(ApplicationPackage app) { try {