diff --git a/packages/flutter_tools/lib/src/android/gradle.dart b/packages/flutter_tools/lib/src/android/gradle.dart index e0c644fd0c..c3baf95b8b 100644 --- a/packages/flutter_tools/lib/src/android/gradle.dart +++ b/packages/flutter_tools/lib/src/android/gradle.dart @@ -698,14 +698,15 @@ class AndroidGradleBuilder implements AndroidBuilder { return false; } - // As long as libflutter.so.sym is present for at least one architecture, + // As long as libflutter.so.sym or libflutter.so.dbg is present for at least one architecture, // assume AGP succeeded in stripping. - if (result.stdout.contains('libflutter.so.sym')) { + if (result.stdout.contains('libflutter.so.sym') || + result.stdout.contains('libflutter.so.dbg')) { return true; } _logger.printTrace( - 'libflutter.so.sym not present when checking final appbundle for debug symbols.', + 'libflutter.so.sym or libflutter.so.dbg not present when checking final appbundle for debug symbols.', ); return false; } diff --git a/packages/flutter_tools/test/general.shard/android/android_gradle_builder_test.dart b/packages/flutter_tools/test/general.shard/android/android_gradle_builder_test.dart index e20c3d6e06..996fe8372c 100644 --- a/packages/flutter_tools/test/general.shard/android/android_gradle_builder_test.dart +++ b/packages/flutter_tools/test/general.shard/android/android_gradle_builder_test.dart @@ -851,6 +851,16 @@ void main() { /BUNDLE-METADATA/com.android.tools.build.debugsymbols/ /BUNDLE-METADATA/com.android.tools.build.debugsymbols/arm64-v8a/ /BUNDLE-METADATA/com.android.tools.build.debugsymbols/arm64-v8a/libflutter.so.sym +'''; + + // Output from `/tools/bin/apkanalyzer files list ` + // on an aab containing the debug info and symbol tables. + const String apkanalyzerOutputWithDebugInfoAndSymFiles = + apkanalyzerOutputWithoutSymFiles + + r''' +/BUNDLE-METADATA/com.android.tools.build.debugsymbols/ +/BUNDLE-METADATA/com.android.tools.build.debugsymbols/arm64-v8a/ +/BUNDLE-METADATA/com.android.tools.build.debugsymbols/arm64-v8a/libflutter.so.dbg '''; void createSharedGradleFiles() { @@ -942,6 +952,71 @@ void main() { overrides: {AndroidStudio: () => FakeAndroidStudio()}, ); + testUsingContext( + 'build succeeds when debug info and symbol tables present for at least one architecture', + () async { + final AndroidGradleBuilder builder = AndroidGradleBuilder( + java: FakeJava(), + logger: logger, + processManager: processManager, + fileSystem: fileSystem, + artifacts: Artifacts.test(), + analytics: fakeAnalytics, + gradleUtils: FakeGradleUtils(), + platform: FakePlatform(environment: {'HOME': '/home'}), + androidStudio: FakeAndroidStudio(), + ); + processManager.addCommand( + FakeCommand(command: List.of(commonCommandPortion)..add('bundleRelease')), + ); + + createSharedGradleFiles(); + final File aabFile = createAabFile(BuildMode.release); + final AndroidSdk sdk = AndroidSdk.locateAndroidSdk()!; + + processManager.addCommand( + FakeCommand( + command: [ + sdk.getCmdlineToolsPath(apkAnalyzerBinaryName)!, + 'files', + 'list', + aabFile.path, + ], + stdout: apkanalyzerOutputWithDebugInfoAndSymFiles, + ), + ); + + final FlutterProject project = FlutterProject.fromDirectoryTest( + fileSystem.currentDirectory, + ); + project.android.appManifestFile + ..createSync(recursive: true) + ..writeAsStringSync(minimalV2EmbeddingManifest); + + await builder.buildGradleApp( + project: project, + androidBuildInfo: const AndroidBuildInfo( + BuildInfo( + BuildMode.release, + null, + treeShakeIcons: false, + packageConfigPath: '.dart_tool/package_config.json', + ), + targetArchs: [ + AndroidArch.arm64_v8a, + AndroidArch.armeabi_v7a, + AndroidArch.x86_64, + ], + ), + target: 'lib/main.dart', + isBuildingBundle: true, + configOnly: false, + localGradleErrors: [], + ); + }, + overrides: {AndroidStudio: () => FakeAndroidStudio()}, + ); + testUsingContext( 'building a debug aab does not invoke apkanalyzer', () async {