From 7a3baded76071a23d86efa0ca431376554a45f09 Mon Sep 17 00:00:00 2001 From: Gray Mackall <34871572+gmackall@users.noreply.github.com> Date: Tue, 21 May 2024 11:53:53 -0700 Subject: [PATCH] Add a migrator to remove `FlutterMultiDexApplication.java` (#148515) Fixes https://github.com/flutter/flutter/issues/148368. See [my comment](https://github.com/flutter/flutter/issues/148368#issuecomment-2116133180) for the specific context. --- .../flutter_tools/lib/src/android/gradle.dart | 2 + .../multidex_removal_migration.dart | 40 ++++++++++++++++ .../android_project_migration_test.dart | 46 +++++++++++++++++++ 3 files changed, 88 insertions(+) create mode 100644 packages/flutter_tools/lib/src/android/migrations/multidex_removal_migration.dart diff --git a/packages/flutter_tools/lib/src/android/gradle.dart b/packages/flutter_tools/lib/src/android/gradle.dart index 8280b1d987..3bd5bc9df4 100644 --- a/packages/flutter_tools/lib/src/android/gradle.dart +++ b/packages/flutter_tools/lib/src/android/gradle.dart @@ -37,6 +37,7 @@ import 'gradle_utils.dart'; import 'java.dart'; import 'migrations/android_studio_java_gradle_conflict_migration.dart'; import 'migrations/min_sdk_version_migration.dart'; +import 'migrations/multidex_removal_migration.dart'; import 'migrations/top_level_gradle_build_file_migration.dart'; /// The regex to grab variant names from printBuildVariants gradle task @@ -313,6 +314,7 @@ class AndroidGradleBuilder implements AndroidBuilder { androidStudio: _androidStudio, java: globals.java), MinSdkVersionMigration(project.android, _logger), + MultidexRemovalMigration(project.android, _logger), ]; final ProjectMigration migration = ProjectMigration(migrators); diff --git a/packages/flutter_tools/lib/src/android/migrations/multidex_removal_migration.dart b/packages/flutter_tools/lib/src/android/migrations/multidex_removal_migration.dart new file mode 100644 index 0000000000..bfbc6ef17b --- /dev/null +++ b/packages/flutter_tools/lib/src/android/migrations/multidex_removal_migration.dart @@ -0,0 +1,40 @@ +// Copyright 2014 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import '../../base/file_system.dart'; +import '../../base/project_migrator.dart'; +import '../../project.dart'; + +/// This migrator deletes an old file that was created to support enabling +/// Multidex, which is no longer needed and causes builds to fail if not +/// deleted. +class MultidexRemovalMigration extends ProjectMigrator { + + MultidexRemovalMigration(AndroidProject project, super.logger) + : _project = project; + + final AndroidProject _project; + + static const String deletionMessage = 'Deleted obsolete FlutterMultiDexApplication.java file.'; + + File _getMultiDexApplicationFile() { + return _project.hostAppGradleRoot + .childDirectory('src') + .childDirectory('main') + .childDirectory('java') + .childDirectory('io') + .childDirectory('flutter') + .childDirectory('app') + .childFile('FlutterMultiDexApplication.java'); + } + + @override + Future migrate() async { + final File multiDexApplicationFile = _getMultiDexApplicationFile(); + if (multiDexApplicationFile.existsSync()) { + multiDexApplicationFile.deleteSync(); + logger.printTrace(deletionMessage); + } + } +} diff --git a/packages/flutter_tools/test/general.shard/android/android_project_migration_test.dart b/packages/flutter_tools/test/general.shard/android/android_project_migration_test.dart index e8af1b4948..dc99328adb 100644 --- a/packages/flutter_tools/test/general.shard/android/android_project_migration_test.dart +++ b/packages/flutter_tools/test/general.shard/android/android_project_migration_test.dart @@ -8,6 +8,7 @@ import 'package:flutter_tools/src/android/android_studio.dart'; import 'package:flutter_tools/src/android/gradle_utils.dart'; import 'package:flutter_tools/src/android/migrations/android_studio_java_gradle_conflict_migration.dart'; import 'package:flutter_tools/src/android/migrations/min_sdk_version_migration.dart'; +import 'package:flutter_tools/src/android/migrations/multidex_removal_migration.dart'; import 'package:flutter_tools/src/android/migrations/top_level_gradle_build_file_migration.dart'; import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/base/version.dart'; @@ -426,6 +427,51 @@ tasks.register("clean", Delete) { expect(project.appGradleFile.readAsStringSync(), sampleModuleGradleBuildFile(equalsSyntaxMinSdkVersion19)); }); }); + + group('delete FlutterMultiDexApplication.java, if it exists', () + { + late MemoryFileSystem memoryFileSystem; + late BufferLogger bufferLogger; + late FakeAndroidProject project; + late MultidexRemovalMigration migration; + + setUp(() { + memoryFileSystem = MemoryFileSystem.test(); + memoryFileSystem.currentDirectory.childDirectory('android').createSync(); + bufferLogger = BufferLogger.test(); + project = FakeAndroidProject( + root: memoryFileSystem.currentDirectory.childDirectory('android'), + ); + project.appGradleFile.parent.createSync(recursive: true); + migration = MultidexRemovalMigration( + project, + bufferLogger + ); + }); + + testWithoutContext('do nothing when FlutterMultiDexApplication.java is not present', () async { + await migration.migrate(); + expect(bufferLogger.traceText, isEmpty); + }); + + testWithoutContext('delete and note when FlutterMultiDexApplication.java is present', () async { + // Write a blank string to the FlutterMultiDexApplication.java file. + final File flutterMultiDexApplication = project.hostAppGradleRoot + .childDirectory('src') + .childDirectory('main') + .childDirectory('java') + .childDirectory('io') + .childDirectory('flutter') + .childDirectory('app') + .childFile('FlutterMultiDexApplication.java') + ..createSync(recursive: true); + flutterMultiDexApplication.writeAsStringSync(''); + + await migration.migrate(); + expect(bufferLogger.traceText, contains(MultidexRemovalMigration.deletionMessage)); + expect(flutterMultiDexApplication.existsSync(), false); + }); + }); }); }