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.
This commit is contained in:
Gray Mackall
2024-05-21 11:53:53 -07:00
committed by GitHub
parent 7d891907e3
commit 7a3baded76
3 changed files with 88 additions and 0 deletions

View File

@@ -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);

View File

@@ -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<void> migrate() async {
final File multiDexApplicationFile = _getMultiDexApplicationFile();
if (multiDexApplicationFile.existsSync()) {
multiDexApplicationFile.deleteSync();
logger.printTrace(deletionMessage);
}
}
}

View File

@@ -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);
});
});
});
}