Commit 98016b1c authored by John McCutchan's avatar John McCutchan Committed by GitHub

Cleanup application startup on Android devices (#6949)

- [x] Stop unnecessarily building the flx a second time on startup.
- [x] Stop unncessarily copying the flx to the device a second time on startup.
- [x] Remove `startBundle` and move logic into `startApp`.
parent 9c1a24fa
......@@ -13,7 +13,6 @@ import '../base/logger.dart';
import '../base/process.dart';
import '../build_info.dart';
import '../device.dart';
import '../flx.dart' as flx;
import '../globals.dart';
import '../protocol_discovery.dart';
import 'adb.dart';
......@@ -22,10 +21,6 @@ import 'android_sdk.dart';
const String _defaultAdbPath = 'adb';
// Path where the FLX bundle will be copied on the device.
const String _deviceBundlePath = '/data/local/tmp/dev.flx';
class AndroidDevices extends PollingDeviceDiscovery {
AndroidDevices() : super('AndroidDevices');
......@@ -274,60 +269,49 @@ class AndroidDevice extends Device {
return null;
}
Future<LaunchResult> startBundle(AndroidApk apk, String bundlePath, {
bool traceStartup: false,
@override
Future<LaunchResult> startApp(
ApplicationPackage package,
BuildMode mode, {
String mainPath,
String route,
DebuggingOptions options
DebuggingOptions debuggingOptions,
Map<String, dynamic> platformArgs,
bool prebuiltApplication: false
}) async {
printTrace('$this startBundle');
if (bundlePath != null) {
if (!FileSystemEntity.isFileSync(bundlePath)) {
printError('Cannot find $bundlePath');
return new LaunchResult.failed();
}
if (!_checkForSupportedAdbVersion() || !_checkForSupportedAndroidVersion())
return new LaunchResult.failed();
runCheckedSync(
adbCommandForDevice(<String>['push', bundlePath, _deviceBundlePath]));
}
final bool traceStartup = platformArgs['trace-startup'] ?? false;
final AndroidApk apk = package;
printTrace('$this startApp');
ProtocolDiscovery observatoryDiscovery;
ProtocolDiscovery diagnosticDiscovery;
DeviceLogReader logReader = getLogReader();
if (options.debuggingEnabled) {
if (debuggingOptions.debuggingEnabled) {
observatoryDiscovery = new ProtocolDiscovery(logReader, ProtocolDiscovery.kObservatoryService);
diagnosticDiscovery = new ProtocolDiscovery(logReader, ProtocolDiscovery.kDiagnosticService);
}
List<String> cmd;
if (bundlePath != null) {
// Specify in the RUN intent the path to the local bundle pushed.
cmd = adbCommandForDevice(<String>[
'shell', 'am', 'start',
'-a', 'android.intent.action.RUN',
'-d', _deviceBundlePath,
'-f', '0x20000000', // FLAG_ACTIVITY_SINGLE_TOP
'--ez', 'enable-background-compilation', 'true',
]);
} else {
cmd = adbCommandForDevice(<String>[
'shell', 'am', 'start',
'-a', 'android.intent.action.RUN',
'-f', '0x20000000', // FLAG_ACTIVITY_SINGLE_TOP
'--ez', 'enable-background-compilation', 'true',
]);
}
cmd = adbCommandForDevice(<String>[
'shell', 'am', 'start',
'-a', 'android.intent.action.RUN',
'-f', '0x20000000', // FLAG_ACTIVITY_SINGLE_TOP
'--ez', 'enable-background-compilation', 'true',
]);
if (traceStartup)
cmd.addAll(<String>['--ez', 'trace-startup', 'true']);
if (route != null)
cmd.addAll(<String>['--es', 'route', route]);
if (options.debuggingEnabled) {
if (options.buildMode == BuildMode.debug)
if (debuggingOptions.debuggingEnabled) {
if (debuggingOptions.buildMode == BuildMode.debug)
cmd.addAll(<String>['--ez', 'enable-checked-mode', 'true']);
if (options.startPaused)
if (debuggingOptions.startPaused)
cmd.addAll(<String>['--ez', 'start-paused', 'true']);
}
cmd.add(apk.launchActivity);
......@@ -338,7 +322,7 @@ class AndroidDevice extends Device {
return new LaunchResult.failed();
}
if (!options.debuggingEnabled) {
if (!debuggingOptions.debuggingEnabled) {
return new LaunchResult.succeeded();
} else {
// Wait for the service protocol port here. This will complete once the
......@@ -348,9 +332,9 @@ class AndroidDevice extends Device {
try {
int observatoryDevicePort, diagnosticDevicePort;
if (options.buildMode == BuildMode.debug) {
if (debuggingOptions.buildMode == BuildMode.debug) {
Future<List<int>> scrapeServicePorts = Future.wait(
<Future<int>>[observatoryDiscovery.nextPort(), diagnosticDiscovery.nextPort()]
<Future<int>>[observatoryDiscovery.nextPort(), diagnosticDiscovery.nextPort()]
);
List<int> devicePorts = await scrapeServicePorts.timeout(new Duration(seconds: 20));
observatoryDevicePort = devicePorts[0];
......@@ -360,7 +344,7 @@ class AndroidDevice extends Device {
}
printTrace('observatory port on device: $observatoryDevicePort');
int observatoryLocalPort = await options.findBestObservatoryPort();
int observatoryLocalPort = await debuggingOptions.findBestObservatoryPort();
// TODO(devoncarew): Remember the forwarding information (so we can later remove the
// port forwarding).
observatoryLocalPort = await _forwardPort(ProtocolDiscovery.kObservatoryService, observatoryDevicePort, observatoryLocalPort);
......@@ -368,13 +352,13 @@ class AndroidDevice extends Device {
int diagnosticLocalPort;
if (diagnosticDevicePort != null) {
printTrace('diagnostic port on device: $diagnosticDevicePort');
diagnosticLocalPort = await options.findBestDiagnosticPort();
diagnosticLocalPort = await debuggingOptions.findBestDiagnosticPort();
diagnosticLocalPort = await _forwardPort(ProtocolDiscovery.kDiagnosticService, diagnosticDevicePort, diagnosticLocalPort);
}
return new LaunchResult.succeeded(
observatoryPort: observatoryLocalPort,
diagnosticPort: diagnosticLocalPort
observatoryPort: observatoryLocalPort,
diagnosticPort: diagnosticLocalPort
);
} catch (error) {
if (error is TimeoutException)
......@@ -389,42 +373,6 @@ class AndroidDevice extends Device {
}
}
@override
Future<LaunchResult> startApp(
ApplicationPackage package,
BuildMode mode, {
String mainPath,
String route,
DebuggingOptions debuggingOptions,
Map<String, dynamic> platformArgs,
bool prebuiltApplication: false
}) async {
if (!_checkForSupportedAdbVersion() || !_checkForSupportedAndroidVersion())
return new LaunchResult.failed();
String localBundlePath;
if (!prebuiltApplication) {
localBundlePath = await flx.buildFlx(
mainPath: mainPath,
precompiledSnapshot: isAotBuildMode(debuggingOptions.buildMode),
includeRobotoFonts: false
);
if (localBundlePath == null)
return new LaunchResult.failed();
}
printTrace('Starting bundle for $this.');
return startBundle(
package,
localBundlePath,
traceStartup: platformArgs['trace-startup'] ?? false,
route: route,
options: debuggingOptions
);
}
@override
bool get supportsHotMode => true;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment