From 12cac94cdadbf77cee5c081cfa596a56d58533e4 Mon Sep 17 00:00:00 2001 From: Devon Carew Date: Mon, 18 Apr 2016 09:01:43 -0700 Subject: [PATCH] Use arm deploy (#3374) * download android-arm-deploy * wire up --deploy to android-arm-deploy * fix interpolation --- bin/cache/engine.version | 2 +- bin/flutter | 1 - .../flutter_tools/lib/src/base/logger.dart | 2 +- packages/flutter_tools/lib/src/cache.dart | 33 ++++++- .../lib/src/commands/build_apk.dart | 88 ++++++++----------- .../lib/src/commands/build_ios.dart | 4 +- .../lib/src/commands/daemon.dart | 1 - .../flutter_tools/lib/src/commands/drive.dart | 5 +- .../lib/src/commands/listen.dart | 1 - .../flutter_tools/lib/src/commands/run.dart | 8 +- packages/flutter_tools/lib/src/toolchain.dart | 8 +- .../flutter_tools/test/toolchain_test.dart | 2 +- 12 files changed, 83 insertions(+), 72 deletions(-) diff --git a/bin/cache/engine.version b/bin/cache/engine.version index b522b6011f0..428b78c1cf1 100644 --- a/bin/cache/engine.version +++ b/bin/cache/engine.version @@ -1 +1 @@ -c3504b519fcd95179ea832460758712ecd0e433d +57043227981727ae8ceb1d51514a2e0d14bf53f9 diff --git a/bin/flutter b/bin/flutter index a656aafde31..4aa70ad8a59 100755 --- a/bin/flutter +++ b/bin/flutter @@ -48,7 +48,6 @@ export PATH="$DART_SDK_PATH/bin:$PATH" set +e if [ $FLUTTER_DEV ]; then - echo -e "(FLUTTER_DEV set - ignoring $SNAPSHOT_PATH)\n" "$DART" --packages="$FLUTTER_TOOLS_DIR/.packages" "$SCRIPT_PATH" "$@" else "$DART" "$SNAPSHOT_PATH" "$@" diff --git a/packages/flutter_tools/lib/src/base/logger.dart b/packages/flutter_tools/lib/src/base/logger.dart index ff03a7e3282..7612c565782 100644 --- a/packages/flutter_tools/lib/src/base/logger.dart +++ b/packages/flutter_tools/lib/src/base/logger.dart @@ -214,7 +214,7 @@ class _AnsiStatus extends Status { _AnsiStatus(this.message) { stopwatch = new Stopwatch()..start(); - stdout.write('${message.padRight(44)} '); + stdout.write('${message.padRight(50)} '); stdout.write('${_progress[0]}'); timer = new Timer.periodic(new Duration(milliseconds: 100), _callback); diff --git a/packages/flutter_tools/lib/src/cache.dart b/packages/flutter_tools/lib/src/cache.dart index 7d0b190d480..863fb9ee84c 100644 --- a/packages/flutter_tools/lib/src/cache.dart +++ b/packages/flutter_tools/lib/src/cache.dart @@ -184,18 +184,31 @@ class FlutterEngine { final Cache cache; + List _getPackageDirs() => ['sky_engine', 'sky_services']; + List _getEngineDirs() { - List dirs = ['android-arm', 'android-x64']; + List dirs = [ + 'android-arm', + 'android-arm-deploy', + 'android-x64' + ]; if (Platform.isMacOS) - dirs.addAll(['ios', 'darwin-x64']); + dirs.add('ios'); else if (Platform.isLinux) dirs.add('linux-x64'); return dirs; } - List _getPackageDirs() => ['sky_engine', 'sky_services']; + List _getToolsDirs() { + if (Platform.isMacOS) + return ['darwin-x64']; + else if (Platform.isLinux) + return ['linux-x64']; + else + return []; + } bool isUpToDate() { Directory pkgDir = cache.getCacheDir('pkg'); @@ -212,6 +225,12 @@ class FlutterEngine { return false; } + for (String dirName in _getToolsDirs()) { + Directory dir = new Directory(path.join(engineDir.path, dirName)); + if (!dir.existsSync()) + return false; + } + return cache.getVersionFor(kName) == cache.getStampFor(kName); } @@ -236,6 +255,14 @@ class FlutterEngine { if (!dir.existsSync() || allDirty) { await _downloadItem('Downloading engine artifacts $dirName...', url + dirName + '/artifacts.zip', dir); + } + } + + for (String dirName in _getToolsDirs()) { + Directory dir = new Directory(path.join(engineDir.path, dirName)); + if (!dir.existsSync() || allDirty) { + await _downloadItem('Downloading engine tools $dirName...', + url + dirName + '/artifacts.zip', dir); _makeFilesExecutable(dir); } } diff --git a/packages/flutter_tools/lib/src/commands/build_apk.dart b/packages/flutter_tools/lib/src/commands/build_apk.dart index 224ca17c177..7703f3cb71d 100644 --- a/packages/flutter_tools/lib/src/commands/build_apk.dart +++ b/packages/flutter_tools/lib/src/commands/build_apk.dart @@ -8,7 +8,6 @@ import 'dart:io'; import 'package:path/path.dart' as path; import '../android/android_sdk.dart'; -import '../artifacts.dart'; import '../base/file_system.dart' show ensureDirectoryExists; import '../base/os.dart'; import '../base/process.dart'; @@ -207,8 +206,6 @@ class BuildApkCommand extends FlutterCommand { TargetPlatform.android_arm, variant, toolchain: toolchain, - configs: buildConfigurations, - enginePath: runner.enginePath, force: true, manifest: argResults['manifest'], resources: argResults['resources'], @@ -227,51 +224,43 @@ class BuildApkCommand extends FlutterCommand { Future<_ApkComponents> _findApkComponents( TargetPlatform platform, - BuildConfiguration config, - String enginePath, + BuildVariant buildVariant, String manifest, - String resources, - BuildVariant buildVariant + String resources ) async { - // TODO(devoncarew): Get the right artifacts for [buildVariant]. - - List artifactPaths; - if (enginePath != null) { - String abiDir = platform == TargetPlatform.android_arm ? 'armeabi-v7a' : 'x86_64'; - artifactPaths = [ - '$enginePath/third_party/icu/android/icudtl.dat', - '${config.buildDir}/gen/sky/shell/shell/classes.dex.jar', - '${config.buildDir}/gen/sky/shell/shell/shell/libs/$abiDir/libsky_shell.so', - '$enginePath/build/android/ant/chromium-debug.keystore', - ]; - } else { - List artifactTypes = [ - ArtifactType.androidIcuData, - ArtifactType.androidClassesJar, - ArtifactType.androidLibSkyShell, - ArtifactType.androidKeystore, - ]; - artifactPaths = artifactTypes.map((ArtifactType type) { - return ArtifactStore.getPath(ArtifactStore.getArtifact( - type: type, - targetPlatform: config.targetPlatform - )); - }).toList(); - } - _ApkComponents components = new _ApkComponents(); components.manifest = new File(manifest); - components.icuData = new File(artifactPaths[0]); - components.jars = [new File(artifactPaths[1])]; - components.libSkyShell = new File(artifactPaths[2]); - components.debugKeystore = new File(artifactPaths[3]); components.resources = resources == null ? null : new Directory(resources); + if (tools.isLocalEngine) { + String abiDir = platform == TargetPlatform.android_arm ? 'armeabi-v7a' : 'x86_64'; + String enginePath = tools.engineSrcPath; + String buildDir = tools.getEngineArtifactsDirectory(platform, buildVariant).path; + + components.icuData = new File('$enginePath/third_party/icu/android/icudtl.dat'); + components.jars = [ + new File('$buildDir/gen/sky/shell/shell/classes.dex.jar') + ]; + components.libSkyShell = new File('$buildDir/gen/sky/shell/shell/shell/libs/$abiDir/libsky_shell.so'); + components.debugKeystore = new File('$enginePath/build/android/ant/chromium-debug.keystore'); + } else { + Directory artifacts = tools.getEngineArtifactsDirectory(platform, buildVariant); + + components.icuData = new File(path.join(artifacts.path, 'icudtl.dat')); + components.jars = [ + new File(path.join(artifacts.path, 'classes.dex.jar')) + ]; + components.libSkyShell = new File(path.join(artifacts.path, 'libsky_shell.so')); + components.debugKeystore = new File(path.join(artifacts.path, 'chromium-debug.keystore')); + } + await parseServiceConfigs(components.services, jars: components.jars); - for (File file in [ + List allFiles = [ components.manifest, components.icuData, components.libSkyShell, components.debugKeystore - ]..addAll(components.jars)) { + ]..addAll(components.jars); + + for (File file in allFiles) { if (!file.existsSync()) { printError('Cannot locate file: ${file.path}'); return null; @@ -333,7 +322,8 @@ int _buildApk( File apkShaFile = new File('$outputFile.sha1'); apkShaFile.writeAsStringSync(calculateSha(finalApk)); - printStatus('Generated APK to ${finalApk.path}.'); + double size = finalApk.lengthSync() / (1024 * 1024); + printStatus('Built ${finalApk.path} (${size.toStringAsFixed(1)}MB).'); return 0; } finally { @@ -403,8 +393,6 @@ Future buildAndroid( TargetPlatform platform, BuildVariant buildVariant, { Toolchain toolchain, - List configs, - String enginePath, bool force: false, String manifest: _kDefaultAndroidManifestPath, String resources, @@ -441,17 +429,17 @@ Future buildAndroid( resources = _kDefaultResourcesPath; } - BuildConfiguration config = configs.firstWhere((BuildConfiguration bc) => bc.targetPlatform == platform); _ApkComponents components = await _findApkComponents( - platform, config, enginePath, manifest, resources, buildVariant + platform, buildVariant, manifest, resources ); if (components == null) { - printError('Failure building APK. Unable to find components.'); + printError('Failure building APK: unable to find components.'); return 1; } - printStatus('Building APK in ${getVariantName(buildVariant)} mode...'); + String typeName = path.basename(tools.getEngineArtifactsDirectory(platform, buildVariant).path); + printStatus('Building APK in ${getVariantName(buildVariant)} mode ($typeName)...'); if (flxPath != null && flxPath.isNotEmpty) { if (!FileSystemEntity.isFileSync(flxPath)) { @@ -475,14 +463,12 @@ Future buildAndroid( Future buildApk( TargetPlatform platform, - Toolchain toolchain, - List configs, { - String enginePath, + Toolchain toolchain, { String target, BuildVariant buildVariant: BuildVariant.develop }) async { if (!FileSystemEntity.isFileSync(_kDefaultAndroidManifestPath)) { - printError('Cannot build APK. Missing $_kDefaultAndroidManifestPath.'); + printError('Cannot build APK: missing $_kDefaultAndroidManifestPath.'); return 1; } @@ -490,8 +476,6 @@ Future buildApk( platform, buildVariant, toolchain: toolchain, - configs: configs, - enginePath: enginePath, force: false, target: target ); diff --git a/packages/flutter_tools/lib/src/commands/build_ios.dart b/packages/flutter_tools/lib/src/commands/build_ios.dart index 7062d588942..a606b1de625 100644 --- a/packages/flutter_tools/lib/src/commands/build_ios.dart +++ b/packages/flutter_tools/lib/src/commands/build_ios.dart @@ -30,7 +30,7 @@ class BuildIOSCommand extends FlutterCommand { return 1; } - IOSApp app = applicationPackages.iOS; + IOSApp app = applicationPackages.getPackageForPlatform(TargetPlatform.ios); if (app == null) { printError('Application not configured for iOS'); @@ -47,7 +47,7 @@ class BuildIOSCommand extends FlutterCommand { String logTarget = forSimulator ? "simulator" : "device"; - printStatus('Building the application for $logTarget.'); + printStatus('Building $app for $logTarget...'); bool result = await buildIOSXcodeProject(app, buildForDevice: !forSimulator, codesign: shouldCodesign); diff --git a/packages/flutter_tools/lib/src/commands/daemon.dart b/packages/flutter_tools/lib/src/commands/daemon.dart index 11f6ae4f726..24d8993463d 100644 --- a/packages/flutter_tools/lib/src/commands/daemon.dart +++ b/packages/flutter_tools/lib/src/commands/daemon.dart @@ -265,7 +265,6 @@ class AppDomain extends Domain { int result = await startApp( device, command.toolchain, - command.buildConfigurations, stop: true, target: args['target'], route: args['route'], diff --git a/packages/flutter_tools/lib/src/commands/drive.dart b/packages/flutter_tools/lib/src/commands/drive.dart index 98ba72e37f7..b4cc8934b59 100644 --- a/packages/flutter_tools/lib/src/commands/drive.dart +++ b/packages/flutter_tools/lib/src/commands/drive.dart @@ -243,8 +243,9 @@ Future startApp(DriveCommand command) async { if (command.device is AndroidDevice) { printTrace('Building an APK.'); int result = await build_apk.buildApk( - command.device.platform, command.toolchain, command.buildConfigurations, - enginePath: command.runner.enginePath, target: command.target + command.device.platform, + command.toolchain, + target: command.target ); if (result != 0) diff --git a/packages/flutter_tools/lib/src/commands/listen.dart b/packages/flutter_tools/lib/src/commands/listen.dart index f50eb4dbf56..352bd380f90 100644 --- a/packages/flutter_tools/lib/src/commands/listen.dart +++ b/packages/flutter_tools/lib/src/commands/listen.dart @@ -59,7 +59,6 @@ class ListenCommand extends RunCommandBase { result = await startApp( deviceForCommand, toolchain, - buildConfigurations, target: target, install: firstTime, stop: true, diff --git a/packages/flutter_tools/lib/src/commands/run.dart b/packages/flutter_tools/lib/src/commands/run.dart index f30cf4e03bd..e7633cf9ae0 100644 --- a/packages/flutter_tools/lib/src/commands/run.dart +++ b/packages/flutter_tools/lib/src/commands/run.dart @@ -97,7 +97,6 @@ class RunCommand extends RunCommandBase { int result = await startApp( deviceForCommand, toolchain, - buildConfigurations, target: target, enginePath: runner.enginePath, install: true, @@ -127,8 +126,7 @@ String _getMissingPackageHintForPlatform(TargetPlatform platform) { Future startApp( Device device, - Toolchain toolchain, - List configs, { + Toolchain toolchain, { String target, String enginePath, bool stop: true, @@ -165,8 +163,8 @@ Future startApp( printTrace('Running build command.'); int result = await buildApk( - device.platform, toolchain, configs, - enginePath: enginePath, + device.platform, + toolchain, target: target, buildVariant: BuildVariant.develop ); diff --git a/packages/flutter_tools/lib/src/toolchain.dart b/packages/flutter_tools/lib/src/toolchain.dart index 39db5cb71c0..d7537ec8fac 100644 --- a/packages/flutter_tools/lib/src/toolchain.dart +++ b/packages/flutter_tools/lib/src/toolchain.dart @@ -98,6 +98,8 @@ class ToolConfiguration { /// Used to override the directory calculated from engineSrcPath (--engine-out-dir). String engineOutDir; + bool get isLocalEngine => engineSrcPath != null || engineOutDir != null; + String get _modeStr => release ? 'Release' : 'Debug'; /// The directory that contains development tools for the given platform. This @@ -159,9 +161,11 @@ class ToolConfiguration { // Return something like 'out/android_Release'. return new Directory(path.join(engineSrcPath, 'out/${type}_$_modeStr')); } else { - // TODO(devoncarew): We'll want to suffix the directory name with the variant. + // For now, only suffix for deploy variants. + String suffix = variant == BuildVariant.deploy ? '-${getVariantName(variant)}' : ''; - String dirName = getNameForTargetPlatform(platform); + // Create something like `android-arm` or `android-arm-deploy`. + String dirName = getNameForTargetPlatform(platform) + suffix; Directory engineDir = _cache.getArtifactDirectory('engine'); return new Directory(path.join(engineDir.path, dirName)); } diff --git a/packages/flutter_tools/test/toolchain_test.dart b/packages/flutter_tools/test/toolchain_test.dart index 7b83f632b59..730b3906860 100644 --- a/packages/flutter_tools/test/toolchain_test.dart +++ b/packages/flutter_tools/test/toolchain_test.dart @@ -38,7 +38,7 @@ void main() { ); expect( toolConfig.getEngineArtifactsDirectory(TargetPlatform.android_arm, BuildVariant.deploy).path, - endsWith('cache/artifacts/engine/android-arm') + endsWith('cache/artifacts/engine/android-arm-deploy') ); });