44
55package com.flutter.gradle
66
7- import com.android.build.VariantOutput
87import com.android.build.api.dsl.ApplicationExtension
98import com.android.build.gradle.AbstractAppExtension
109import com.android.build.gradle.BaseExtension
1110import com.android.build.gradle.LibraryExtension
12- import com.android.build.gradle.api.ApkVariantOutput
13- import com.android.build.gradle.api.BaseVariant
14- import com.android.build.gradle.api.BaseVariantOutput
1511import com.android.build.gradle.tasks.PackageAndroidArtifact
1612import com.android.build.gradle.tasks.ProcessAndroidResources
1713import com.flutter.gradle.FlutterPluginUtils.readPropertiesIfExist
@@ -27,6 +23,8 @@ import org.gradle.api.tasks.Copy
2723import org.gradle.api.tasks.TaskProvider
2824import org.gradle.api.tasks.bundling.Jar
2925import org.gradle.internal.os.OperatingSystem
26+ import org.gradle.kotlin.dsl.support.serviceOf
27+ import org.gradle.process.ExecOperations
3028import java.io.File
3129import java.nio.charset.StandardCharsets
3230import java.nio.file.Paths
@@ -54,7 +52,7 @@ class FlutterPlugin : Plugin<Project> {
5452
5553 val flutterRootSystemVal: String? = System .getenv(" FLUTTER_ROOT" )
5654 val flutterRootPath: String =
57- resolveProperty( " flutter.sdk " , flutterRootSystemVal)
55+ resolveFlutterSdkProperty( flutterRootSystemVal)
5856 ? : throw GradleException (
5957 " Flutter SDK not found. Define location with flutter.sdk in the " +
6058 " local.properties file or with a FLUTTER_ROOT environment variable."
@@ -145,7 +143,7 @@ class FlutterPlugin : Plugin<Project> {
145143 isUniversalApk = false
146144 }
147145 }
148- val propDeferredComponentNames: String = " deferred-component-names"
146+ val propDeferredComponentNames = " deferred-component-names"
149147 val deferredComponentNamesValue: String? =
150148 project.findProperty(propDeferredComponentNames) as ? String
151149 if (deferredComponentNamesValue != null ) {
@@ -280,10 +278,8 @@ class FlutterPlugin : Plugin<Project> {
280278 private fun getExecutableNameForPlatform (baseExecutableName : String ): String =
281279 if (OperatingSystem .current().isWindows) " $baseExecutableName .bat" else baseExecutableName
282280
283- private fun resolveProperty (
284- propertyName : String ,
285- defaultValue : String?
286- ): String? {
281+ private fun resolveFlutterSdkProperty (defaultValue : String? ): String? {
282+ val propertyName = " flutter.sdk"
287283 if (localProperties == null ) {
288284 localProperties =
289285 readPropertiesIfExist(File (project!! .projectDir.parentFile, " local.properties" ))
@@ -300,7 +296,8 @@ class FlutterPlugin : Plugin<Project> {
300296 rootProject.subprojects.forEach { subproject ->
301297 val gradlew: String =
302298 getExecutableNameForPlatform(" ${rootProject.projectDir} /gradlew" )
303- rootProject.exec {
299+ val execOps = rootProject.serviceOf<ExecOperations >()
300+ execOps.exec {
304301 workingDir(rootProject.projectDir)
305302 executable(gradlew)
306303 args(" :${subproject.name} :dependencies" , " --write-locks" )
@@ -342,11 +339,18 @@ class FlutterPlugin : Plugin<Project> {
342339 }
343340 val copyFlutterAssetsTask: Task =
344341 addFlutterDeps(variant, flutterPlugin, targetPlatforms)
345- val variantOutput: BaseVariantOutput = variant.outputs.first()
342+
343+ // TODO(gmackall): Migrate to AGPs variant api.
344+ // https://github.com/flutter/flutter/issues/166550
345+ @Suppress(" DEPRECATION" )
346+ val variantOutput: com.android.build.gradle.api.BaseVariantOutput = variant.outputs.first()
346347 val processResources: ProcessAndroidResources =
347348 try {
348349 variantOutput.processResourcesProvider.get()
349350 } catch (e: UnknownTaskException ) {
351+ // TODO(gmackall): Migrate to AGPs variant api.
352+ // https://github.com/flutter/flutter/issues/166550
353+ @Suppress(" DEPRECATION" )
350354 variantOutput.processResources
351355 }
352356 processResources.dependsOn(copyFlutterAssetsTask)
@@ -361,19 +365,26 @@ class FlutterPlugin : Plugin<Project> {
361365 // * `build-mode` can be `release|debug|profile`.
362366 variant.outputs.forEach { output ->
363367 assembleTask.doLast {
364- output as ApkVariantOutput
368+ // TODO(gmackall): Migrate to AGPs variant api.
369+ // https://github.com/flutter/flutter/issues/166550
370+ @Suppress(" DEPRECATION" )
371+ output as com.android.build.gradle.api.ApkVariantOutput
365372 val packageApplicationProvider: PackageAndroidArtifact =
366373 variant.packageApplicationProvider.get()
367374 val outputDirectory: Directory =
368375 packageApplicationProvider.outputDirectory.get()
369376 val outputDirectoryStr: String = outputDirectory.toString()
370377 var filename = " app"
371- val abi = output.getFilter(VariantOutput .FilterType .ABI )
378+
379+ // TODO(gmackall): Migrate to AGPs variant api.
380+ // https://github.com/flutter/flutter/issues/166550
381+ @Suppress(" DEPRECATION" )
382+ val abi = output.getFilter(com.android.build.VariantOutput .FilterType .ABI )
372383 if (abi != null && abi.isNotEmpty()) {
373384 filename + = " -$abi "
374385 }
375386 if (variant.flavorName != null && variant.flavorName.isNotEmpty()) {
376- filename + = " -${variant.flavorName.toLowerCase( )} "
387+ filename + = " -${FlutterPluginUtils .lowercase( variant.flavorName)} "
377388 }
378389 filename + = " -${FlutterPluginUtils .buildModeFor(variant.buildType)} "
379390 projectToAddTasksTo.copy {
@@ -395,13 +406,13 @@ class FlutterPlugin : Plugin<Project> {
395406 // This path is not flavor specific and must only be added once.
396407 // If support for flavors is added to native assets, then they must only be added
397408 // once per flavor; see https://github.com/dart-lang/native/issues/1359.
398- val nativeAssetsDir: String =
409+ val nativeAssetsDir =
399410 " ${projectToAddTasksTo.layout.buildDirectory.get()} /../native_assets/android/jniLibs/lib/"
400411 android.sourceSets
401412 .getByName(" main" )
402413 .jniLibs
403414 .srcDir(nativeAssetsDir)
404- getPluginHandler(projectToAddTasksTo!! ).configurePlugins(engineVersion!! )
415+ getPluginHandler(projectToAddTasksTo).configurePlugins(engineVersion!! )
405416 FlutterPluginUtils .detectLowCompileSdkVersionOrNdkVersion(
406417 projectToAddTasksTo,
407418 getPluginHandler(projectToAddTasksTo).getPluginList()
@@ -469,10 +480,12 @@ class FlutterPlugin : Plugin<Project> {
469480 flutterPlugin,
470481 targetPlatforms
471482 )
483+ // TODO(gmackall): Migrate to AGPs variant api.
484+ // https://github.com/flutter/flutter/issues/166550
472485 val mergeAssets =
473486 projectToAddTasksTo
474487 .tasks
475- .findByPath(" :$hostAppProjectName :merge${appProjectVariant.name. capitalize()} Assets" )
488+ .findByPath(" :$hostAppProjectName :merge${FlutterPluginUtils . capitalize(appProjectVariant.name )} Assets" )
476489 check(mergeAssets != null )
477490 mergeAssets.dependsOn(copyFlutterAssetsTask)
478491 }
@@ -502,7 +515,7 @@ class FlutterPlugin : Plugin<Project> {
502515 * be sure to change any instances of this string in symbols in the code below
503516 * to match.
504517 */
505- const val FLUTTER_BUILD_PREFIX : String = " flutterBuild"
518+ private const val FLUTTER_BUILD_PREFIX : String = " flutterBuild"
506519
507520 /* *
508521 * Finds a task by name, returning null if the task does not exist.
@@ -517,8 +530,10 @@ class FlutterPlugin : Plugin<Project> {
517530 null
518531 }
519532
533+ // TODO(gmackall): Migrate to AGPs variant api.
534+ // https://github.com/flutter/flutter/issues/166550
520535 private fun addFlutterDeps (
521- variant : BaseVariant ,
536+ @Suppress( " DEPRECATION " ) variant : com.android.build.gradle.api. BaseVariant ,
522537 flutterPlugin : FlutterPlugin ,
523538 targetPlatforms : List <String >
524539 ): Task {
@@ -559,9 +574,15 @@ class FlutterPlugin : Plugin<Project> {
559574 if (FlutterPluginUtils .shouldProjectSplitPerAbi(project)) {
560575 variant.outputs.forEach { output ->
561576 // need to force this as the API does not return the right thing for our use.
562- output as ApkVariantOutput
577+ // TODO(gmackall): Migrate to AGPs variant api.
578+ // https://github.com/flutter/flutter/issues/166550
579+ @Suppress(" DEPRECATION" )
580+ output as com.android.build.gradle.api.ApkVariantOutput
581+ // TODO(gmackall): Migrate to AGPs variant api.
582+ // https://github.com/flutter/flutter/issues/166550
583+ @Suppress(" DEPRECATION" )
563584 val filterIdentifier: String =
564- output.getFilter(VariantOutput .FilterType .ABI )
585+ output.getFilter(com.android.build. VariantOutput .FilterType .ABI )
565586 val abiVersionCode: Int? = FlutterPluginConstants .ABI_VERSION [filterIdentifier]
566587 if (abiVersionCode != null ) {
567588 output.versionCodeOverride
@@ -647,8 +668,8 @@ class FlutterPlugin : Plugin<Project> {
647668 project.layout.buildDirectory.dir(" ${FlutterPluginConstants .INTERMEDIATES_DIR } /flutter/${variant.name} /libs.jar" )
648669 )
649670 val packJniLibsTaskProvider: TaskProvider <Jar > =
650- project.tasks.register< Jar > (
651- " packJniLibs${FLUTTER_BUILD_PREFIX }${variant.name. capitalize()} " ,
671+ project.tasks.register(
672+ " packJniLibs${FLUTTER_BUILD_PREFIX }${FlutterPluginUtils . capitalize(variant.name )} " ,
652673 Jar ::class .java
653674 ) {
654675 destinationDirectory.set(libJar.parentFile)
@@ -663,9 +684,9 @@ class FlutterPlugin : Plugin<Project> {
663684 }
664685 // Copy the native assets created by build.dart and placed in build/native_assets by flutter assemble.
665686 // The `$project.layout.buildDirectory` is '.android/Flutter/build/' instead of 'build/'.
666- val buildDir: String =
687+ val buildDir =
667688 " ${FlutterPluginUtils .getFlutterSourceDirectory(project)} /build"
668- val nativeAssetsDir: String =
689+ val nativeAssetsDir =
669690 " $buildDir /native_assets/android/jniLibs/lib"
670691 from(" $nativeAssetsDir /$abi " ) {
671692 include(" *.so" )
@@ -683,13 +704,14 @@ class FlutterPlugin : Plugin<Project> {
683704 )
684705 val copyFlutterAssetsTaskProvider: TaskProvider <Copy > =
685706 project.tasks.register(
686- " copyFlutterAssets${variant.name. capitalize()} " ,
707+ " copyFlutterAssets${FlutterPluginUtils . capitalize(variant.name )} " ,
687708 Copy ::class .java
688709 ) {
689710 dependsOn(compileTask)
690711 with (compileTask.assets)
691712 // TODO(gmackall): Replace with filePermissions.user.read/write = true once
692713 // minimum supported Gradle version is 8.3.
714+ @Suppress(" DEPRECATION" )
693715 fileMode = 420 // corresponds to unix 0644 in base 8
694716 if (isUsedAsSubproject) {
695717 // TODO(gmackall): above is always false, can delete
@@ -701,20 +723,29 @@ class FlutterPlugin : Plugin<Project> {
701723 try {
702724 variant.mergeAssetsProvider.get()
703725 } catch (e: IllegalStateException ) {
726+ // TODO(gmackall): Migrate to AGPs variant api.
727+ // https://github.com/flutter/flutter/issues/166550
728+ @Suppress(" DEPRECATION" )
704729 variant.mergeAssets
705730 }
706731 dependsOn(mergeAssets)
707- dependsOn(" clean${mergeAssets.name. capitalize()} " )
708- mergeAssets.mustRunAfter(" clean${mergeAssets.name. capitalize()} " )
732+ dependsOn(" clean${FlutterPluginUtils . capitalize(mergeAssets.name )} " )
733+ mergeAssets.mustRunAfter(" clean${FlutterPluginUtils . capitalize(mergeAssets.name )} " )
709734 into(mergeAssets.outputDir)
710735 }
711736 val copyFlutterAssetsTask: Task = copyFlutterAssetsTaskProvider.get()
712737 if (! isUsedAsSubproject) {
713- val variantOutput: BaseVariantOutput = variant.outputs.first()
738+ // TODO(gmackall): Migrate to AGPs variant api.
739+ // https://github.com/flutter/flutter/issues/166550
740+ @Suppress(" DEPRECATION" )
741+ val variantOutput: com.android.build.gradle.api.BaseVariantOutput = variant.outputs.first()
714742 val processResources =
715743 try {
716744 variantOutput.processResourcesProvider.get()
717745 } catch (e: IllegalStateException ) {
746+ // TODO(gmackall): Migrate to AGPs variant api.
747+ // https://github.com/flutter/flutter/issues/166550
748+ @Suppress(" DEPRECATION" )
718749 variantOutput.processResources
719750 }
720751 processResources.dependsOn(copyFlutterAssetsTask)
@@ -724,9 +755,9 @@ class FlutterPlugin : Plugin<Project> {
724755 // See https://docs.gradle.org/8.1/userguide/validation_problems.html#implicit_dependency.
725756 val tasksToCheck =
726757 listOf (
727- " compress${variant.name. capitalize()} Assets" ,
728- " bundle${variant.name. capitalize()} Aar" ,
729- " bundle${variant.name. capitalize()} LocalLintAar"
758+ " compress${FlutterPluginUtils . capitalize(variant.name )} Assets" ,
759+ " bundle${FlutterPluginUtils . capitalize(variant.name )} Aar" ,
760+ " bundle${FlutterPluginUtils . capitalize(variant.name )} LocalLintAar"
730761 )
731762 tasksToCheck.forEach { taskTocheck ->
732763 try {
0 commit comments