From 9dbc66979ac10ef20defad81212ffc34f99a7a3b Mon Sep 17 00:00:00 2001 From: Emmanuel Garcia Date: Tue, 18 Jun 2019 15:30:59 -0700 Subject: [PATCH] Revert "Config lib dependencies when using flavors (#34592)" (#34655) This reverts commit 358b9bd381fc8cc30094aafb873bce20a02c848c. --- .../bin/tasks/gradle_plugin_bundle_test.dart | 66 ++++--------------- .../bin/tasks/gradle_plugin_fat_apk_test.dart | 30 +++++++-- .../tasks/gradle_plugin_light_apk_test.dart | 22 +++++-- dev/devicelab/lib/framework/apk_utils.dart | 61 ++++++++--------- packages/flutter_tools/gradle/flutter.gradle | 15 +++-- .../flutter_tools/lib/src/android/gradle.dart | 6 +- 6 files changed, 92 insertions(+), 108 deletions(-) diff --git a/dev/devicelab/bin/tasks/gradle_plugin_bundle_test.dart b/dev/devicelab/bin/tasks/gradle_plugin_bundle_test.dart index f08e96fcd5a..69c1854275c 100644 --- a/dev/devicelab/bin/tasks/gradle_plugin_bundle_test.dart +++ b/dev/devicelab/bin/tasks/gradle_plugin_bundle_test.dart @@ -7,26 +7,19 @@ import 'dart:async'; import 'package:flutter_devicelab/framework/apk_utils.dart'; import 'package:flutter_devicelab/framework/framework.dart'; import 'package:flutter_devicelab/framework/utils.dart'; -import 'package:path/path.dart' as path; Future main() async { await task(() async { try { - await runProjectTest((FlutterProject project) async { + await runPluginProjectTest((FlutterPluginProject pluginProject) async { section('App bundle content for task bundleRelease without explicit target platform'); - await project.runGradleTask('bundleRelease'); + await pluginProject.runGradleTask('bundleRelease'); - final String releaseBundle = path.join( - project.rootPath, - 'build', - 'app', - 'outputs', - 'bundle', - 'release', - 'app.aab', - ); + if (!pluginProject.hasReleaseBundle) + throw TaskResult.failure( + 'Gradle did not produce a release aab file at: ${pluginProject.releaseBundlePath}'); - final Iterable bundleFiles = await getFilesInAppBundle(releaseBundle); + final Iterable bundleFiles = await pluginProject.getFilesInAppBundle(pluginProject.releaseBundlePath); checkItContains([ 'base/manifest/AndroidManifest.xml', @@ -38,51 +31,16 @@ Future main() async { ], bundleFiles); }); - await runProjectTest((FlutterProject project) async { - section('App bundle content using flavors without explicit target platform'); - // Add a few flavors. - await project.addProductFlavors( ['production', 'staging', 'development']); - // Build the production flavor in release mode. - await project.runGradleTask('bundleProductionRelease'); - - final String bundlePath = path.join( - project.rootPath, - 'build', - 'app', - 'outputs', - 'bundle', - 'productionRelease', - 'app.aab', - ); - - final Iterable bundleFiles = await getFilesInAppBundle(bundlePath); - - checkItContains([ - 'base/manifest/AndroidManifest.xml', - 'base/dex/classes.dex', - 'base/lib/arm64-v8a/libapp.so', - 'base/lib/arm64-v8a/libflutter.so', - 'base/lib/armeabi-v7a/libapp.so', - 'base/lib/armeabi-v7a/libflutter.so', - ], bundleFiles); - }); - - await runProjectTest((FlutterProject project) async { + await runPluginProjectTest((FlutterPluginProject pluginProject) async { section('App bundle content for task bundleRelease with target platform = android-arm'); - await project.runGradleTask('bundleRelease', + await pluginProject.runGradleTask('bundleRelease', options: ['-Ptarget-platform=android-arm']); - final String releaseBundle = path.join( - project.rootPath, - 'build', - 'app', - 'outputs', - 'bundle', - 'release', - 'app.aab', - ); + if (!pluginProject.hasReleaseBundle) + throw TaskResult.failure( + 'Gradle did not produce a release aab file at: ${pluginProject.releaseBundlePath}'); - final Iterable bundleFiles = await getFilesInAppBundle(releaseBundle); + final Iterable bundleFiles = await pluginProject.getFilesInAppBundle(pluginProject.releaseBundlePath); checkItContains([ 'base/manifest/AndroidManifest.xml', diff --git a/dev/devicelab/bin/tasks/gradle_plugin_fat_apk_test.dart b/dev/devicelab/bin/tasks/gradle_plugin_fat_apk_test.dart index cc3f149418f..a876528d402 100644 --- a/dev/devicelab/bin/tasks/gradle_plugin_fat_apk_test.dart +++ b/dev/devicelab/bin/tasks/gradle_plugin_fat_apk_test.dart @@ -17,7 +17,11 @@ Future main() async { section('APK content for task assembleDebug without explicit target platform'); await pluginProject.runGradleTask('assembleDebug'); - final Iterable apkFiles = await getFilesInApk(pluginProject.debugApkPath); + if (!pluginProject.hasDebugApk) + throw TaskResult.failure( + 'Gradle did not produce a debug apk file at: ${pluginProject.debugApkPath}'); + + final Iterable apkFiles = await pluginProject.getFilesInApk(pluginProject.debugApkPath); checkItContains([ 'AndroidManifest.xml', @@ -44,7 +48,11 @@ Future main() async { section('APK content for task assembleRelease without explicit target platform'); await pluginProject.runGradleTask('assembleRelease'); - final Iterable apkFiles = await getFilesInApk(pluginProject.releaseApkPath); + if (!pluginProject.hasReleaseApk) + throw TaskResult.failure( + 'Gradle did not produce a release apk file at: ${pluginProject.releaseApkPath}'); + + final Iterable apkFiles = await pluginProject.getFilesInApk(pluginProject.releaseApkPath); checkItContains([ 'AndroidManifest.xml', @@ -67,7 +75,11 @@ Future main() async { await pluginProject.runGradleTask('assembleRelease', options: ['-Ptarget-platform=android-arm,android-arm64']); - final Iterable apkFiles = await getFilesInApk(pluginProject.releaseApkPath); + if (!pluginProject.hasReleaseApk) + throw TaskResult.failure( + 'Gradle did not produce a release apk at: ${pluginProject.releaseApkPath}'); + + final Iterable apkFiles = await pluginProject.getFilesInApk(pluginProject.releaseApkPath); checkItContains([ 'AndroidManifest.xml', @@ -91,7 +103,11 @@ Future main() async { await pluginProject.runGradleTask('assembleRelease', options: ['-Ptarget-platform=android-arm,android-arm64', '-Psplit-per-abi=true']); - final Iterable armApkFiles = await getFilesInApk(pluginProject.releaseArmApkPath); + if (!pluginProject.hasReleaseArmApk) + throw TaskResult.failure( + 'Gradle did not produce a release apk at: ${pluginProject.releaseArmApkPath}'); + + final Iterable armApkFiles = await pluginProject.getFilesInApk(pluginProject.releaseArmApkPath); checkItContains([ 'AndroidManifest.xml', @@ -106,7 +122,11 @@ Future main() async { 'assets/flutter_assets/vm_snapshot_data', ], armApkFiles); - final Iterable arm64ApkFiles = await getFilesInApk(pluginProject.releaseArm64ApkPath); + if (!pluginProject.hasReleaseArm64Apk) + throw TaskResult.failure( + 'Gradle did not produce a release apk at: ${pluginProject.releaseArm64ApkPath}'); + + final Iterable arm64ApkFiles = await pluginProject.getFilesInApk(pluginProject.releaseArm64ApkPath); checkItContains([ 'AndroidManifest.xml', diff --git a/dev/devicelab/bin/tasks/gradle_plugin_light_apk_test.dart b/dev/devicelab/bin/tasks/gradle_plugin_light_apk_test.dart index 6e44c505691..800a5075c8e 100644 --- a/dev/devicelab/bin/tasks/gradle_plugin_light_apk_test.dart +++ b/dev/devicelab/bin/tasks/gradle_plugin_light_apk_test.dart @@ -17,7 +17,11 @@ Future main() async { await pluginProject.runGradleTask('assembleDebug', options: ['-Ptarget-platform=android-arm']); - final Iterable apkFiles = await getFilesInApk(pluginProject.debugApkPath); + if (!pluginProject.hasDebugApk) + throw TaskResult.failure( + 'Gradle did not produce a debug apk file at: ${pluginProject.debugApkPath}'); + + final Iterable apkFiles = await pluginProject.getFilesInApk(pluginProject.debugApkPath); checkItContains([ 'AndroidManifest.xml', @@ -43,7 +47,11 @@ Future main() async { await pluginProject.runGradleTask('assembleRelease', options: ['-Ptarget-platform=android-arm']); - final Iterable apkFiles = await getFilesInApk(pluginProject.releaseApkPath); + if (!pluginProject.hasReleaseApk) + throw TaskResult.failure( + 'Gradle did not produce a release apk file at: ${pluginProject.releaseApkPath}'); + + final Iterable apkFiles = await pluginProject.getFilesInApk(pluginProject.releaseApkPath); checkItContains([ 'AndroidManifest.xml', @@ -66,7 +74,11 @@ Future main() async { await pluginProject.runGradleTask('assembleRelease', options: ['-Ptarget-platform=android-arm64']); - final Iterable apkFiles = await getFilesInApk(pluginProject.releaseApkPath); + if (!pluginProject.hasReleaseApk) + throw TaskResult.failure( + 'Gradle did not produce a release apk file at: ${pluginProject.releaseApkPath}'); + + final Iterable apkFiles = await pluginProject.getFilesInApk(pluginProject.releaseApkPath); checkItContains([ 'AndroidManifest.xml', @@ -112,7 +124,7 @@ Future main() async { await runProjectTest((FlutterProject project) async { section('gradlew assembleFreeDebug (product flavor)'); - await project.addProductFlavors(['free']); + await project.addProductFlavor('free'); await project.runGradleTask('assembleFreeDebug'); }); @@ -157,7 +169,7 @@ Future main() async { await runPluginProjectTest((FlutterPluginProject pluginProject) async { section('gradlew assembleDebug on plugin example'); await pluginProject.runGradleTask('assembleDebug'); - if (!File(pluginProject.debugApkPath).existsSync()) + if (!pluginProject.hasDebugApk) throw TaskResult.failure( 'Gradle did not produce an apk file at the expected place'); }); diff --git a/dev/devicelab/lib/framework/apk_utils.dart b/dev/devicelab/lib/framework/apk_utils.dart index 3b178723188..28efcbc54e2 100644 --- a/dev/devicelab/lib/framework/apk_utils.dart +++ b/dev/devicelab/lib/framework/apk_utils.dart @@ -34,27 +34,6 @@ Future runPluginProjectTest(Future testFunction(FlutterPluginProject } } -Future> getFilesInApk(String apk) async { - if (!File(apk).existsSync()) - throw TaskResult.failure( - 'Gradle did not produce an output artifact file at: $apk'); - - final Process unzip = await startProcess( - 'unzip', - ['-v', apk], - isBot: false, // we just want to test the output, not have any debugging info - ); - return unzip.stdout - .transform(utf8.decoder) - .transform(const LineSplitter()) - .map((String line) => line.split(' ').last) - .toList(); -} - -Future> getFilesInAppBundle(String bundle) { - return getFilesInApk(bundle); -} - void checkItContains(Iterable values, Iterable collection) { for (T value in values) { if (!collection.contains(value)) { @@ -116,25 +95,20 @@ android { '''); } - Future addProductFlavors(Iterable flavors) async { + Future addProductFlavor(String name) async { final File buildScript = File( path.join(androidPath, 'app', 'build.gradle'), ); - final String flavorConfig = flavors.map((String name) { - return ''' -$name { - applicationIdSuffix ".$name" - versionNameSuffix "-$name" -} - '''; - }).join('\n'); - buildScript.openWrite(mode: FileMode.append).write(''' + android { flavorDimensions "mode" productFlavors { - $flavorConfig + $name { + applicationIdSuffix ".$name" + versionNameSuffix "-$name" + } } } '''); @@ -186,9 +160,32 @@ class FlutterPluginProject { String get releaseArm64ApkPath => path.join(examplePath, 'build', 'app', 'outputs', 'apk', 'release', 'app-arm64-v8a-release.apk'); String get releaseBundlePath => path.join(examplePath, 'build', 'app', 'outputs', 'bundle', 'release', 'app.aab'); + bool get hasDebugApk => File(debugApkPath).existsSync(); + bool get hasReleaseApk => File(releaseApkPath).existsSync(); + bool get hasReleaseArmApk => File(releaseArmApkPath).existsSync(); + bool get hasReleaseArm64Apk => File(releaseArm64ApkPath).existsSync(); + bool get hasReleaseBundle => File(releaseBundlePath).existsSync(); + Future runGradleTask(String task, {List options}) async { return _runGradleTask(workingDirectory: exampleAndroidPath, task: task, options: options); } + + Future> getFilesInApk(String apk) async { + final Process unzip = await startProcess( + 'unzip', + ['-v', apk], + isBot: false, // we just want to test the output, not have any debugging info + ); + return unzip.stdout + .transform(utf8.decoder) + .transform(const LineSplitter()) + .map((String line) => line.split(' ').last) + .toList(); + } + + Future> getFilesInAppBundle(String bundle) { + return getFilesInApk(bundle); + } } Future _runGradleTask({String workingDirectory, String task, List options}) async { diff --git a/packages/flutter_tools/gradle/flutter.gradle b/packages/flutter_tools/gradle/flutter.gradle index b001f30783b..4619aabb4e4 100644 --- a/packages/flutter_tools/gradle/flutter.gradle +++ b/packages/flutter_tools/gradle/flutter.gradle @@ -114,6 +114,7 @@ class FlutterPlugin implements Plugin { String abiValue = PLATFORM_ARCH_MAP[targetArch] project.android { packagingOptions { + pickFirst "lib/${abiValue}/libflutter.so" // Prevent the ELF library from getting corrupted. doNotStrip "*/${abiValue}/libapp.so" } @@ -165,7 +166,7 @@ class FlutterPlugin implements Plugin { // The local engine is built for one of the build type. // However, we use the same engine for each of the build types. project.android.buildTypes.each { - addApiDependencies(project, it.name, project.files { + addApiDependencies(project, it, project.files { flutterJar }) } @@ -204,13 +205,13 @@ class FlutterPlugin implements Plugin { // added after applying the Flutter plugin. project.android.buildTypes.each { def buildMode = buildModeFor(it) - addApiDependencies(project, it.name, project.files { + addApiDependencies(project, it, project.files { baseJar[buildMode] }) } project.android.buildTypes.whenObjectAdded { def buildMode = buildModeFor(it) - addApiDependencies(project, it.name, project.files { + addApiDependencies(project, it, project.files { baseJar[buildMode] }) } @@ -341,14 +342,14 @@ class FlutterPlugin implements Plugin { } } - private static void addApiDependencies(Project project, String variantName, FileCollection files) { + private static void addApiDependencies(Project project, buildType, FileCollection files) { project.dependencies { String configuration; // `compile` dependencies are now `api` dependencies. if (project.getConfigurations().findByName("api")) { - configuration = "${variantName}Api"; + configuration = buildType.name + "Api"; } else { - configuration = "${variantName}Compile"; + configuration = buildType.name + "Compile"; } add(configuration, files) } @@ -526,7 +527,7 @@ class FlutterPlugin implements Plugin { } } // Include the snapshots and libflutter.so in `lib/`. - addApiDependencies(project, variant.name, project.files { + addApiDependencies(project, buildType, project.files { packFlutterSnapshotsAndLibsTask }) diff --git a/packages/flutter_tools/lib/src/android/gradle.dart b/packages/flutter_tools/lib/src/android/gradle.dart index 78f8307fa99..c4fe566d12e 100644 --- a/packages/flutter_tools/lib/src/android/gradle.dart +++ b/packages/flutter_tools/lib/src/android/gradle.dart @@ -585,12 +585,8 @@ File _findBundleFile(GradleProject project, BuildInfo buildInfo) { if (bundleFile.existsSync()) return bundleFile; if (buildInfo.flavor != null) { - // Android Studio Gradle plugin v3 adds the flavor to the path. For the bundle the folder name is the flavor plus the mode name. - // On linux, filenames are case sensitive. - bundleFile = project.bundleDirectory - .childDirectory(camelCase('${buildInfo.flavor}_$modeName')) - .childFile(bundleFileName); + bundleFile = project.bundleDirectory.childDirectory(buildInfo.flavor + modeName).childFile(bundleFileName); if (bundleFile.existsSync()) return bundleFile; }