Skip to content

Commit 7a3bade

Browse files
authored
Add a migrator to remove FlutterMultiDexApplication.java (#148515)
Fixes flutter/flutter#148368. See [my comment](flutter/flutter#148368 (comment)) for the specific context.
1 parent 7d89190 commit 7a3bade

File tree

3 files changed

+88
-0
lines changed

3 files changed

+88
-0
lines changed

packages/flutter_tools/lib/src/android/gradle.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import 'gradle_utils.dart';
3737
import 'java.dart';
3838
import 'migrations/android_studio_java_gradle_conflict_migration.dart';
3939
import 'migrations/min_sdk_version_migration.dart';
40+
import 'migrations/multidex_removal_migration.dart';
4041
import 'migrations/top_level_gradle_build_file_migration.dart';
4142

4243
/// The regex to grab variant names from printBuildVariants gradle task
@@ -313,6 +314,7 @@ class AndroidGradleBuilder implements AndroidBuilder {
313314
androidStudio: _androidStudio,
314315
java: globals.java),
315316
MinSdkVersionMigration(project.android, _logger),
317+
MultidexRemovalMigration(project.android, _logger),
316318
];
317319

318320
final ProjectMigration migration = ProjectMigration(migrators);
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
// Copyright 2014 The Flutter Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style license that can be
3+
// found in the LICENSE file.
4+
5+
import '../../base/file_system.dart';
6+
import '../../base/project_migrator.dart';
7+
import '../../project.dart';
8+
9+
/// This migrator deletes an old file that was created to support enabling
10+
/// Multidex, which is no longer needed and causes builds to fail if not
11+
/// deleted.
12+
class MultidexRemovalMigration extends ProjectMigrator {
13+
14+
MultidexRemovalMigration(AndroidProject project, super.logger)
15+
: _project = project;
16+
17+
final AndroidProject _project;
18+
19+
static const String deletionMessage = 'Deleted obsolete FlutterMultiDexApplication.java file.';
20+
21+
File _getMultiDexApplicationFile() {
22+
return _project.hostAppGradleRoot
23+
.childDirectory('src')
24+
.childDirectory('main')
25+
.childDirectory('java')
26+
.childDirectory('io')
27+
.childDirectory('flutter')
28+
.childDirectory('app')
29+
.childFile('FlutterMultiDexApplication.java');
30+
}
31+
32+
@override
33+
Future<void> migrate() async {
34+
final File multiDexApplicationFile = _getMultiDexApplicationFile();
35+
if (multiDexApplicationFile.existsSync()) {
36+
multiDexApplicationFile.deleteSync();
37+
logger.printTrace(deletionMessage);
38+
}
39+
}
40+
}

packages/flutter_tools/test/general.shard/android/android_project_migration_test.dart

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import 'package:flutter_tools/src/android/android_studio.dart';
88
import 'package:flutter_tools/src/android/gradle_utils.dart';
99
import 'package:flutter_tools/src/android/migrations/android_studio_java_gradle_conflict_migration.dart';
1010
import 'package:flutter_tools/src/android/migrations/min_sdk_version_migration.dart';
11+
import 'package:flutter_tools/src/android/migrations/multidex_removal_migration.dart';
1112
import 'package:flutter_tools/src/android/migrations/top_level_gradle_build_file_migration.dart';
1213
import 'package:flutter_tools/src/base/logger.dart';
1314
import 'package:flutter_tools/src/base/version.dart';
@@ -426,6 +427,51 @@ tasks.register("clean", Delete) {
426427
expect(project.appGradleFile.readAsStringSync(), sampleModuleGradleBuildFile(equalsSyntaxMinSdkVersion19));
427428
});
428429
});
430+
431+
group('delete FlutterMultiDexApplication.java, if it exists', ()
432+
{
433+
late MemoryFileSystem memoryFileSystem;
434+
late BufferLogger bufferLogger;
435+
late FakeAndroidProject project;
436+
late MultidexRemovalMigration migration;
437+
438+
setUp(() {
439+
memoryFileSystem = MemoryFileSystem.test();
440+
memoryFileSystem.currentDirectory.childDirectory('android').createSync();
441+
bufferLogger = BufferLogger.test();
442+
project = FakeAndroidProject(
443+
root: memoryFileSystem.currentDirectory.childDirectory('android'),
444+
);
445+
project.appGradleFile.parent.createSync(recursive: true);
446+
migration = MultidexRemovalMigration(
447+
project,
448+
bufferLogger
449+
);
450+
});
451+
452+
testWithoutContext('do nothing when FlutterMultiDexApplication.java is not present', () async {
453+
await migration.migrate();
454+
expect(bufferLogger.traceText, isEmpty);
455+
});
456+
457+
testWithoutContext('delete and note when FlutterMultiDexApplication.java is present', () async {
458+
// Write a blank string to the FlutterMultiDexApplication.java file.
459+
final File flutterMultiDexApplication = project.hostAppGradleRoot
460+
.childDirectory('src')
461+
.childDirectory('main')
462+
.childDirectory('java')
463+
.childDirectory('io')
464+
.childDirectory('flutter')
465+
.childDirectory('app')
466+
.childFile('FlutterMultiDexApplication.java')
467+
..createSync(recursive: true);
468+
flutterMultiDexApplication.writeAsStringSync('');
469+
470+
await migration.migrate();
471+
expect(bufferLogger.traceText, contains(MultidexRemovalMigration.deletionMessage));
472+
expect(flutterMultiDexApplication.existsSync(), false);
473+
});
474+
});
429475
});
430476
}
431477

0 commit comments

Comments
 (0)