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

import 'package:meta/meta.dart';

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

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

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

  /// 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 {
50
  const _AndroidBuilderImpl();
51 52 53 54 55

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

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

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