android_builder.dart 3.81 KB
Newer Older
Ian Hickson's avatar
Ian Hickson committed
1
// Copyright 2014 The Flutter Authors. All rights reserved.
2 3 4 5 6 7 8
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'dart:async';

import 'package:meta/meta.dart';

9
import '../android/gradle_errors.dart';
10
import '../base/context.dart';
11
import '../base/file_system.dart';
12
import '../build_info.dart';
13
import '../globals.dart' as globals;
14 15 16 17
import '../project.dart';
import 'gradle.dart';

/// The builder in the current context.
18 19 20
AndroidBuilder get androidBuilder {
  return context.get<AndroidBuilder>() ?? const _AndroidBuilderImpl();
}
21 22

/// Provides the methods to build Android artifacts.
23
// TODO(egarciad): https://github.com/flutter/flutter/issues/43863
24
abstract class AndroidBuilder {
25
  const AndroidBuilder();
26 27 28
  /// Builds an AAR artifact.
  Future<void> buildAar({
    @required FlutterProject project,
29
    @required Set<AndroidBuildInfo> androidBuildInfo,
30
    @required String target,
31
    @required String outputDirectoryPath,
32
    @required String buildNumber,
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
  });

  /// Builds an APK artifact.
  Future<void> buildApk({
    @required FlutterProject project,
    @required AndroidBuildInfo androidBuildInfo,
    @required String target,
  });

  /// Builds an App Bundle artifact.
  Future<void> buildAab({
    @required FlutterProject project,
    @required AndroidBuildInfo androidBuildInfo,
    @required String target,
  });
}

/// Default implementation of [AarBuilder].
class _AndroidBuilderImpl extends AndroidBuilder {
52
  const _AndroidBuilderImpl();
53 54 55 56 57

  /// Builds the AAR and POM files for the current Flutter module or plugin.
  @override
  Future<void> buildAar({
    @required FlutterProject project,
58
    @required Set<AndroidBuildInfo> androidBuildInfo,
59
    @required String target,
60
    @required String outputDirectoryPath,
61
    @required String buildNumber,
62
  }) async {
63
    try {
64
      Directory outputDirectory =
65
        globals.fs.directory(outputDirectoryPath ?? project.android.buildDirectory);
66 67 68 69
      if (project.isModule) {
        // Module projects artifacts are located in `build/host`.
        outputDirectory = outputDirectory.childDirectory('host');
      }
70
      for (final AndroidBuildInfo androidBuildInfo in androidBuildInfo) {
71 72 73 74 75
        await buildGradleAar(
          project: project,
          androidBuildInfo: androidBuildInfo,
          target: target,
          outputDirectory: outputDirectory,
76
          buildNumber: buildNumber,
77 78 79 80 81 82 83 84 85
        );
      }
      printHowToConsumeAar(
        buildModes: androidBuildInfo
          .map<String>((AndroidBuildInfo androidBuildInfo) {
            return androidBuildInfo.buildInfo.modeName;
          }).toSet(),
        androidPackage: project.manifest.androidPackage,
        repoDirectory: getRepoDirectory(outputDirectory),
86
        buildNumber: buildNumber,
87 88
        logger: globals.logger,
        fileSystem: globals.fs,
89 90
      );
    } finally {
91
      globals.androidSdk?.reinitialize();
92
    }
93 94 95 96 97 98 99 100 101
  }

  /// Builds the APK.
  @override
  Future<void> buildApk({
    @required FlutterProject project,
    @required AndroidBuildInfo androidBuildInfo,
    @required String target,
  }) async {
102
    try {
103
      await buildGradleApp(
104 105 106 107
        project: project,
        androidBuildInfo: androidBuildInfo,
        target: target,
        isBuildingBundle: false,
108
        localGradleErrors: gradleErrors,
109 110
      );
    } finally {
111
      globals.androidSdk?.reinitialize();
112
    }
113 114 115 116 117 118 119 120 121
  }

  /// Builds the App Bundle.
  @override
  Future<void> buildAab({
    @required FlutterProject project,
    @required AndroidBuildInfo androidBuildInfo,
    @required String target,
  }) async {
122
    try {
123
      await buildGradleApp(
124 125 126 127
        project: project,
        androidBuildInfo: androidBuildInfo,
        target: target,
        isBuildingBundle: true,
128
        localGradleErrors: gradleErrors,
129 130
      );
    } finally {
131
      globals.androidSdk?.reinitialize();
132 133 134
    }
  }
}