Gray Mackall e971379436
Convert AppPluginLoaderPlugin to Kotlin, and add NativePluginLoaderReflectionBridge to expose it in Kotlin (#166027)
Graph [stolen from Barteks
comment](https://github.com/flutter/flutter/pull/161352#issuecomment-2611252732)
documenting the existing (pre pr) state:

```mermaid
graph TD;
  flutter.groovy -- import --> native_plugin_loader.groovy;
  flutter.groovy -- import --> BaseApplicationNameHandler.kt;
  module_plugin_loader.groovy -- "ext" --> native_plugin_loader.groovy;
  app_plugin_loader.groovy  -- import --> native_plugin_loader.groovy;
  include_flutter.groovy -- "apply from: " --> module_plugin_loader.groovy;
```
1. Converts the `app_plugin_loader.groovy` to kotlin source. 
2. Converts the `module_plugin_loader.groovy` to kotlin script. This
can't be changed to kotlin source yet, as we will need to instruct users
to make a change to their host app-level gradle files before we can turn
down script application of this separate gradle plugin. This is a
breaking change, and will need a quarter at least of notice.
3. Unfortunately, the main Flutter Gradle plugin depends on being able
to call methods of the `native_plugin_loader`, which we could do in
groovy via wacky dynamic behavior, calling across the compiled
plugin->script plugin barrier. We can't do this in Kotlin source, and we
also can't fully convert `native_plugin_loader` to kotlin source yet
because of (2), so I've added a `NativePluginLoaderReflectionBridge`
that allows us to access the methods in the
`native_plugin_loader.gradle.kts` from the Kotlin source files, calling
across the compiled plugin->script plugin barrier as we were before.

The plan here is
1. to follow up by adding a converted `native_plugin_loader.gradle.kts`
in Kotlin source, and migrating all paths but the host-app using a
module-as-source to use the converted approach (but not deleting the old
way)
2. maintaining both ways for a release or two, with the script
application printing a message notifying users to update to the
non-script based application of the `module_plugin_loader`.
3. Then we can delete the script based apply, and also the reflection
bridge.

## Pre-launch Checklist

- [x] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [x] I read the [Tree Hygiene] wiki page, which explains my
responsibilities.
- [x] I read and followed the [Flutter Style Guide], including [Features
we expect every widget to implement].
- [x] I signed the [CLA].
- [x] I listed at least one issue that this PR fixes in the description
above.
- [x] I updated/added relevant documentation (doc comments with `///`).
- [ ] I added new tests to check the change I am making, or this PR is
[test-exempt].
- [x] I followed the [breaking change policy] and added [Data Driven
Fixes] where supported.
- [x] All existing and new tests are passing.

If you need help, consider asking for advice on the #hackers-new channel
on [Discord].

<!-- Links -->
[Contributor Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview
[Tree Hygiene]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md
[test-exempt]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#tests
[Flutter Style Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md
[Features we expect every widget to implement]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement
[CLA]: https://cla.developers.google.com/
[flutter/tests]: https://github.com/flutter/tests
[breaking change policy]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes
[Discord]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Chat.md
[Data Driven Fixes]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md

---------

Co-authored-by: Gray Mackall <mackall@google.com>
2025-04-02 20:29:13 +00:00

82 lines
3.0 KiB
Plaintext

// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
plugins {
`java-gradle-plugin`
groovy
`kotlin-dsl`
kotlin("jvm") version "1.9.20"
}
group = "dev.flutter.plugin"
version = "1.0.0"
// Optional: enable stricter validation, to ensure Gradle configuration is correct
tasks.validatePlugins {
enableStricterValidation.set(true)
}
// We need to compile Kotlin first so we can call it from Groovy. See https://stackoverflow.com/q/36214437/7009800
tasks.withType<GroovyCompile> {
dependsOn(tasks.compileKotlin)
classpath += files(tasks.compileKotlin.get().destinationDirectory)
}
tasks.classes {
dependsOn(tasks.compileGroovy)
}
gradlePlugin {
plugins {
// The "flutterPlugin" name isn't used anywhere.
create("flutterPlugin") {
id = "dev.flutter.flutter-gradle-plugin"
implementationClass = "FlutterPlugin"
}
// The "flutterAppPluginLoaderPlugin" name isn't used anywhere.
create("flutterAppPluginLoaderPlugin") {
id = "dev.flutter.flutter-plugin-loader"
implementationClass = "com.flutter.gradle.FlutterAppPluginLoaderPlugin"
}
}
}
tasks.withType<JavaCompile> {
options.release.set(11)
}
tasks.test {
useJUnitPlatform()
}
// https://stackoverflow.com/questions/55456176/unresolved-reference-compilekotlin-in-build-gradle-kts
tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> {
compilerOptions {
jvmTarget.set(JvmTarget.JVM_11)
}
}
dependencies {
// Versions available https://mvnrepository.com/artifact/androidx.annotation/annotation-jvm.
// Version release notes https://developer.android.com/jetpack/androidx/releases/annotation
compileOnly("androidx.annotation:annotation-jvm:1.9.1")
implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:1.8.0")
// Update to 1.8.0 when min kotlin is 2.1
// https://github.com/Kotlin/kotlinx.serialization/releases for kotlin version compatibility.
// All kotlinx implementation dependencies must work with the oldest kotlin supported versions.
// Defined in packages/flutter_tools/gradle/src/main/kotlin/DependencyVersionChecker.kt
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.4.0")
// When bumping, also update:
// * ndkVersion in FlutterExtension in packages/flutter_tools/gradle/src/main/groovy/flutter.groovy
// * AGP version in the buildscript block in packages/flutter_tools/gradle/src/main/kotlin_scripts/dependency_version_checker.gradle.kts
// * AGP version constants in packages/flutter_tools/lib/src/android/gradle_utils.dart
compileOnly("com.android.tools.build:gradle:8.7.3")
testImplementation(kotlin("test"))
testImplementation("com.android.tools.build:gradle:8.7.3")
testImplementation("org.mockito:mockito-core:5.8.0")
testImplementation("io.mockk:mockk:1.13.16")
}