diff --git a/dev/devicelab/bin/tasks/gradle_plugin_bundle_test.dart b/dev/devicelab/bin/tasks/gradle_plugin_bundle_test.dart index 459711bfc8a..5a5b3c595a4 100644 --- a/dev/devicelab/bin/tasks/gradle_plugin_bundle_test.dart +++ b/dev/devicelab/bin/tasks/gradle_plugin_bundle_test.dart @@ -39,6 +39,8 @@ Future main() async { 'base/lib/arm64-v8a/libflutter.so', 'base/lib/armeabi-v7a/libapp.so', 'base/lib/armeabi-v7a/libflutter.so', + 'BUNDLE-METADATA/com.android.tools.build.debugsymbols/arm64-v8a/libapp.so.sym', + 'BUNDLE-METADATA/com.android.tools.build.debugsymbols/armeabi-v7a/libapp.so.sym', 'BUNDLE-METADATA/com.android.tools.build.debugsymbols/arm64-v8a/libflutter.so.sym', 'BUNDLE-METADATA/com.android.tools.build.debugsymbols/armeabi-v7a/libflutter.so.sym', ], await getFilesInAppBundle(releaseBundle)); @@ -74,6 +76,8 @@ Future main() async { 'base/lib/arm64-v8a/libflutter.so', 'base/lib/armeabi-v7a/libapp.so', 'base/lib/armeabi-v7a/libflutter.so', + 'BUNDLE-METADATA/com.android.tools.build.debugsymbols/arm64-v8a/libapp.so.sym', + 'BUNDLE-METADATA/com.android.tools.build.debugsymbols/armeabi-v7a/libapp.so.sym', 'BUNDLE-METADATA/com.android.tools.build.debugsymbols/arm64-v8a/libflutter.so.sym', 'BUNDLE-METADATA/com.android.tools.build.debugsymbols/armeabi-v7a/libflutter.so.sym', ], await getFilesInAppBundle(bundleFromGradlePath)); @@ -104,6 +108,8 @@ Future main() async { 'base/lib/arm64-v8a/libflutter.so', 'base/lib/armeabi-v7a/libapp.so', 'base/lib/armeabi-v7a/libflutter.so', + 'BUNDLE-METADATA/com.android.tools.build.debugsymbols/arm64-v8a/libapp.so.sym', + 'BUNDLE-METADATA/com.android.tools.build.debugsymbols/armeabi-v7a/libapp.so.sym', 'BUNDLE-METADATA/com.android.tools.build.debugsymbols/arm64-v8a/libflutter.so.sym', 'BUNDLE-METADATA/com.android.tools.build.debugsymbols/armeabi-v7a/libflutter.so.sym', ], await getFilesInAppBundle(flavorUnderscoreBundlePath)); @@ -134,6 +140,8 @@ Future main() async { 'base/lib/arm64-v8a/libflutter.so', 'base/lib/armeabi-v7a/libapp.so', 'base/lib/armeabi-v7a/libflutter.so', + 'BUNDLE-METADATA/com.android.tools.build.debugsymbols/arm64-v8a/libapp.so.sym', + 'BUNDLE-METADATA/com.android.tools.build.debugsymbols/armeabi-v7a/libapp.so.sym', 'BUNDLE-METADATA/com.android.tools.build.debugsymbols/arm64-v8a/libflutter.so.sym', 'BUNDLE-METADATA/com.android.tools.build.debugsymbols/armeabi-v7a/libflutter.so.sym', ], await getFilesInAppBundle(productionBundlePath)); diff --git a/packages/flutter_tools/gradle/src/main/kotlin/FlutterPlugin.kt b/packages/flutter_tools/gradle/src/main/kotlin/FlutterPlugin.kt index 9dc036df7b1..61026c0dbd1 100644 --- a/packages/flutter_tools/gradle/src/main/kotlin/FlutterPlugin.kt +++ b/packages/flutter_tools/gradle/src/main/kotlin/FlutterPlugin.kt @@ -21,8 +21,8 @@ import org.gradle.api.Task import org.gradle.api.UnknownTaskException import org.gradle.api.file.Directory import org.gradle.api.tasks.Copy +import org.gradle.api.tasks.Sync import org.gradle.api.tasks.TaskProvider -import org.gradle.api.tasks.bundling.Jar import org.gradle.internal.os.OperatingSystem import org.gradle.kotlin.dsl.support.serviceOf import org.gradle.process.ExecOperations @@ -361,6 +361,16 @@ class FlutterPlugin : Plugin { val targetPlatforms: List = FlutterPluginUtils.getTargetPlatforms(projectToAddTasksTo) + val androidExtension = FlutterPluginUtils.getAndroidExtension(projectToAddTasksTo) + androidExtension.sourceSets.all { + val sourceSet = this + val jniLibsDir = + projectToAddTasksTo.layout.buildDirectory.dir( + "${FlutterPluginConstants.INTERMEDIATES_DIR}/flutter/${sourceSet.name}/jniLibs" + ) + sourceSet.jniLibs.srcDir(jniLibsDir.get().asFile) + } + val flutterPlugin = this if (FlutterPluginUtils.isFlutterAppProject(projectToAddTasksTo)) { @@ -435,16 +445,6 @@ class FlutterPlugin : Plugin { } } } - // Copy the native assets created by build.dart and placed here by flutter assemble. - // This path is not flavor specific and must only be added once. - // If support for flavors is added to native assets, then they must only be added - // once per flavor; see https://github.com/dart-lang/native/issues/1359. - val nativeAssetsDir = - "${projectToAddTasksTo.layout.buildDirectory.get()}/../native_assets/android/jniLibs/lib/" - android.sourceSets - .getByName("main") - .jniLibs - .srcDir(nativeAssetsDir) getPluginHandler(projectToAddTasksTo).configurePlugins(engineVersion!!) FlutterPluginUtils.detectLowCompileSdkVersionOrNdkVersion( projectToAddTasksTo, @@ -700,45 +700,41 @@ class FlutterPlugin : Plugin { flavor = flavorValue } val flutterCompileTask: FlutterTask = compileTaskProvider.get() - val libJar: File = - project.file( - project.layout.buildDirectory.dir("${FlutterPluginConstants.INTERMEDIATES_DIR}/flutter/${variant.name}/libs.jar") + val jniLibsDir = + project.layout.buildDirectory.dir( + "${FlutterPluginConstants.INTERMEDIATES_DIR}/flutter/${variant.name}/jniLibs" ) - val packJniLibsTaskProvider: TaskProvider = + val copyJniLibsTaskProvider: TaskProvider = project.tasks.register( - "packJniLibs${FLUTTER_BUILD_PREFIX}${FlutterPluginUtils.capitalize(variant.name)}", - Jar::class.java + "copyJniLibs${FLUTTER_BUILD_PREFIX}${FlutterPluginUtils.capitalize(variant.name)}", + Sync::class.java ) { - destinationDirectory.set(libJar.parentFile) - archiveFileName.set(libJar.name) dependsOn(flutterCompileTask) + into(jniLibsDir) targetPlatforms.forEach { targetPlatform -> val abi: String? = FlutterPluginConstants.PLATFORM_ARCH_MAP[targetPlatform] from("${flutterCompileTask.intermediateDir}/$abi") { include("*.so") - // Move `app.so` to `lib//libapp.so` - rename { filename: String -> "lib/$abi/lib$filename" } + rename { filename: String -> "lib$filename" } + into(abi ?: "null") } // Copy the native assets created by build.dart and placed in build/native_assets by flutter assemble. - // The `$project.layout.buildDirectory` is '.android/Flutter/build/' instead of 'build/'. val buildDir = "${FlutterPluginUtils.getFlutterSourceDirectory(project)}/build" val nativeAssetsDir = "$buildDir/native_assets/android/jniLibs/lib" from("$nativeAssetsDir/$abi") { include("*.so") - rename { filename: String -> "lib/$abi/$filename" } + into(abi ?: "null") } } } - val packJniLibsTask: Task = packJniLibsTaskProvider.get() - FlutterPluginUtils.addApiDependencies( - project, - variant.name, - project.files({ - packJniLibsTask - }) - ) + val mergeJniLibsTaskName = "merge${FlutterPluginUtils.capitalize(variant.name)}JniLibFolders" + project.tasks.configureEach { + if (name == mergeJniLibsTaskName) { + dependsOn(copyJniLibsTaskProvider) + } + } val copyFlutterAssetsTaskProvider: TaskProvider = project.tasks.register( "copyFlutterAssets${FlutterPluginUtils.capitalize(variant.name)}", diff --git a/packages/flutter_tools/lib/src/android/gradle.dart b/packages/flutter_tools/lib/src/android/gradle.dart index b132b4cbe53..f3f3a8bfa43 100644 --- a/packages/flutter_tools/lib/src/android/gradle.dart +++ b/packages/flutter_tools/lib/src/android/gradle.dart @@ -705,17 +705,24 @@ class AndroidGradleBuilder implements AndroidBuilder { return false; } - // 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') || - result.stdout.contains('libflutter.so.dbg')) { - return true; + // As long as libflutter.so.sym/dbg and libapp.so.sym/dbg are present for at least + // one architecture, assume AGP succeeded in stripping. + if (!(result.stdout.contains('libflutter.so.sym') || + result.stdout.contains('libflutter.so.dbg'))) { + _logger.printTrace( + 'libflutter.so.sym or libflutter.so.dbg not present when checking final appbundle for debug symbols.', + ); + return false; } - _logger.printTrace( - 'libflutter.so.sym or libflutter.so.dbg not present when checking final appbundle for debug symbols.', - ); - return false; + if (!(result.stdout.contains('libapp.so.sym') || result.stdout.contains('libapp.so.dbg'))) { + _logger.printTrace( + 'libapp.so.sym or libapp.so.dbg not present when checking final appbundle for debug symbols.', + ); + return false; + } + + return true; } Future _performCodeSizeAnalysis( diff --git a/packages/flutter_tools/lib/src/base/build.dart b/packages/flutter_tools/lib/src/base/build.dart index c98c7c62500..e99f1975211 100644 --- a/packages/flutter_tools/lib/src/base/build.dart +++ b/packages/flutter_tools/lib/src/base/build.dart @@ -140,6 +140,13 @@ class AOTSnapshotter { buildMode == BuildMode.profile || buildMode == BuildMode.release; _logger.printTrace('extractAppleDebugSymbols = $extractAppleDebugSymbols'); + final bool targetingAndroidPlatform = + platform == TargetPlatform.android || + platform == TargetPlatform.android_arm || + platform == TargetPlatform.android_arm64 || + platform == TargetPlatform.android_x64; + _logger.printTrace('targetingAndroidPlatform = $targetingAndroidPlatform'); + // We strip snapshot by default, but allow to suppress this behavior // by supplying --no-strip in extraGenSnapshotOptions. var shouldStrip = true; @@ -170,6 +177,9 @@ class AOTSnapshotter { if (stripAfterBuild) { _logger.printTrace('Will strip AOT snapshot manually after build and dSYM generation.'); } + } else if (targetingAndroidPlatform) { + stripAfterBuild = false; + // When building for Android, we let AGP handle stripping of debug symbols. } else { stripAfterBuild = false; if (shouldStrip) { 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 efe238156e4..f8d9fbf8f1c 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 @@ -863,6 +863,7 @@ 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 +/BUNDLE-METADATA/com.android.tools.build.debugsymbols/arm64-v8a/libapp.so.sym '''; // Output from `/tools/bin/apkanalyzer files list ` @@ -873,6 +874,7 @@ 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.dbg +/BUNDLE-METADATA/com.android.tools.build.debugsymbols/arm64-v8a/libapp.so.dbg '''; void createSharedGradleFiles() { diff --git a/packages/flutter_tools/test/general.shard/base/build_test.dart b/packages/flutter_tools/test/general.shard/base/build_test.dart index de41b2e5693..81e72f98c8f 100644 --- a/packages/flutter_tools/test/general.shard/base/build_test.dart +++ b/packages/flutter_tools/test/general.shard/base/build_test.dart @@ -420,7 +420,6 @@ void main() { '--deterministic', '--snapshot_kind=app-aot-elf', '--elf=build/foo/app.so', - '--strip', '--no-sim-use-hardfp', '--no-use-integer-division', 'main.dill', @@ -454,7 +453,6 @@ void main() { '--deterministic', '--snapshot_kind=app-aot-elf', '--elf=build/foo/app.so', - '--strip', '--no-sim-use-hardfp', '--no-use-integer-division', '--dwarf-stack-traces', @@ -491,7 +489,6 @@ void main() { '--deterministic', '--snapshot_kind=app-aot-elf', '--elf=build/foo/app.so', - '--strip', '--no-sim-use-hardfp', '--no-use-integer-division', '--obfuscate', @@ -527,7 +524,6 @@ void main() { '--deterministic', '--snapshot_kind=app-aot-elf', '--elf=build/foo/app.so', - '--strip', '--no-sim-use-hardfp', '--no-use-integer-division', 'main.dill', @@ -562,7 +558,6 @@ void main() { '--deterministic', '--snapshot_kind=app-aot-elf', '--elf=build/foo/app.so', - '--strip', 'main.dill', ], ), diff --git a/packages/flutter_tools/test/general.shard/build_system/targets/android_test.dart b/packages/flutter_tools/test/general.shard/build_system/targets/android_test.dart index 93bf4d706b9..9ccb7337872 100644 --- a/packages/flutter_tools/test/general.shard/build_system/targets/android_test.dart +++ b/packages/flutter_tools/test/general.shard/build_system/targets/android_test.dart @@ -180,7 +180,6 @@ void main() { '--deterministic', '--snapshot_kind=app-aot-elf', '--elf=${environment.buildDir.childDirectory('arm64-v8a').childFile('app.so').path}', - '--strip', environment.buildDir.childFile('app.dill').path, ], ), @@ -219,7 +218,6 @@ void main() { '--trace-precompiler-to=code_size_1/trace.arm64-v8a.json', '--snapshot_kind=app-aot-elf', '--elf=${environment.buildDir.childDirectory('arm64-v8a').childFile('app.so').path}', - '--strip', environment.buildDir.childFile('app.dill').path, ], ), @@ -263,7 +261,6 @@ void main() { 'baz=2', '--snapshot_kind=app-aot-elf', '--elf=${environment.buildDir.childDirectory('arm64-v8a').childFile('app.so').path}', - '--strip', environment.buildDir.childFile('app.dill').path, ], ), @@ -276,7 +273,7 @@ void main() { }); testUsingContext( - '--no-strip in kExtraGenSnapshotOptions suppresses --strip gen_snapshot flag', + '--strip in kExtraGenSnapshotOptions provides --strip gen_snapshot flag', () async { processManager = FakeProcessManager.empty(); final environment = Environment.test( @@ -284,7 +281,7 @@ void main() { outputDir: fileSystem.directory('out')..createSync(), defines: { kBuildMode: 'release', - kExtraGenSnapshotOptions: 'foo,--no-strip,bar', + kExtraGenSnapshotOptions: 'foo,--strip,bar', kTargetPlatform: 'android-arm', }, processManager: processManager, @@ -302,6 +299,7 @@ void main() { ), '--deterministic', 'foo', + '--strip', 'bar', '--snapshot_kind=app-aot-elf', '--elf=${environment.buildDir.childDirectory('arm64-v8a').childFile('app.so').path}', diff --git a/packages/flutter_tools/test/general.shard/build_system/targets/common_test.dart b/packages/flutter_tools/test/general.shard/build_system/targets/common_test.dart index 2e0f99300c3..e206d88db4b 100644 --- a/packages/flutter_tools/test/general.shard/build_system/targets/common_test.dart +++ b/packages/flutter_tools/test/general.shard/build_system/targets/common_test.dart @@ -680,7 +680,6 @@ void main() { '--deterministic', kElfAot, '--elf=$build/app.so', - '--strip', '--no-sim-use-hardfp', '--no-use-integer-division', '$build/app.dill', @@ -711,7 +710,6 @@ void main() { '--trace-precompiler-to=code_size_1/trace.android-arm.json', kElfAot, '--elf=$build/app.so', - '--strip', '--no-sim-use-hardfp', '--no-use-integer-division', '$build/app.dill', @@ -911,7 +909,6 @@ void main() { 'baz=2', kElfAot, '--elf=$build/app.so', - '--strip', '--no-sim-use-hardfp', '--no-use-integer-division', '$build/app.dill',