4
4
5
5
package com.flutter.gradle
6
6
7
- import com.android.build.VariantOutput
8
7
import com.android.build.api.dsl.ApplicationExtension
9
8
import com.android.build.gradle.AbstractAppExtension
10
9
import com.android.build.gradle.BaseExtension
11
10
import 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
15
11
import com.android.build.gradle.tasks.PackageAndroidArtifact
16
12
import com.android.build.gradle.tasks.ProcessAndroidResources
17
13
import com.flutter.gradle.FlutterPluginUtils.readPropertiesIfExist
@@ -27,6 +23,8 @@ import org.gradle.api.tasks.Copy
27
23
import org.gradle.api.tasks.TaskProvider
28
24
import org.gradle.api.tasks.bundling.Jar
29
25
import org.gradle.internal.os.OperatingSystem
26
+ import org.gradle.kotlin.dsl.support.serviceOf
27
+ import org.gradle.process.ExecOperations
30
28
import java.io.File
31
29
import java.nio.charset.StandardCharsets
32
30
import java.nio.file.Paths
@@ -54,7 +52,7 @@ class FlutterPlugin : Plugin<Project> {
54
52
55
53
val flutterRootSystemVal: String? = System .getenv(" FLUTTER_ROOT" )
56
54
val flutterRootPath: String =
57
- resolveProperty( " flutter.sdk " , flutterRootSystemVal)
55
+ resolveFlutterSdkProperty( flutterRootSystemVal)
58
56
? : throw GradleException (
59
57
" Flutter SDK not found. Define location with flutter.sdk in the " +
60
58
" local.properties file or with a FLUTTER_ROOT environment variable."
@@ -145,7 +143,7 @@ class FlutterPlugin : Plugin<Project> {
145
143
isUniversalApk = false
146
144
}
147
145
}
148
- val propDeferredComponentNames: String = " deferred-component-names"
146
+ val propDeferredComponentNames = " deferred-component-names"
149
147
val deferredComponentNamesValue: String? =
150
148
project.findProperty(propDeferredComponentNames) as ? String
151
149
if (deferredComponentNamesValue != null ) {
@@ -280,10 +278,8 @@ class FlutterPlugin : Plugin<Project> {
280
278
private fun getExecutableNameForPlatform (baseExecutableName : String ): String =
281
279
if (OperatingSystem .current().isWindows) " $baseExecutableName .bat" else baseExecutableName
282
280
283
- private fun resolveProperty (
284
- propertyName : String ,
285
- defaultValue : String?
286
- ): String? {
281
+ private fun resolveFlutterSdkProperty (defaultValue : String? ): String? {
282
+ val propertyName = " flutter.sdk"
287
283
if (localProperties == null ) {
288
284
localProperties =
289
285
readPropertiesIfExist(File (project!! .projectDir.parentFile, " local.properties" ))
@@ -300,7 +296,8 @@ class FlutterPlugin : Plugin<Project> {
300
296
rootProject.subprojects.forEach { subproject ->
301
297
val gradlew: String =
302
298
getExecutableNameForPlatform(" ${rootProject.projectDir} /gradlew" )
303
- rootProject.exec {
299
+ val execOps = rootProject.serviceOf<ExecOperations >()
300
+ execOps.exec {
304
301
workingDir(rootProject.projectDir)
305
302
executable(gradlew)
306
303
args(" :${subproject.name} :dependencies" , " --write-locks" )
@@ -342,11 +339,18 @@ class FlutterPlugin : Plugin<Project> {
342
339
}
343
340
val copyFlutterAssetsTask: Task =
344
341
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()
346
347
val processResources: ProcessAndroidResources =
347
348
try {
348
349
variantOutput.processResourcesProvider.get()
349
350
} catch (e: UnknownTaskException ) {
351
+ // TODO(gmackall): Migrate to AGPs variant api.
352
+ // https://github.com/flutter/flutter/issues/166550
353
+ @Suppress(" DEPRECATION" )
350
354
variantOutput.processResources
351
355
}
352
356
processResources.dependsOn(copyFlutterAssetsTask)
@@ -361,19 +365,26 @@ class FlutterPlugin : Plugin<Project> {
361
365
// * `build-mode` can be `release|debug|profile`.
362
366
variant.outputs.forEach { output ->
363
367
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
365
372
val packageApplicationProvider: PackageAndroidArtifact =
366
373
variant.packageApplicationProvider.get()
367
374
val outputDirectory: Directory =
368
375
packageApplicationProvider.outputDirectory.get()
369
376
val outputDirectoryStr: String = outputDirectory.toString()
370
377
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 )
372
383
if (abi != null && abi.isNotEmpty()) {
373
384
filename + = " -$abi "
374
385
}
375
386
if (variant.flavorName != null && variant.flavorName.isNotEmpty()) {
376
- filename + = " -${variant.flavorName.toLowerCase( )} "
387
+ filename + = " -${FlutterPluginUtils .lowercase( variant.flavorName)} "
377
388
}
378
389
filename + = " -${FlutterPluginUtils .buildModeFor(variant.buildType)} "
379
390
projectToAddTasksTo.copy {
@@ -395,13 +406,13 @@ class FlutterPlugin : Plugin<Project> {
395
406
// This path is not flavor specific and must only be added once.
396
407
// If support for flavors is added to native assets, then they must only be added
397
408
// once per flavor; see https://github.com/dart-lang/native/issues/1359.
398
- val nativeAssetsDir: String =
409
+ val nativeAssetsDir =
399
410
" ${projectToAddTasksTo.layout.buildDirectory.get()} /../native_assets/android/jniLibs/lib/"
400
411
android.sourceSets
401
412
.getByName(" main" )
402
413
.jniLibs
403
414
.srcDir(nativeAssetsDir)
404
- getPluginHandler(projectToAddTasksTo!! ).configurePlugins(engineVersion!! )
415
+ getPluginHandler(projectToAddTasksTo).configurePlugins(engineVersion!! )
405
416
FlutterPluginUtils .detectLowCompileSdkVersionOrNdkVersion(
406
417
projectToAddTasksTo,
407
418
getPluginHandler(projectToAddTasksTo).getPluginList()
@@ -469,10 +480,12 @@ class FlutterPlugin : Plugin<Project> {
469
480
flutterPlugin,
470
481
targetPlatforms
471
482
)
483
+ // TODO(gmackall): Migrate to AGPs variant api.
484
+ // https://github.com/flutter/flutter/issues/166550
472
485
val mergeAssets =
473
486
projectToAddTasksTo
474
487
.tasks
475
- .findByPath(" :$hostAppProjectName :merge${appProjectVariant.name. capitalize()} Assets" )
488
+ .findByPath(" :$hostAppProjectName :merge${FlutterPluginUtils . capitalize(appProjectVariant.name )} Assets" )
476
489
check(mergeAssets != null )
477
490
mergeAssets.dependsOn(copyFlutterAssetsTask)
478
491
}
@@ -502,7 +515,7 @@ class FlutterPlugin : Plugin<Project> {
502
515
* be sure to change any instances of this string in symbols in the code below
503
516
* to match.
504
517
*/
505
- const val FLUTTER_BUILD_PREFIX : String = " flutterBuild"
518
+ private const val FLUTTER_BUILD_PREFIX : String = " flutterBuild"
506
519
507
520
/* *
508
521
* Finds a task by name, returning null if the task does not exist.
@@ -517,8 +530,10 @@ class FlutterPlugin : Plugin<Project> {
517
530
null
518
531
}
519
532
533
+ // TODO(gmackall): Migrate to AGPs variant api.
534
+ // https://github.com/flutter/flutter/issues/166550
520
535
private fun addFlutterDeps (
521
- variant : BaseVariant ,
536
+ @Suppress( " DEPRECATION " ) variant : com.android.build.gradle.api. BaseVariant ,
522
537
flutterPlugin : FlutterPlugin ,
523
538
targetPlatforms : List <String >
524
539
): Task {
@@ -559,9 +574,15 @@ class FlutterPlugin : Plugin<Project> {
559
574
if (FlutterPluginUtils .shouldProjectSplitPerAbi(project)) {
560
575
variant.outputs.forEach { output ->
561
576
// 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" )
563
584
val filterIdentifier: String =
564
- output.getFilter(VariantOutput .FilterType .ABI )
585
+ output.getFilter(com.android.build. VariantOutput .FilterType .ABI )
565
586
val abiVersionCode: Int? = FlutterPluginConstants .ABI_VERSION [filterIdentifier]
566
587
if (abiVersionCode != null ) {
567
588
output.versionCodeOverride
@@ -647,8 +668,8 @@ class FlutterPlugin : Plugin<Project> {
647
668
project.layout.buildDirectory.dir(" ${FlutterPluginConstants .INTERMEDIATES_DIR } /flutter/${variant.name} /libs.jar" )
648
669
)
649
670
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 )} " ,
652
673
Jar ::class .java
653
674
) {
654
675
destinationDirectory.set(libJar.parentFile)
@@ -663,9 +684,9 @@ class FlutterPlugin : Plugin<Project> {
663
684
}
664
685
// Copy the native assets created by build.dart and placed in build/native_assets by flutter assemble.
665
686
// The `$project.layout.buildDirectory` is '.android/Flutter/build/' instead of 'build/'.
666
- val buildDir: String =
687
+ val buildDir =
667
688
" ${FlutterPluginUtils .getFlutterSourceDirectory(project)} /build"
668
- val nativeAssetsDir: String =
689
+ val nativeAssetsDir =
669
690
" $buildDir /native_assets/android/jniLibs/lib"
670
691
from(" $nativeAssetsDir /$abi " ) {
671
692
include(" *.so" )
@@ -683,13 +704,14 @@ class FlutterPlugin : Plugin<Project> {
683
704
)
684
705
val copyFlutterAssetsTaskProvider: TaskProvider <Copy > =
685
706
project.tasks.register(
686
- " copyFlutterAssets${variant.name. capitalize()} " ,
707
+ " copyFlutterAssets${FlutterPluginUtils . capitalize(variant.name )} " ,
687
708
Copy ::class .java
688
709
) {
689
710
dependsOn(compileTask)
690
711
with (compileTask.assets)
691
712
// TODO(gmackall): Replace with filePermissions.user.read/write = true once
692
713
// minimum supported Gradle version is 8.3.
714
+ @Suppress(" DEPRECATION" )
693
715
fileMode = 420 // corresponds to unix 0644 in base 8
694
716
if (isUsedAsSubproject) {
695
717
// TODO(gmackall): above is always false, can delete
@@ -701,20 +723,29 @@ class FlutterPlugin : Plugin<Project> {
701
723
try {
702
724
variant.mergeAssetsProvider.get()
703
725
} catch (e: IllegalStateException ) {
726
+ // TODO(gmackall): Migrate to AGPs variant api.
727
+ // https://github.com/flutter/flutter/issues/166550
728
+ @Suppress(" DEPRECATION" )
704
729
variant.mergeAssets
705
730
}
706
731
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 )} " )
709
734
into(mergeAssets.outputDir)
710
735
}
711
736
val copyFlutterAssetsTask: Task = copyFlutterAssetsTaskProvider.get()
712
737
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()
714
742
val processResources =
715
743
try {
716
744
variantOutput.processResourcesProvider.get()
717
745
} catch (e: IllegalStateException ) {
746
+ // TODO(gmackall): Migrate to AGPs variant api.
747
+ // https://github.com/flutter/flutter/issues/166550
748
+ @Suppress(" DEPRECATION" )
718
749
variantOutput.processResources
719
750
}
720
751
processResources.dependsOn(copyFlutterAssetsTask)
@@ -724,9 +755,9 @@ class FlutterPlugin : Plugin<Project> {
724
755
// See https://docs.gradle.org/8.1/userguide/validation_problems.html#implicit_dependency.
725
756
val tasksToCheck =
726
757
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"
730
761
)
731
762
tasksToCheck.forEach { taskTocheck ->
732
763
try {
0 commit comments