android_workflow.dart 3.18 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 6 7
import 'dart:io';

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

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

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

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

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

24
  @override
25
  ValidationResult validate() {
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
    List<ValidationMessage> messages = <ValidationMessage>[];
    ValidationType type = ValidationType.missing;
    String sdkVersionText;

    if (androidSdk == null) {
      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).'
      ));
    } else {
      type = ValidationType.partial;

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

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

43 44 45 46
        messages.add(new ValidationMessage(
          'Platform ${androidSdk.latestVersion.platformVersionName}, '
          'build-tools ${androidSdk.latestVersion.buildToolsVersionName}'
        ));
47 48 49 50 51
      }

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

      if (validationResult.isEmpty) {
52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
        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.'
            ));
76 77
          } else {
            type = ValidationType.installed;
78 79 80 81 82 83
          }
        } else {
          messages.add(new ValidationMessage.error(
            'No Java SDK found; you can download Java from $_kJdkDownload.'
          ));
        }
84 85 86 87 88 89 90 91 92
      } 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);
93 94
  }
}