diff --git a/packages/flutter_tools/gradle/aar_init_script.gradle b/packages/flutter_tools/gradle/aar_init_script.gradle index 2e9a341856..467d67d048 100644 --- a/packages/flutter_tools/gradle/aar_init_script.gradle +++ b/packages/flutter_tools/gradle/aar_init_script.gradle @@ -33,7 +33,7 @@ void configureProject(Project project, String outputDir) { project.android.libraryVariants.all { variant -> addAarTask(project, variant) } - + project.uploadArchives { repositories { mavenDeployer { diff --git a/packages/flutter_tools/lib/src/android/gradle.dart b/packages/flutter_tools/lib/src/android/gradle.dart index 44a1bf325b..054a3545d7 100644 --- a/packages/flutter_tools/lib/src/android/gradle.dart +++ b/packages/flutter_tools/lib/src/android/gradle.dart @@ -546,6 +546,19 @@ Future buildGradleAar({ command.add('-Plocal-engine-repo=${localEngineRepo.path}'); command.add('-Plocal-engine-build-mode=${androidBuildInfo.buildInfo.modeName}'); command.add('-Plocal-engine-out=${localEngineArtifacts.engineOutPath}'); + + // Copy the local engine repo in the output directory. + try { + fsUtils.copyDirectorySync( + localEngineRepo, + getRepoDirectory(outputDirectory), + ); + } on FileSystemException catch(_) { + throwToolExit( + 'Failed to copy the local engine ${localEngineRepo.path} repo ' + 'in ${outputDirectory.path}' + ); + } } command.add(aarTask); diff --git a/packages/flutter_tools/test/general.shard/android/gradle_test.dart b/packages/flutter_tools/test/general.shard/android/gradle_test.dart index cae730fc06..265267a8cd 100644 --- a/packages/flutter_tools/test/general.shard/android/gradle_test.dart +++ b/packages/flutter_tools/test/general.shard/android/gradle_test.dart @@ -1055,10 +1055,12 @@ plugin1=${plugin1.path} MockProcessManager mockProcessManager; FakePlatform android; FileSystem fileSystem; + FileSystemUtils fileSystemUtils; Cache cache; setUp(() { fileSystem = MemoryFileSystem(); + fileSystemUtils = MockFileSystemUtils(); mockAndroidSdk = MockAndroidSdk(); mockAndroidStudio = MockAndroidStudio(); mockArtifacts = MockLocalEngineArtifacts(); @@ -1773,6 +1775,12 @@ plugin1=${plugin1.path} ''' ); + fileSystem.directory('.android/gradle') + .createSync(recursive: true); + + fileSystem.directory('.android/gradle/wrapper') + .createSync(recursive: true); + fileSystem.file('.android/gradlew').createSync(recursive: true); fileSystem.file('.android/gradle.properties') @@ -1790,6 +1798,8 @@ plugin1=${plugin1.path} fileSystem.directory('build/outputs/repo').createSync(recursive: true); + when(fileSystemUtils.copyDirectorySync(any, any)).thenReturn(null); + await buildGradleAar( androidBuildInfo: const AndroidBuildInfo(BuildInfo(BuildMode.release, null)), project: FlutterProject.current(), @@ -1812,6 +1822,15 @@ plugin1=${plugin1.path} expect(actualGradlewCall, contains('-Plocal-engine-build-mode=release')); expect(actualGradlewCall, contains('-PbuildNumber=2.0')); + // Verify the local engine repo is copied into the generated Maven repo. + final List copyDirectoryArguments = verify( + fileSystemUtils.copyDirectorySync(captureAny, captureAny) + ).captured; + + expect(copyDirectoryArguments.length, 2); + expect((copyDirectoryArguments.first as Directory).path, '/.tmp_rand0/flutter_tool_local_engine_repo.rand0'); + expect((copyDirectoryArguments.last as Directory).path, 'build/outputs/repo'); + }, overrides: { AndroidSdk: () => mockAndroidSdk, AndroidStudio: () => mockAndroidStudio, @@ -1819,6 +1838,7 @@ plugin1=${plugin1.path} Cache: () => cache, Platform: () => android, FileSystem: () => fileSystem, + FileSystemUtils: () => fileSystemUtils, ProcessManager: () => mockProcessManager, }); }); @@ -2047,6 +2067,7 @@ class MockAndroidProject extends Mock implements AndroidProject {} class MockAndroidStudio extends Mock implements AndroidStudio {} class MockDirectory extends Mock implements Directory {} class MockFile extends Mock implements File {} +class MockFileSystemUtils extends Mock implements FileSystemUtils {} class MockFlutterProject extends Mock implements FlutterProject {} class MockLocalEngineArtifacts extends Mock implements LocalEngineArtifacts {} class MockProcessManager extends Mock implements ProcessManager {}