Fix NPE in flutter tools (#34725)
diff --git a/packages/flutter_tools/lib/src/android/gradle.dart b/packages/flutter_tools/lib/src/android/gradle.dart
index 78f8307..564cd08 100644
--- a/packages/flutter_tools/lib/src/android/gradle.dart
+++ b/packages/flutter_tools/lib/src/android/gradle.dart
@@ -509,7 +509,7 @@
flutterUsage.sendTiming('build', 'gradle-v2', Duration(milliseconds: sw.elapsedMilliseconds));
if (!isBuildingBundle) {
- final Iterable<File> apkFiles = _findApkFiles(project, androidBuildInfo);
+ final Iterable<File> apkFiles = findApkFiles(project, androidBuildInfo);
if (apkFiles.isEmpty)
throwToolExit('Gradle build failed to produce an Android package.');
// Copy the first APK to app.apk, so `flutter run`, `flutter install`, etc. can find it.
@@ -546,22 +546,23 @@
}
}
-Iterable<File> _findApkFiles(GradleProject project, AndroidBuildInfo androidBuildInfo) {
+@visibleForTesting
+Iterable<File> findApkFiles(GradleProject project, AndroidBuildInfo androidBuildInfo) {
final Iterable<String> apkFileNames = project.apkFilesFor(androidBuildInfo);
if (apkFileNames.isEmpty)
return const <File>[];
- return apkFileNames.map<File>((String apkFileName) {
+ return apkFileNames.expand<File>((String apkFileName) {
File apkFile = project.apkDirectory.childFile(apkFileName);
if (apkFile.existsSync())
- return apkFile;
+ return <File>[apkFile];
final BuildInfo buildInfo = androidBuildInfo.buildInfo;
final String modeName = camelCase(buildInfo.modeName);
apkFile = project.apkDirectory
.childDirectory(modeName)
.childFile(apkFileName);
if (apkFile.existsSync())
- return apkFile;
+ return <File>[apkFile];
if (buildInfo.flavor != null) {
// Android Studio Gradle plugin v3 adds flavor to path.
apkFile = project.apkDirectory
@@ -569,9 +570,9 @@
.childDirectory(modeName)
.childFile(apkFileName);
if (apkFile.existsSync())
- return apkFile;
+ return <File>[apkFile];
}
- return null;
+ return const <File>[];
});
}
diff --git a/packages/flutter_tools/test/android/gradle_test.dart b/packages/flutter_tools/test/android/gradle_test.dart
index 7aafd64..36e6146 100644
--- a/packages/flutter_tools/test/android/gradle_test.dart
+++ b/packages/flutter_tools/test/android/gradle_test.dart
@@ -41,6 +41,18 @@
expect(shouldBeToolExit, isToolExit);
});
+ // Regression test for https://github.com/flutter/flutter/issues/34700
+ testUsingContext('Does not return nulls in apk list', () {
+ final GradleProject gradleProject = MockGradleProject();
+ const AndroidBuildInfo buildInfo = AndroidBuildInfo(BuildInfo.debug);
+ when(gradleProject.apkFilesFor(buildInfo)).thenReturn(<String>['not_real']);
+ when(gradleProject.apkDirectory).thenReturn(fs.currentDirectory);
+
+ expect(findApkFiles(gradleProject, buildInfo), <File>[]);
+ }, overrides: <Type, Generator>{
+ FileSystem: () => MemoryFileSystem(),
+ });
+
test('androidXFailureRegex should match lines with likely AndroidX errors', () {
final List<String> nonMatchingLines = <String>[
':app:preBuild UP-TO-DATE',
@@ -537,3 +549,4 @@
class MockLocalEngineArtifacts extends Mock implements LocalEngineArtifacts {}
class MockProcessManager extends Mock implements ProcessManager {}
class MockXcodeProjectInterpreter extends Mock implements XcodeProjectInterpreter {}
+class MockGradleProject extends Mock implements GradleProject {}