android_workflow.dart 3.75 KB
Newer Older
1 2 3 4
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

5
import 'dart:async';
6 7 8
import 'dart:io';

import '../base/os.dart';
9
import '../doctor.dart';
10
import '../globals.dart';
11 12
import 'android_sdk.dart';

13 14
class AndroidWorkflow extends DoctorValidator implements Workflow {
  AndroidWorkflow() : super('Android toolchain - develop for Android devices');
15

16
  @override
17 18
  bool get appliesToHostPlatform => true;

19
  @override
20 21
  bool get canListDevices => getAdbPath(androidSdk) != null;

22
  @override
23
  bool get canLaunchDevices => androidSdk != null && androidSdk.validateSdkWellFormed().isEmpty;
24

25
  @override
26
  Future<ValidationResult> validate() async {
27 28 29 30 31
    List<ValidationMessage> messages = <ValidationMessage>[];
    ValidationType type = ValidationType.missing;
    String sdkVersionText;

    if (androidSdk == null) {
32 33 34 35 36 37 38 39 40 41 42 43
      if (Platform.environment.containsKey(kAndroidHome)) {
        String androidHomeDir = Platform.environment[kAndroidHome];
        messages.add(new ValidationMessage.error(
          '$kAndroidHome = $androidHomeDir\n'
          'but Android Studio / Android SDK not found at this location.'
        ));
      } else {
        messages.add(new ValidationMessage.error(
          'Android Studio / Android SDK not found. Download from https://developer.android.com/sdk/\n'
          '(or visit https://flutter.io/setup/#android-setup for detailed instructions).'
        ));
      }
44 45 46 47 48 49 50 51
    } else {
      type = ValidationType.partial;

      messages.add(new ValidationMessage('Android SDK at ${androidSdk.directory}'));

      if (androidSdk.latestVersion != null) {
        sdkVersionText = 'Android SDK ${androidSdk.latestVersion.buildToolsVersionName}';

52 53 54 55
        messages.add(new ValidationMessage(
          'Platform ${androidSdk.latestVersion.platformVersionName}, '
          'build-tools ${androidSdk.latestVersion.buildToolsVersionName}'
        ));
56 57
      }

58 59 60 61 62
      if (Platform.environment.containsKey(kAndroidHome)) {
        String androidHomeDir = Platform.environment[kAndroidHome];
        messages.add(new ValidationMessage('$kAndroidHome = $androidHomeDir'));
      }

63 64 65
      List<String> validationResult = androidSdk.validateSdkWellFormed();

      if (validationResult.isEmpty) {
66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
        const String _kJdkDownload = 'https://www.oracle.com/technetwork/java/javase/downloads/';

        String javaVersion;

        try {
          printTrace('java -version');

          ProcessResult result = Process.runSync('java', <String>['-version']);
          if (result.exitCode == 0) {
            javaVersion = result.stderr;
            List<String> versionLines = javaVersion.split('\n');
            javaVersion = versionLines.length >= 2 ? versionLines[1] : versionLines[0];
          }
        } catch (error) {
        }

        if (javaVersion != null) {
          messages.add(new ValidationMessage(javaVersion));

          if (os.which('jarsigner') == null) {
            messages.add(new ValidationMessage.error(
              'The jarsigner utility was not found; this is used to build Android APKs. You may need to install\n'
              'or re-install the Java JDK: $_kJdkDownload.'
            ));
90 91
          } else {
            type = ValidationType.installed;
92 93 94 95 96 97
          }
        } else {
          messages.add(new ValidationMessage.error(
            'No Java SDK found; you can download Java from $_kJdkDownload.'
          ));
        }
98 99 100 101 102 103 104 105 106
      } else {
        messages.addAll(validationResult.map((String message) {
          return new ValidationMessage.error(message);
        }));
        messages.add(new ValidationMessage('Try re-installing or updating your Android SDK.'));
      }
    }

    return new ValidationResult(type, messages, statusInfo: sdkVersionText);
107 108
  }
}