fix pom file not found when run app with local engine (#51468)
diff --git a/packages/flutter_tools/lib/src/android/gradle.dart b/packages/flutter_tools/lib/src/android/gradle.dart
index c988f4b..5482665 100644
--- a/packages/flutter_tools/lib/src/android/gradle.dart
+++ b/packages/flutter_tools/lib/src/android/gradle.dart
@@ -297,6 +297,13 @@
command.add('-Plocal-engine-repo=${localEngineRepo.path}');
command.add('-Plocal-engine-build-mode=${buildInfo.modeName}');
command.add('-Plocal-engine-out=${localEngineArtifacts.engineOutPath}');
+ command.add('-Ptarget-platform=${_getTargetPlatformByLocalEnginePath(
+ localEngineArtifacts.engineOutPath)}');
+ } else if (androidBuildInfo.targetArchs.isNotEmpty) {
+ final String targetPlatforms = androidBuildInfo
+ .targetArchs
+ .map(getPlatformNameForAndroidArch).join(',');
+ command.add('-Ptarget-platform=$targetPlatforms');
}
if (target != null) {
command.add('-Ptarget=$target');
@@ -322,12 +329,6 @@
if (androidBuildInfo.shrink) {
command.add('-Pshrink=true');
}
- if (androidBuildInfo.targetArchs.isNotEmpty) {
- final String targetPlatforms = androidBuildInfo
- .targetArchs
- .map(getPlatformNameForAndroidArch).join(',');
- command.add('-Ptarget-platform=$targetPlatforms');
- }
if (shouldBuildPluginAsAar) {
// Pass a system flag instead of a project flag, so this flag can be
// read from include_flutter.groovy.
@@ -537,11 +538,6 @@
command.add('-Ptarget=$target');
}
- if (androidBuildInfo.targetArchs.isNotEmpty) {
- final String targetPlatforms = androidBuildInfo.targetArchs
- .map(getPlatformNameForAndroidArch).join(',');
- command.add('-Ptarget-platform=$targetPlatforms');
- }
if (globals.artifacts is LocalEngineArtifacts) {
final LocalEngineArtifacts localEngineArtifacts = globals.artifacts as LocalEngineArtifacts;
final Directory localEngineRepo = _getLocalEngineRepo(
@@ -571,6 +567,12 @@
'in ${outputDirectory.path}'
);
}
+ command.add('-Ptarget-platform=${_getTargetPlatformByLocalEnginePath(
+ localEngineArtifacts.engineOutPath)}');
+ } else if (androidBuildInfo.targetArchs.isNotEmpty) {
+ final String targetPlatforms = androidBuildInfo.targetArchs
+ .map(getPlatformNameForAndroidArch).join(',');
+ command.add('-Ptarget-platform=$targetPlatforms');
}
command.add(aarTask);
@@ -928,7 +930,7 @@
assert(engineOutPath != null);
assert(androidBuildInfo != null);
- final String abi = getEnumName(androidBuildInfo.targetArchs.first);
+ final String abi = _getAbiByLocalEnginePath(engineOutPath);
final Directory localEngineRepo = globals.fs.systemTempDirectory
.createTempSync('flutter_tool_local_engine_repo.');
@@ -979,3 +981,27 @@
}
return localEngineRepo;
}
+
+String _getAbiByLocalEnginePath(String engineOutPath) {
+ String result = 'armeabi_v7a';
+ if (engineOutPath.contains('x86')) {
+ result = 'x86';
+ } else if (engineOutPath.contains('x64')) {
+ result = 'x86_64';
+ } else if (engineOutPath.contains('arm64')) {
+ result = 'arm64_v8a';
+ }
+ return result;
+}
+
+String _getTargetPlatformByLocalEnginePath(String engineOutPath) {
+ String result = 'android-arm';
+ if (engineOutPath.contains('x86')) {
+ result = 'android-x86';
+ } else if (engineOutPath.contains('x64')) {
+ result = 'android-x64';
+ } else if (engineOutPath.contains('arm64')) {
+ result = 'android-arm64';
+ }
+ return result;
+}
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 ff72d4f..bd14cb2 100644
--- a/packages/flutter_tools/test/general.shard/android/gradle_test.dart
+++ b/packages/flutter_tools/test/general.shard/android/gradle_test.dart
@@ -1662,7 +1662,7 @@
ProcessManager: () => mockProcessManager,
});
- testUsingContext('build apk uses selected local engine', () async {
+ testUsingContext('build apk uses selected local engine,the engine abi is arm', () async {
when(mockArtifacts.getArtifactPath(Artifact.flutterFramework,
platform: TargetPlatform.android_arm, mode: anyNamed('mode'))).thenReturn('engine');
when(mockArtifacts.engineOutPath).thenReturn(fileSystem.path.join('out', 'android_arm'));
@@ -1754,7 +1754,286 @@
ProcessManager: () => mockProcessManager,
});
- testUsingContext('build aar uses selected local engine', () async {
+ testUsingContext(
+ 'build apk uses selected local engine,the engine abi is arm64', () async {
+ when(mockArtifacts.getArtifactPath(Artifact.flutterFramework,
+ platform: anyNamed('platform'), mode: anyNamed('mode'))).thenReturn('engine');
+ when(mockArtifacts.engineOutPath).thenReturn(fileSystem.path.join('out', 'android_arm64'));
+
+ fileSystem.file('out/android_arm64/flutter_embedding_release.pom')
+ ..createSync(recursive: true)
+ ..writeAsStringSync('''
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <version>1.0.0-73fd6b049a80bcea2db1f26c7cee434907cd188b</version>
+ <dependencies>
+ </dependencies>
+</project>
+''');
+ fileSystem.file('out/android_arm64/arm64_v8a_release.pom').createSync(recursive: true);
+ fileSystem.file('out/android_arm64/arm64_v8a_release.jar').createSync(recursive: true);
+ fileSystem.file('out/android_arm64/flutter_embedding_release.jar').createSync(recursive: true);
+ fileSystem.file('out/android_arm64/flutter_embedding_release.pom').createSync(recursive: true);
+
+ fileSystem.file('android/gradlew').createSync(recursive: true);
+
+ fileSystem.directory('android')
+ .childFile('gradle.properties')
+ .createSync(recursive: true);
+
+ fileSystem.file('android/build.gradle')
+ .createSync(recursive: true);
+
+ fileSystem.directory('android')
+ .childDirectory('app')
+ .childFile('build.gradle')
+ ..createSync(recursive: true)
+ ..writeAsStringSync('apply from: irrelevant/flutter.gradle');
+
+ // Let any process start. Assert after.
+ when(mockProcessManager.run(
+ any,
+ environment: anyNamed('environment'),
+ workingDirectory: anyNamed('workingDirectory'),
+ )).thenAnswer((_) async => ProcessResult(1, 0, '', ''));
+
+ when(mockProcessManager.start(any,
+ workingDirectory: anyNamed('workingDirectory'),
+ environment: anyNamed('environment')))
+ .thenAnswer((_) {
+ return Future<Process>.value(
+ createMockProcess(
+ exitCode: 1,
+ )
+ );
+ });
+
+ await expectLater(() async {
+ await buildGradleApp(
+ project: FlutterProject.current(),
+ androidBuildInfo: const AndroidBuildInfo(
+ BuildInfo(
+ BuildMode.release,
+ null,
+ treeShakeIcons: false,
+ ),
+ ),
+ target: 'lib/main.dart',
+ isBuildingBundle: false,
+ localGradleErrors: const <GradleHandledError>[],
+ );
+ }, throwsToolExit());
+
+ final List<String> actualGradlewCall = verify(
+ mockProcessManager.start(
+ captureAny,
+ environment: anyNamed('environment'),
+ workingDirectory: anyNamed('workingDirectory')
+ ),
+ ).captured.last as List<String>;
+
+ expect(actualGradlewCall, contains('/android/gradlew'));
+ expect(actualGradlewCall, contains('-Plocal-engine-out=out/android_arm64'));
+ expect(actualGradlewCall, contains('-Plocal-engine-repo=/.tmp_rand0/flutter_tool_local_engine_repo.rand0'));
+ expect(actualGradlewCall, contains('-Plocal-engine-build-mode=release'));
+
+ }, overrides: <Type, Generator>{
+ AndroidSdk: () => mockAndroidSdk,
+ AndroidStudio: () => mockAndroidStudio,
+ Artifacts: () => mockArtifacts,
+ Cache: () => cache,
+ Platform: () => android,
+ FileSystem: () => fileSystem,
+ ProcessManager: () => mockProcessManager,
+ });
+
+ testUsingContext(
+ 'build apk uses selected local engine,the engine abi is x86', () async {
+ when(mockArtifacts.getArtifactPath(Artifact.flutterFramework,
+ platform: anyNamed('platform'), mode: anyNamed('mode'))).thenReturn('engine');
+ when(mockArtifacts.engineOutPath).thenReturn(fileSystem.path.join('out', 'android_x86'));
+
+ fileSystem.file('out/android_x86/flutter_embedding_release.pom')
+ ..createSync(recursive: true)
+ ..writeAsStringSync('''
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <version>1.0.0-73fd6b049a80bcea2db1f26c7cee434907cd188b</version>
+ <dependencies>
+ </dependencies>
+</project>
+''');
+ fileSystem.file('out/android_x86/x86_release.pom').createSync(recursive: true);
+ fileSystem.file('out/android_x86/x86_release.jar').createSync(recursive: true);
+ fileSystem.file('out/android_x86/flutter_embedding_release.jar').createSync(recursive: true);
+ fileSystem.file('out/android_x86/flutter_embedding_release.pom').createSync(recursive: true);
+
+ fileSystem.file('android/gradlew').createSync(recursive: true);
+
+ fileSystem.directory('android')
+ .childFile('gradle.properties')
+ .createSync(recursive: true);
+
+ fileSystem.file('android/build.gradle')
+ .createSync(recursive: true);
+
+ fileSystem.directory('android')
+ .childDirectory('app')
+ .childFile('build.gradle')
+ ..createSync(recursive: true)
+ ..writeAsStringSync('apply from: irrelevant/flutter.gradle');
+
+ // Let any process start. Assert after.
+ when(mockProcessManager.run(
+ any,
+ environment: anyNamed('environment'),
+ workingDirectory: anyNamed('workingDirectory'),
+ )).thenAnswer((_) async => ProcessResult(1, 0, '', ''));
+
+ when(mockProcessManager.start(any,
+ workingDirectory: anyNamed('workingDirectory'),
+ environment: anyNamed('environment')))
+ .thenAnswer((_) {
+ return Future<Process>.value(
+ createMockProcess(
+ exitCode: 1,
+ )
+ );
+ });
+
+ await expectLater(() async {
+ await buildGradleApp(
+ project: FlutterProject.current(),
+ androidBuildInfo: const AndroidBuildInfo(
+ BuildInfo(
+ BuildMode.release,
+ null,
+ treeShakeIcons: false,
+ ),
+ ),
+ target: 'lib/main.dart',
+ isBuildingBundle: false,
+ localGradleErrors: const <GradleHandledError>[],
+ );
+ }, throwsToolExit());
+
+ final List<String> actualGradlewCall = verify(
+ mockProcessManager.start(
+ captureAny,
+ environment: anyNamed('environment'),
+ workingDirectory: anyNamed('workingDirectory')
+ ),
+ ).captured.last as List<String>;
+
+ expect(actualGradlewCall, contains('/android/gradlew'));
+ expect(actualGradlewCall, contains('-Plocal-engine-out=out/android_x86'));
+ expect(actualGradlewCall, contains('-Plocal-engine-repo=/.tmp_rand0/flutter_tool_local_engine_repo.rand0'));
+ expect(actualGradlewCall, contains('-Plocal-engine-build-mode=release'));
+
+ }, overrides: <Type, Generator>{
+ AndroidSdk: () => mockAndroidSdk,
+ AndroidStudio: () => mockAndroidStudio,
+ Artifacts: () => mockArtifacts,
+ Cache: () => cache,
+ Platform: () => android,
+ FileSystem: () => fileSystem,
+ ProcessManager: () => mockProcessManager,
+ });
+
+ testUsingContext(
+ 'build apk uses selected local engine,the engine abi is x64', () async {
+ when(mockArtifacts.getArtifactPath(Artifact.flutterFramework,
+ platform: anyNamed('platform'), mode: anyNamed('mode'))).thenReturn('engine');
+ when(mockArtifacts.engineOutPath).thenReturn(fileSystem.path.join('out', 'android_x64'));
+
+ fileSystem.file('out/android_x64/flutter_embedding_release.pom')
+ ..createSync(recursive: true)
+ ..writeAsStringSync('''
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <version>1.0.0-73fd6b049a80bcea2db1f26c7cee434907cd188b</version>
+ <dependencies>
+ </dependencies>
+</project>
+''');
+ fileSystem.file('out/android_x64/x86_64_release.pom').createSync(recursive: true);
+ fileSystem.file('out/android_x64/x86_64_release.jar').createSync(recursive: true);
+ fileSystem.file('out/android_x64/flutter_embedding_release.jar').createSync(recursive: true);
+ fileSystem.file('out/android_x64/flutter_embedding_release.pom').createSync(recursive: true);
+
+ fileSystem.file('android/gradlew').createSync(recursive: true);
+
+ fileSystem.directory('android')
+ .childFile('gradle.properties')
+ .createSync(recursive: true);
+
+ fileSystem.file('android/build.gradle')
+ .createSync(recursive: true);
+
+ fileSystem.directory('android')
+ .childDirectory('app')
+ .childFile('build.gradle')
+ ..createSync(recursive: true)
+ ..writeAsStringSync('apply from: irrelevant/flutter.gradle');
+
+ // Let any process start. Assert after.
+ when(mockProcessManager.run(
+ any,
+ environment: anyNamed('environment'),
+ workingDirectory: anyNamed('workingDirectory'),
+ )).thenAnswer((_) async => ProcessResult(1, 0, '', ''));
+
+ when(mockProcessManager.start(any,
+ workingDirectory: anyNamed('workingDirectory'),
+ environment: anyNamed('environment')))
+ .thenAnswer((_) {
+ return Future<Process>.value(
+ createMockProcess(
+ exitCode: 1,
+ )
+ );
+ });
+
+ await expectLater(() async {
+ await buildGradleApp(
+ project: FlutterProject.current(),
+ androidBuildInfo: const AndroidBuildInfo(
+ BuildInfo(
+ BuildMode.release,
+ null,
+ treeShakeIcons: false,
+ ),
+ ),
+ target: 'lib/main.dart',
+ isBuildingBundle: false,
+ localGradleErrors: const <GradleHandledError>[],
+ );
+ }, throwsToolExit());
+
+ final List<String> actualGradlewCall = verify(
+ mockProcessManager.start(
+ captureAny,
+ environment: anyNamed('environment'),
+ workingDirectory: anyNamed('workingDirectory')
+ ),
+ ).captured.last as List<String>;
+
+ expect(actualGradlewCall, contains('/android/gradlew'));
+ expect(actualGradlewCall, contains('-Plocal-engine-out=out/android_x64'));
+ expect(actualGradlewCall, contains('-Plocal-engine-repo=/.tmp_rand0/flutter_tool_local_engine_repo.rand0'));
+ expect(actualGradlewCall, contains('-Plocal-engine-build-mode=release'));
+
+ }, overrides: <Type, Generator>{
+ AndroidSdk: () => mockAndroidSdk,
+ AndroidStudio: () => mockAndroidStudio,
+ Artifacts: () => mockArtifacts,
+ Cache: () => cache,
+ Platform: () => android,
+ FileSystem: () => fileSystem,
+ ProcessManager: () => mockProcessManager,
+ });
+
+ testUsingContext('build aar uses selected local engine,the engine abi is arm', () async {
when(mockArtifacts.getArtifactPath(Artifact.flutterFramework,
platform: TargetPlatform.android_arm, mode: anyNamed('mode'))).thenReturn('engine');
when(mockArtifacts.engineOutPath).thenReturn(fileSystem.path.join('out', 'android_arm'));
@@ -1849,6 +2128,300 @@
FileSystemUtils: () => fileSystemUtils,
ProcessManager: () => mockProcessManager,
});
+
+ testUsingContext(
+ 'build aar uses selected local engine,the engine abi is arm64', () async {
+ when(mockArtifacts.getArtifactPath(Artifact.flutterFramework,
+ platform: anyNamed('platform'), mode: anyNamed('mode'))).thenReturn('engine');
+ when(mockArtifacts.engineOutPath).thenReturn(fileSystem.path.join('out', 'android_arm64'));
+
+ fileSystem.file('out/android_arm64/flutter_embedding_release.pom')
+ ..createSync(recursive: true)
+ ..writeAsStringSync('''
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <version>1.0.0-73fd6b049a80bcea2db1f26c7cee434907cd188b</version>
+ <dependencies>
+ </dependencies>
+</project>
+''');
+ fileSystem.file('out/android_arm64/arm64_v8a_release.pom').createSync(recursive: true);
+ fileSystem.file('out/android_arm64/arm64_v8a_release.jar').createSync(recursive: true);
+ fileSystem.file('out/android_arm64/flutter_embedding_release.jar').createSync(recursive: true);
+ fileSystem.file('out/android_arm64/flutter_embedding_release.pom').createSync(recursive: true);
+
+ final File manifestFile = fileSystem.file('pubspec.yaml');
+ manifestFile.createSync(recursive: true);
+ manifestFile.writeAsStringSync('''
+ flutter:
+ module:
+ androidPackage: com.example.test
+ '''
+ );
+
+ 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')
+ .writeAsStringSync('irrelevant');
+
+ fileSystem.file('.android/build.gradle')
+ .createSync(recursive: true);
+
+ // Let any process start. Assert after.
+ when(mockProcessManager.run(
+ any,
+ environment: anyNamed('environment'),
+ workingDirectory: anyNamed('workingDirectory'),
+ )).thenAnswer((_) async => ProcessResult(1, 0, '', ''));
+
+ fileSystem.directory('build/outputs/repo').createSync(recursive: true);
+
+ when(fileSystemUtils.copyDirectorySync(any, any)).thenReturn(null);
+
+ await buildGradleAar(
+ androidBuildInfo: const AndroidBuildInfo(
+ BuildInfo(BuildMode.release, null, treeShakeIcons: false)),
+ project: FlutterProject.current(),
+ outputDirectory: fileSystem.directory('build/'),
+ target: '',
+ buildNumber: '2.0',
+ );
+
+ final List<String> actualGradlewCall = verify(
+ mockProcessManager.run(
+ captureAny,
+ environment: anyNamed('environment'),
+ workingDirectory: anyNamed('workingDirectory'),
+ ),
+ ).captured.last as List<String>;
+
+ expect(actualGradlewCall, contains('/.android/gradlew'));
+ expect(actualGradlewCall, contains('-Plocal-engine-out=out/android_arm64'));
+ expect(actualGradlewCall, contains('-Plocal-engine-repo=/.tmp_rand0/flutter_tool_local_engine_repo.rand0'));
+ 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<dynamic> 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: <Type, Generator>{
+ AndroidSdk: () => mockAndroidSdk,
+ AndroidStudio: () => mockAndroidStudio,
+ Artifacts: () => mockArtifacts,
+ Cache: () => cache,
+ Platform: () => android,
+ FileSystem: () => fileSystem,
+ FileSystemUtils: () => fileSystemUtils,
+ ProcessManager: () => mockProcessManager,
+ });
+
+ testUsingContext(
+ 'build aar uses selected local engine,the engine abi is x86', () async {
+ when(mockArtifacts.getArtifactPath(Artifact.flutterFramework,
+ platform: anyNamed('platform'), mode: anyNamed('mode'))).thenReturn('engine');
+ when(mockArtifacts.engineOutPath).thenReturn(fileSystem.path.join('out', 'android_x86'));
+
+ fileSystem.file('out/android_x86/flutter_embedding_release.pom')
+ ..createSync(recursive: true)
+ ..writeAsStringSync('''
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <version>1.0.0-73fd6b049a80bcea2db1f26c7cee434907cd188b</version>
+ <dependencies>
+ </dependencies>
+</project>
+''');
+ fileSystem.file('out/android_x86/x86_release.pom').createSync(recursive: true);
+ fileSystem.file('out/android_x86/x86_release.jar').createSync(recursive: true);
+ fileSystem.file('out/android_x86/flutter_embedding_release.jar').createSync(recursive: true);
+ fileSystem.file('out/android_x86/flutter_embedding_release.pom').createSync(recursive: true);
+
+ final File manifestFile = fileSystem.file('pubspec.yaml');
+ manifestFile.createSync(recursive: true);
+ manifestFile.writeAsStringSync('''
+ flutter:
+ module:
+ androidPackage: com.example.test
+ '''
+ );
+
+ 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')
+ .writeAsStringSync('irrelevant');
+
+ fileSystem.file('.android/build.gradle')
+ .createSync(recursive: true);
+
+ // Let any process start. Assert after.
+ when(mockProcessManager.run(
+ any,
+ environment: anyNamed('environment'),
+ workingDirectory: anyNamed('workingDirectory'),
+ )).thenAnswer((_) async => ProcessResult(1, 0, '', ''));
+
+ fileSystem.directory('build/outputs/repo').createSync(recursive: true);
+
+ when(fileSystemUtils.copyDirectorySync(any, any)).thenReturn(null);
+
+ await buildGradleAar(
+ androidBuildInfo: const AndroidBuildInfo(
+ BuildInfo(BuildMode.release, null, treeShakeIcons: false)),
+ project: FlutterProject.current(),
+ outputDirectory: fileSystem.directory('build/'),
+ target: '',
+ buildNumber: '2.0',
+ );
+
+ final List<String> actualGradlewCall = verify(
+ mockProcessManager.run(
+ captureAny,
+ environment: anyNamed('environment'),
+ workingDirectory: anyNamed('workingDirectory'),
+ ),
+ ).captured.last as List<String>;
+
+ expect(actualGradlewCall, contains('/.android/gradlew'));
+ expect(actualGradlewCall, contains('-Plocal-engine-out=out/android_x86'));
+ expect(actualGradlewCall, contains('-Plocal-engine-repo=/.tmp_rand0/flutter_tool_local_engine_repo.rand0'));
+ 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<dynamic> 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: <Type, Generator>{
+ AndroidSdk: () => mockAndroidSdk,
+ AndroidStudio: () => mockAndroidStudio,
+ Artifacts: () => mockArtifacts,
+ Cache: () => cache,
+ Platform: () => android,
+ FileSystem: () => fileSystem,
+ FileSystemUtils: () => fileSystemUtils,
+ ProcessManager: () => mockProcessManager,
+ });
+
+ testUsingContext(
+ 'build aar uses selected local engine,the engine abi is x64', () async {
+ when(mockArtifacts.getArtifactPath(Artifact.flutterFramework,
+ platform: anyNamed('platform'), mode: anyNamed('mode'))).thenReturn('engine');
+ when(mockArtifacts.engineOutPath).thenReturn(fileSystem.path.join('out', 'android_x64'));
+
+ fileSystem.file('out/android_x64/flutter_embedding_release.pom')
+ ..createSync(recursive: true)
+ ..writeAsStringSync('''
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <version>1.0.0-73fd6b049a80bcea2db1f26c7cee434907cd188b</version>
+ <dependencies>
+ </dependencies>
+</project>
+''');
+ fileSystem.file('out/android_x64/x86_64_release.pom').createSync(recursive: true);
+ fileSystem.file('out/android_x64/x86_64_release.jar').createSync(recursive: true);
+ fileSystem.file('out/android_x64/flutter_embedding_release.jar').createSync(recursive: true);
+ fileSystem.file('out/android_x64/flutter_embedding_release.pom').createSync(recursive: true);
+
+ final File manifestFile = fileSystem.file('pubspec.yaml');
+ manifestFile.createSync(recursive: true);
+ manifestFile.writeAsStringSync('''
+ flutter:
+ module:
+ androidPackage: com.example.test
+ '''
+ );
+
+ 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')
+ .writeAsStringSync('irrelevant');
+
+ fileSystem.file('.android/build.gradle')
+ .createSync(recursive: true);
+
+ // Let any process start. Assert after.
+ when(mockProcessManager.run(
+ any,
+ environment: anyNamed('environment'),
+ workingDirectory: anyNamed('workingDirectory'),
+ )).thenAnswer((_) async => ProcessResult(1, 0, '', ''));
+
+ fileSystem.directory('build/outputs/repo').createSync(recursive: true);
+
+ when(fileSystemUtils.copyDirectorySync(any, any)).thenReturn(null);
+
+ await buildGradleAar(
+ androidBuildInfo: const AndroidBuildInfo(
+ BuildInfo(BuildMode.release, null, treeShakeIcons: false)),
+ project: FlutterProject.current(),
+ outputDirectory: fileSystem.directory('build/'),
+ target: '',
+ buildNumber: '2.0',
+ );
+
+ final List<String> actualGradlewCall = verify(
+ mockProcessManager.run(
+ captureAny,
+ environment: anyNamed('environment'),
+ workingDirectory: anyNamed('workingDirectory'),
+ ),
+ ).captured.last as List<String>;
+
+ expect(actualGradlewCall, contains('/.android/gradlew'));
+ expect(actualGradlewCall, contains('-Plocal-engine-out=out/android_x64'));
+ expect(actualGradlewCall, contains('-Plocal-engine-repo=/.tmp_rand0/flutter_tool_local_engine_repo.rand0'));
+ 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<dynamic> 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: <Type, Generator>{
+ AndroidSdk: () => mockAndroidSdk,
+ AndroidStudio: () => mockAndroidStudio,
+ Artifacts: () => mockArtifacts,
+ Cache: () => cache,
+ Platform: () => android,
+ FileSystem: () => fileSystem,
+ FileSystemUtils: () => fileSystemUtils,
+ ProcessManager: () => mockProcessManager,
+ });
});
group('printHowToConsumeAar', () {
diff --git a/packages/flutter_tools/test/general.shard/commands/build_apk_test.dart b/packages/flutter_tools/test/general.shard/commands/build_apk_test.dart
index fab0c2b..5619155 100644
--- a/packages/flutter_tools/test/general.shard/commands/build_apk_test.dart
+++ b/packages/flutter_tools/test/general.shard/commands/build_apk_test.dart
@@ -214,10 +214,10 @@
<String>[
gradlew,
'-q',
+ '-Ptarget-platform=android-arm,android-arm64,android-x64',
'-Ptarget=${globals.fs.path.join(tempDir.path, 'flutter_project', 'lib', 'main.dart')}',
'-Ptrack-widget-creation=true',
'-Pshrink=true',
- '-Ptarget-platform=android-arm,android-arm64,android-x64',
'assembleRelease',
],
workingDirectory: anyNamed('workingDirectory'),
@@ -242,10 +242,10 @@
<String>[
gradlew,
'-q',
+ '-Ptarget-platform=android-arm,android-arm64,android-x64',
'-Ptarget=${globals.fs.path.join(tempDir.path, 'flutter_project', 'lib', 'main.dart')}',
'-Ptrack-widget-creation=true',
'-Pshrink=true',
- '-Ptarget-platform=android-arm,android-arm64,android-x64',
'-Psplit-debug-info=${tempDir.path}',
'assembleRelease',
],
@@ -274,9 +274,9 @@
<String>[
gradlew,
'-q',
+ '-Ptarget-platform=android-arm,android-arm64,android-x64',
'-Ptarget=${globals.fs.path.join(tempDir.path, 'flutter_project', 'lib', 'main.dart')}',
'-Ptrack-widget-creation=true',
- '-Ptarget-platform=android-arm,android-arm64,android-x64',
'assembleRelease',
],
workingDirectory: anyNamed('workingDirectory'),
@@ -297,10 +297,10 @@
<String>[
gradlew,
'-q',
+ '-Ptarget-platform=android-arm,android-arm64,android-x64',
'-Ptarget=${globals.fs.path.join(tempDir.path, 'flutter_project', 'lib', 'main.dart')}',
'-Ptrack-widget-creation=true',
'-Pshrink=true',
- '-Ptarget-platform=android-arm,android-arm64,android-x64',
'assembleRelease',
],
workingDirectory: anyNamed('workingDirectory'),
@@ -352,10 +352,10 @@
<String>[
gradlew,
'-q',
+ '-Ptarget-platform=android-arm,android-arm64,android-x64',
'-Ptarget=${globals.fs.path.join(tempDir.path, 'flutter_project', 'lib', 'main.dart')}',
'-Ptrack-widget-creation=true',
'-Pshrink=true',
- '-Ptarget-platform=android-arm,android-arm64,android-x64',
'assembleRelease',
],
workingDirectory: anyNamed('workingDirectory'),
@@ -403,10 +403,10 @@
<String>[
gradlew,
'-q',
+ '-Ptarget-platform=android-arm,android-arm64,android-x64',
'-Ptarget=${globals.fs.path.join(tempDir.path, 'flutter_project', 'lib', 'main.dart')}',
'-Ptrack-widget-creation=true',
'-Pshrink=true',
- '-Ptarget-platform=android-arm,android-arm64,android-x64',
'assembleRelease',
],
workingDirectory: anyNamed('workingDirectory'),
diff --git a/packages/flutter_tools/test/general.shard/commands/build_appbundle_test.dart b/packages/flutter_tools/test/general.shard/commands/build_appbundle_test.dart
index 1dec6a0..1fc1a70 100644
--- a/packages/flutter_tools/test/general.shard/commands/build_appbundle_test.dart
+++ b/packages/flutter_tools/test/general.shard/commands/build_appbundle_test.dart
@@ -200,10 +200,10 @@
<String>[
gradlew,
'-q',
+ '-Ptarget-platform=android-arm,android-arm64,android-x64',
'-Ptarget=${globals.fs.path.join(tempDir.path, 'flutter_project', 'lib', 'main.dart')}',
'-Ptrack-widget-creation=false',
'-Pshrink=true',
- '-Ptarget-platform=android-arm,android-arm64,android-x64',
'bundleRelease',
],
workingDirectory: anyNamed('workingDirectory'),
@@ -233,9 +233,9 @@
<String>[
gradlew,
'-q',
+ '-Ptarget-platform=android-arm,android-arm64,android-x64',
'-Ptarget=${globals.fs.path.join(tempDir.path, 'flutter_project', 'lib', 'main.dart')}',
'-Ptrack-widget-creation=false',
- '-Ptarget-platform=android-arm,android-arm64,android-x64',
'bundleRelease',
],
workingDirectory: anyNamed('workingDirectory'),
@@ -256,10 +256,10 @@
<String>[
gradlew,
'-q',
+ '-Ptarget-platform=android-arm,android-arm64,android-x64',
'-Ptarget=${globals.fs.path.join(tempDir.path, 'flutter_project', 'lib', 'main.dart')}',
'-Ptrack-widget-creation=false',
'-Pshrink=true',
- '-Ptarget-platform=android-arm,android-arm64,android-x64',
'bundleRelease',
],
workingDirectory: anyNamed('workingDirectory'),
@@ -311,10 +311,10 @@
<String>[
gradlew,
'-q',
+ '-Ptarget-platform=android-arm,android-arm64,android-x64',
'-Ptarget=${globals.fs.path.join(tempDir.path, 'flutter_project', 'lib', 'main.dart')}',
'-Ptrack-widget-creation=false',
'-Pshrink=true',
- '-Ptarget-platform=android-arm,android-arm64,android-x64',
'assembleRelease',
],
workingDirectory: anyNamed('workingDirectory'),
@@ -362,10 +362,10 @@
<String>[
gradlew,
'-q',
+ '-Ptarget-platform=android-arm,android-arm64,android-x64',
'-Ptarget=${globals.fs.path.join(tempDir.path, 'flutter_project', 'lib', 'main.dart')}',
'-Ptrack-widget-creation=false',
'-Pshrink=true',
- '-Ptarget-platform=android-arm,android-arm64,android-x64',
'assembleRelease',
],
workingDirectory: anyNamed('workingDirectory'),