From 1a00738a76e3079a0bad2a0df2c5b354f4d3a58e Mon Sep 17 00:00:00 2001 From: jesswrd Date: Fri, 25 Sep 2026 21:41:02 +0000 Subject: [PATCH 1/4] [various] Add Robolectric's recommended --add-opens JVM args to plugin unit tests JDK 17+ enforces strong encapsulation of JDK internals, so Robolectric requires a set of --add-opens flags on the unit test JVM (https://robolectric.org/getting-started/#running-with-java-17-and-higher). The current Robolectric 4.16 does not need them for these tests, but starting with Robolectric 4.17 the per-test environment setup (AndroidTestEnvironment.setUpApplicationState -> ApplicationSharedMemory.create -> FileDescriptorInterceptor) reflects into jdk.internal.access.SharedSecrets and fails with: IllegalAccessException: ... module java.base does not export jdk.internal.access to unnamed module Add the flag set recommended by Robolectric to the existing testOptions.unitTests.all block of every plugin that uses Robolectric, ahead of the 4.17 bump. These args only affect each plugin's own unit test JVM; they are not part of the published plugin. Plugins: camera_android, camera_android_camerax, file_selector_android, google_maps_flutter_android, image_picker_android, in_app_purchase_android, local_auth_android, shared_preferences_android, url_launcher_android, video_player_android. --- .../camera_android/android/build.gradle.kts | 16 ++++++++++++++++ .../android/build.gradle.kts | 16 ++++++++++++++++ .../android/build.gradle.kts | 16 ++++++++++++++++ .../android/build.gradle.kts | 16 ++++++++++++++++ .../android/build.gradle.kts | 16 ++++++++++++++++ .../android/build.gradle.kts | 16 ++++++++++++++++ .../local_auth_android/android/build.gradle.kts | 16 ++++++++++++++++ .../android/build.gradle.kts | 16 ++++++++++++++++ .../android/build.gradle.kts | 16 ++++++++++++++++ .../android/build.gradle.kts | 16 ++++++++++++++++ 10 files changed, 160 insertions(+) diff --git a/packages/camera/camera_android/android/build.gradle.kts b/packages/camera/camera_android/android/build.gradle.kts index d73b259cc13c..b7a7636b890f 100644 --- a/packages/camera/camera_android/android/build.gradle.kts +++ b/packages/camera/camera_android/android/build.gradle.kts @@ -66,6 +66,22 @@ android { // sets the heap size to a size large enough to run the robolectric tests across // multiple SDK levels. it.jvmArgs("-Xmx4G") + // JDK 17+ blocks reflective access to JDK internals by default. Starting + // with 4.17, Robolectric's test environment setup reflects into + // jdk.internal.access, so these are required. This is the flag set + // recommended by Robolectric, see + // https://robolectric.org/getting-started/#running-with-java-17-and-higher + it.jvmArgs( + "--add-opens=java.base/java.lang=ALL-UNNAMED", + "--add-opens=java.base/java.util=ALL-UNNAMED", + "--add-opens=java.base/java.io=ALL-UNNAMED", + "--add-opens=java.base/java.net=ALL-UNNAMED", + "--add-opens=java.base/java.security=ALL-UNNAMED", + "--add-opens=java.base/java.text=ALL-UNNAMED", + "--add-opens=java.base/jdk.internal.access=ALL-UNNAMED", + "--add-opens=java.desktop/java.awt.font=ALL-UNNAMED", + "--add-opens=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED", + ) } } } diff --git a/packages/camera/camera_android_camerax/android/build.gradle.kts b/packages/camera/camera_android_camerax/android/build.gradle.kts index 52315b3fc7a0..1d3f054eccc4 100644 --- a/packages/camera/camera_android_camerax/android/build.gradle.kts +++ b/packages/camera/camera_android_camerax/android/build.gradle.kts @@ -62,6 +62,22 @@ android { // sets the heap size to a size large enough to run the robolectric tests across // multiple SDK levels. it.jvmArgs("-Xmx1G") + // JDK 17+ blocks reflective access to JDK internals by default. Starting + // with 4.17, Robolectric's test environment setup reflects into + // jdk.internal.access, so these are required. This is the flag set + // recommended by Robolectric, see + // https://robolectric.org/getting-started/#running-with-java-17-and-higher + it.jvmArgs( + "--add-opens=java.base/java.lang=ALL-UNNAMED", + "--add-opens=java.base/java.util=ALL-UNNAMED", + "--add-opens=java.base/java.io=ALL-UNNAMED", + "--add-opens=java.base/java.net=ALL-UNNAMED", + "--add-opens=java.base/java.security=ALL-UNNAMED", + "--add-opens=java.base/java.text=ALL-UNNAMED", + "--add-opens=java.base/jdk.internal.access=ALL-UNNAMED", + "--add-opens=java.desktop/java.awt.font=ALL-UNNAMED", + "--add-opens=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED", + ) } } } diff --git a/packages/file_selector/file_selector_android/android/build.gradle.kts b/packages/file_selector/file_selector_android/android/build.gradle.kts index d2ec4a560020..a41bc71e2136 100644 --- a/packages/file_selector/file_selector_android/android/build.gradle.kts +++ b/packages/file_selector/file_selector_android/android/build.gradle.kts @@ -68,6 +68,22 @@ android { events("passed", "skipped", "failed", "standardOut", "standardError") showStandardStreams = true } + // JDK 17+ blocks reflective access to JDK internals by default. Starting + // with 4.17, Robolectric's test environment setup reflects into + // jdk.internal.access, so these are required. This is the flag set + // recommended by Robolectric, see + // https://robolectric.org/getting-started/#running-with-java-17-and-higher + it.jvmArgs( + "--add-opens=java.base/java.lang=ALL-UNNAMED", + "--add-opens=java.base/java.util=ALL-UNNAMED", + "--add-opens=java.base/java.io=ALL-UNNAMED", + "--add-opens=java.base/java.net=ALL-UNNAMED", + "--add-opens=java.base/java.security=ALL-UNNAMED", + "--add-opens=java.base/java.text=ALL-UNNAMED", + "--add-opens=java.base/jdk.internal.access=ALL-UNNAMED", + "--add-opens=java.desktop/java.awt.font=ALL-UNNAMED", + "--add-opens=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED", + ) } } } diff --git a/packages/google_maps_flutter/google_maps_flutter_android/android/build.gradle.kts b/packages/google_maps_flutter/google_maps_flutter_android/android/build.gradle.kts index 2072e33c085d..48a8f134b686 100644 --- a/packages/google_maps_flutter/google_maps_flutter_android/android/build.gradle.kts +++ b/packages/google_maps_flutter/google_maps_flutter_android/android/build.gradle.kts @@ -79,6 +79,22 @@ android { // sets the heap size to a size large enough to run the robolectric tests across // multiple SDK levels. it.jvmArgs("-Xmx4G") + // JDK 17+ blocks reflective access to JDK internals by default. Starting + // with 4.17, Robolectric's test environment setup reflects into + // jdk.internal.access, so these are required. This is the flag set + // recommended by Robolectric, see + // https://robolectric.org/getting-started/#running-with-java-17-and-higher + it.jvmArgs( + "--add-opens=java.base/java.lang=ALL-UNNAMED", + "--add-opens=java.base/java.util=ALL-UNNAMED", + "--add-opens=java.base/java.io=ALL-UNNAMED", + "--add-opens=java.base/java.net=ALL-UNNAMED", + "--add-opens=java.base/java.security=ALL-UNNAMED", + "--add-opens=java.base/java.text=ALL-UNNAMED", + "--add-opens=java.base/jdk.internal.access=ALL-UNNAMED", + "--add-opens=java.desktop/java.awt.font=ALL-UNNAMED", + "--add-opens=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED", + ) } } } diff --git a/packages/image_picker/image_picker_android/android/build.gradle.kts b/packages/image_picker/image_picker_android/android/build.gradle.kts index 4845e413208a..d0786ecc7f98 100644 --- a/packages/image_picker/image_picker_android/android/build.gradle.kts +++ b/packages/image_picker/image_picker_android/android/build.gradle.kts @@ -73,6 +73,22 @@ android { events("passed", "skipped", "failed", "standardOut", "standardError") showStandardStreams = true } + // JDK 17+ blocks reflective access to JDK internals by default. Starting + // with 4.17, Robolectric's test environment setup reflects into + // jdk.internal.access, so these are required. This is the flag set + // recommended by Robolectric, see + // https://robolectric.org/getting-started/#running-with-java-17-and-higher + it.jvmArgs( + "--add-opens=java.base/java.lang=ALL-UNNAMED", + "--add-opens=java.base/java.util=ALL-UNNAMED", + "--add-opens=java.base/java.io=ALL-UNNAMED", + "--add-opens=java.base/java.net=ALL-UNNAMED", + "--add-opens=java.base/java.security=ALL-UNNAMED", + "--add-opens=java.base/java.text=ALL-UNNAMED", + "--add-opens=java.base/jdk.internal.access=ALL-UNNAMED", + "--add-opens=java.desktop/java.awt.font=ALL-UNNAMED", + "--add-opens=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED", + ) } } } diff --git a/packages/in_app_purchase/in_app_purchase_android/android/build.gradle.kts b/packages/in_app_purchase/in_app_purchase_android/android/build.gradle.kts index ec2ccb82cc1d..eec572025dca 100644 --- a/packages/in_app_purchase/in_app_purchase_android/android/build.gradle.kts +++ b/packages/in_app_purchase/in_app_purchase_android/android/build.gradle.kts @@ -66,6 +66,22 @@ android { events("passed", "skipped", "failed", "standardOut", "standardError") showStandardStreams = true } + // JDK 17+ blocks reflective access to JDK internals by default. Starting + // with 4.17, Robolectric's test environment setup reflects into + // jdk.internal.access, so these are required. This is the flag set + // recommended by Robolectric, see + // https://robolectric.org/getting-started/#running-with-java-17-and-higher + it.jvmArgs( + "--add-opens=java.base/java.lang=ALL-UNNAMED", + "--add-opens=java.base/java.util=ALL-UNNAMED", + "--add-opens=java.base/java.io=ALL-UNNAMED", + "--add-opens=java.base/java.net=ALL-UNNAMED", + "--add-opens=java.base/java.security=ALL-UNNAMED", + "--add-opens=java.base/java.text=ALL-UNNAMED", + "--add-opens=java.base/jdk.internal.access=ALL-UNNAMED", + "--add-opens=java.desktop/java.awt.font=ALL-UNNAMED", + "--add-opens=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED", + ) } } } diff --git a/packages/local_auth/local_auth_android/android/build.gradle.kts b/packages/local_auth/local_auth_android/android/build.gradle.kts index 617f141bbf32..97335f91bbc6 100644 --- a/packages/local_auth/local_auth_android/android/build.gradle.kts +++ b/packages/local_auth/local_auth_android/android/build.gradle.kts @@ -61,6 +61,22 @@ android { events("passed", "skipped", "failed", "standardOut", "standardError") showStandardStreams = true } + // JDK 17+ blocks reflective access to JDK internals by default. Starting + // with 4.17, Robolectric's test environment setup reflects into + // jdk.internal.access, so these are required. This is the flag set + // recommended by Robolectric, see + // https://robolectric.org/getting-started/#running-with-java-17-and-higher + it.jvmArgs( + "--add-opens=java.base/java.lang=ALL-UNNAMED", + "--add-opens=java.base/java.util=ALL-UNNAMED", + "--add-opens=java.base/java.io=ALL-UNNAMED", + "--add-opens=java.base/java.net=ALL-UNNAMED", + "--add-opens=java.base/java.security=ALL-UNNAMED", + "--add-opens=java.base/java.text=ALL-UNNAMED", + "--add-opens=java.base/jdk.internal.access=ALL-UNNAMED", + "--add-opens=java.desktop/java.awt.font=ALL-UNNAMED", + "--add-opens=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED", + ) } } } diff --git a/packages/shared_preferences/shared_preferences_android/android/build.gradle.kts b/packages/shared_preferences/shared_preferences_android/android/build.gradle.kts index c943f007fddf..3e87fe81f1f1 100644 --- a/packages/shared_preferences/shared_preferences_android/android/build.gradle.kts +++ b/packages/shared_preferences/shared_preferences_android/android/build.gradle.kts @@ -80,6 +80,22 @@ android { events("passed", "skipped", "failed", "standardOut", "standardError") showStandardStreams = true } + // JDK 17+ blocks reflective access to JDK internals by default. Starting + // with 4.17, Robolectric's test environment setup reflects into + // jdk.internal.access, so these are required. This is the flag set + // recommended by Robolectric, see + // https://robolectric.org/getting-started/#running-with-java-17-and-higher + it.jvmArgs( + "--add-opens=java.base/java.lang=ALL-UNNAMED", + "--add-opens=java.base/java.util=ALL-UNNAMED", + "--add-opens=java.base/java.io=ALL-UNNAMED", + "--add-opens=java.base/java.net=ALL-UNNAMED", + "--add-opens=java.base/java.security=ALL-UNNAMED", + "--add-opens=java.base/java.text=ALL-UNNAMED", + "--add-opens=java.base/jdk.internal.access=ALL-UNNAMED", + "--add-opens=java.desktop/java.awt.font=ALL-UNNAMED", + "--add-opens=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED", + ) } } } diff --git a/packages/url_launcher/url_launcher_android/android/build.gradle.kts b/packages/url_launcher/url_launcher_android/android/build.gradle.kts index b1158c9d304f..d8d478c5c9bc 100644 --- a/packages/url_launcher/url_launcher_android/android/build.gradle.kts +++ b/packages/url_launcher/url_launcher_android/android/build.gradle.kts @@ -65,6 +65,22 @@ android { events("passed", "skipped", "failed", "standardOut", "standardError") showStandardStreams = true } + // JDK 17+ blocks reflective access to JDK internals by default. Starting + // with 4.17, Robolectric's test environment setup reflects into + // jdk.internal.access, so these are required. This is the flag set + // recommended by Robolectric, see + // https://robolectric.org/getting-started/#running-with-java-17-and-higher + it.jvmArgs( + "--add-opens=java.base/java.lang=ALL-UNNAMED", + "--add-opens=java.base/java.util=ALL-UNNAMED", + "--add-opens=java.base/java.io=ALL-UNNAMED", + "--add-opens=java.base/java.net=ALL-UNNAMED", + "--add-opens=java.base/java.security=ALL-UNNAMED", + "--add-opens=java.base/java.text=ALL-UNNAMED", + "--add-opens=java.base/jdk.internal.access=ALL-UNNAMED", + "--add-opens=java.desktop/java.awt.font=ALL-UNNAMED", + "--add-opens=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED", + ) } } } diff --git a/packages/video_player/video_player_android/android/build.gradle.kts b/packages/video_player/video_player_android/android/build.gradle.kts index 78e6afc94c99..3d392e4be195 100644 --- a/packages/video_player/video_player_android/android/build.gradle.kts +++ b/packages/video_player/video_player_android/android/build.gradle.kts @@ -81,6 +81,22 @@ android { // sets the heap size to a size large enough to run the robolectric tests across // multiple SDK levels. it.jvmArgs("-Xmx4G") + // JDK 17+ blocks reflective access to JDK internals by default. Starting + // with 4.17, Robolectric's test environment setup reflects into + // jdk.internal.access, so these are required. This is the flag set + // recommended by Robolectric, see + // https://robolectric.org/getting-started/#running-with-java-17-and-higher + it.jvmArgs( + "--add-opens=java.base/java.lang=ALL-UNNAMED", + "--add-opens=java.base/java.util=ALL-UNNAMED", + "--add-opens=java.base/java.io=ALL-UNNAMED", + "--add-opens=java.base/java.net=ALL-UNNAMED", + "--add-opens=java.base/java.security=ALL-UNNAMED", + "--add-opens=java.base/java.text=ALL-UNNAMED", + "--add-opens=java.base/jdk.internal.access=ALL-UNNAMED", + "--add-opens=java.desktop/java.awt.font=ALL-UNNAMED", + "--add-opens=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED", + ) } } } From f515e04fc73bc7032573052b6923bef0a54dbce9 Mon Sep 17 00:00:00 2001 From: jesswrd Date: Fri, 25 Sep 2026 21:47:34 +0000 Subject: [PATCH 2/4] [various] Update plugin unit tests to Robolectric 4.17 Robolectric 4.17 adds support for Android SDK 37 (API 37), which is needed before plugins can move their compile/target SDK to 37. This depends on the --add-opens JVM arguments added in the previous commit; without them Robolectric 4.17 fails most tests on JDK 17+. video_player_android additionally needs jsr305 on the unit test compile classpath. Robolectric 4.17 added a @javax.annotation.concurrent.GuardedBy annotation to ShadowView (the superclass of ShadowSurfaceView, which PlatformVideoViewTest uses), but doesn't declare a dependency on jsr305, the library that defines it. javac emits a -Xlint:classfile warning when a referenced class carries an annotation it can't resolve, and the example app compiles the plugin with -Xlint:all -Werror, so the test compile fails without it. --- packages/camera/camera_android/android/build.gradle.kts | 2 +- .../camera_android_camerax/android/build.gradle.kts | 2 +- .../file_selector_android/android/build.gradle.kts | 2 +- .../google_maps_flutter_android/android/build.gradle.kts | 2 +- .../image_picker_android/android/build.gradle.kts | 2 +- .../in_app_purchase_android/android/build.gradle.kts | 2 +- .../local_auth_android/android/build.gradle.kts | 2 +- .../shared_preferences_android/android/build.gradle.kts | 2 +- .../url_launcher_android/android/build.gradle.kts | 2 +- .../video_player_android/android/build.gradle.kts | 8 +++++++- 10 files changed, 16 insertions(+), 10 deletions(-) diff --git a/packages/camera/camera_android/android/build.gradle.kts b/packages/camera/camera_android/android/build.gradle.kts index b7a7636b890f..cb2613fdde0e 100644 --- a/packages/camera/camera_android/android/build.gradle.kts +++ b/packages/camera/camera_android/android/build.gradle.kts @@ -92,5 +92,5 @@ dependencies { testImplementation("junit:junit:4.13.2") testImplementation("org.mockito:mockito-core:5.23.0") testImplementation("androidx.test:core:1.7.0") - testImplementation("org.robolectric:robolectric:4.16") + testImplementation("org.robolectric:robolectric:4.17") } diff --git a/packages/camera/camera_android_camerax/android/build.gradle.kts b/packages/camera/camera_android_camerax/android/build.gradle.kts index 1d3f054eccc4..8b3e8d7a5839 100644 --- a/packages/camera/camera_android_camerax/android/build.gradle.kts +++ b/packages/camera/camera_android_camerax/android/build.gradle.kts @@ -102,5 +102,5 @@ dependencies { testImplementation("org.mockito:mockito-core:5.23.0") testImplementation("org.mockito:mockito-inline:5.2.0") testImplementation("androidx.test:core:1.7.0") - testImplementation("org.robolectric:robolectric:4.16") + testImplementation("org.robolectric:robolectric:4.17") } diff --git a/packages/file_selector/file_selector_android/android/build.gradle.kts b/packages/file_selector/file_selector_android/android/build.gradle.kts index a41bc71e2136..be891897d80d 100644 --- a/packages/file_selector/file_selector_android/android/build.gradle.kts +++ b/packages/file_selector/file_selector_android/android/build.gradle.kts @@ -49,7 +49,7 @@ android { testImplementation("junit:junit:4.13.2") testImplementation("org.mockito:mockito-core:5.23.0") testImplementation("androidx.test:core:1.7.0") - testImplementation("org.robolectric:robolectric:4.16") + testImplementation("org.robolectric:robolectric:4.17") } lint { diff --git a/packages/google_maps_flutter/google_maps_flutter_android/android/build.gradle.kts b/packages/google_maps_flutter/google_maps_flutter_android/android/build.gradle.kts index 48a8f134b686..fe6aabcfd7cc 100644 --- a/packages/google_maps_flutter/google_maps_flutter_android/android/build.gradle.kts +++ b/packages/google_maps_flutter/google_maps_flutter_android/android/build.gradle.kts @@ -56,7 +56,7 @@ android { testImplementation("junit:junit:4.13.2") testImplementation("org.mockito:mockito-core:5.23.0") testImplementation("androidx.test:core:1.7.0") - testImplementation("org.robolectric:robolectric:4.16") + testImplementation("org.robolectric:robolectric:4.17") } compileOptions { diff --git a/packages/image_picker/image_picker_android/android/build.gradle.kts b/packages/image_picker/image_picker_android/android/build.gradle.kts index d0786ecc7f98..b06f0e73bc95 100644 --- a/packages/image_picker/image_picker_android/android/build.gradle.kts +++ b/packages/image_picker/image_picker_android/android/build.gradle.kts @@ -55,7 +55,7 @@ android { testImplementation("junit:junit:4.13.2") testImplementation("org.mockito:mockito-core:5.23.0") testImplementation("androidx.test:core:1.7.0") - testImplementation("org.robolectric:robolectric:4.16") + testImplementation("org.robolectric:robolectric:4.17") } compileOptions { diff --git a/packages/in_app_purchase/in_app_purchase_android/android/build.gradle.kts b/packages/in_app_purchase/in_app_purchase_android/android/build.gradle.kts index eec572025dca..e9259bed39f4 100644 --- a/packages/in_app_purchase/in_app_purchase_android/android/build.gradle.kts +++ b/packages/in_app_purchase/in_app_purchase_android/android/build.gradle.kts @@ -94,7 +94,7 @@ dependencies { testImplementation("org.json:json:20251224") testImplementation("org.mockito:mockito-core:5.23.0") testImplementation("androidx.test:core:1.7.0") - testImplementation("org.robolectric:robolectric:4.16") + testImplementation("org.robolectric:robolectric:4.17") androidTestImplementation("androidx.test:runner:1.7.0") androidTestImplementation("androidx.test.espresso:espresso-core:3.7.0") } diff --git a/packages/local_auth/local_auth_android/android/build.gradle.kts b/packages/local_auth/local_auth_android/android/build.gradle.kts index 97335f91bbc6..5a50e287379a 100644 --- a/packages/local_auth/local_auth_android/android/build.gradle.kts +++ b/packages/local_auth/local_auth_android/android/build.gradle.kts @@ -89,7 +89,7 @@ dependencies { testImplementation("junit:junit:4.13.2") testImplementation("org.mockito:mockito-core:5.23.0") testImplementation("org.mockito.kotlin:mockito-kotlin:6.3.0") - testImplementation("org.robolectric:robolectric:4.16") + testImplementation("org.robolectric:robolectric:4.17") androidTestImplementation("androidx.test:runner:1.7.0") androidTestImplementation("androidx.test:rules:1.7.0") androidTestImplementation("androidx.test.espresso:espresso-core:3.7.0") diff --git a/packages/shared_preferences/shared_preferences_android/android/build.gradle.kts b/packages/shared_preferences/shared_preferences_android/android/build.gradle.kts index 3e87fe81f1f1..c47b3f5dfd31 100644 --- a/packages/shared_preferences/shared_preferences_android/android/build.gradle.kts +++ b/packages/shared_preferences/shared_preferences_android/android/build.gradle.kts @@ -65,7 +65,7 @@ android { testImplementation("junit:junit:4.13.2") testImplementation("androidx.test:core-ktx:1.7.0") testImplementation("androidx.test.ext:junit-ktx:1.3.0") - testImplementation("org.robolectric:robolectric:4.16") + testImplementation("org.robolectric:robolectric:4.17") testImplementation("org.mockito:mockito-inline:5.2.0") testImplementation("io.mockk:mockk:1.14.11") } diff --git a/packages/url_launcher/url_launcher_android/android/build.gradle.kts b/packages/url_launcher/url_launcher_android/android/build.gradle.kts index d8d478c5c9bc..1860130e5b33 100644 --- a/packages/url_launcher/url_launcher_android/android/build.gradle.kts +++ b/packages/url_launcher/url_launcher_android/android/build.gradle.kts @@ -94,5 +94,5 @@ dependencies { testImplementation("junit:junit:4.13.2") testImplementation("org.mockito:mockito-core:5.23.0") testImplementation("androidx.test:core:1.7.0") - testImplementation("org.robolectric:robolectric:4.16") + testImplementation("org.robolectric:robolectric:4.17") } diff --git a/packages/video_player/video_player_android/android/build.gradle.kts b/packages/video_player/video_player_android/android/build.gradle.kts index 3d392e4be195..4d1fea1c8e07 100644 --- a/packages/video_player/video_player_android/android/build.gradle.kts +++ b/packages/video_player/video_player_android/android/build.gradle.kts @@ -62,7 +62,13 @@ android { testImplementation("junit:junit:4.13.2") testImplementation("androidx.test:core:1.7.0") testImplementation("org.mockito:mockito-core:5.23.0") - testImplementation("org.robolectric:robolectric:4.16") + testImplementation("org.robolectric:robolectric:4.17") + // Robolectric 4.17 added a JSR 305 @GuardedBy annotation to ShadowView (the + // superclass of ShadowSurfaceView, used by PlatformVideoViewTest) without + // declaring a dependency on jsr305. javac warns when a referenced class has an + // annotation it can't resolve, and the example app compiles this project with + // -Xlint:all -Werror, so the test compile fails without jsr305. + testImplementation("com.google.code.findbugs:jsr305:3.0.2") testImplementation("androidx.media3:media3-test-utils:${exoplayerVersion}") } From 7a1858671c52b3ab0dc8b7c897f86e0a66b72868 Mon Sep 17 00:00:00 2001 From: jesswrd Date: Fri, 25 Sep 2026 21:48:12 +0000 Subject: [PATCH 3/4] [video_player] Update example apps to Robolectric 4.17 Keeps the example apps' Robolectric version in sync with the plugins. The video_player_android example app has its own unit tests, so it also gets Robolectric's recommended --add-opens JVM arguments, which 4.17 requires on JDK 17+. --- .../example/android/app/build.gradle.kts | 2 +- .../example/android/app/build.gradle.kts | 24 ++++++++++++++++++- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/packages/video_player/video_player/example/android/app/build.gradle.kts b/packages/video_player/video_player/example/android/app/build.gradle.kts index 313b1b88a9ee..a09deca9715f 100644 --- a/packages/video_player/video_player/example/android/app/build.gradle.kts +++ b/packages/video_player/video_player/example/android/app/build.gradle.kts @@ -43,7 +43,7 @@ flutter { dependencies { testImplementation("junit:junit:4.13.2") - testImplementation("org.robolectric:robolectric:4.16") + testImplementation("org.robolectric:robolectric:4.17") testImplementation("org.mockito:mockito-core:5.0.0") androidTestImplementation("androidx.test:runner:1.1.1") androidTestImplementation("androidx.test.espresso:espresso-core:3.1.1") diff --git a/packages/video_player/video_player_android/example/android/app/build.gradle.kts b/packages/video_player/video_player_android/example/android/app/build.gradle.kts index b918d6adf397..ac26f1928a98 100644 --- a/packages/video_player/video_player_android/example/android/app/build.gradle.kts +++ b/packages/video_player/video_player_android/example/android/app/build.gradle.kts @@ -26,6 +26,28 @@ android { signingConfig = signingConfigs.getByName("debug") } } + testOptions { + unitTests { + all { + // JDK 17+ blocks reflective access to JDK internals by default. Starting + // with 4.17, Robolectric's test environment setup reflects into + // jdk.internal.access, so these are required. This is the flag set + // recommended by Robolectric, see + // https://robolectric.org/getting-started/#running-with-java-17-and-higher + it.jvmArgs( + "--add-opens=java.base/java.lang=ALL-UNNAMED", + "--add-opens=java.base/java.util=ALL-UNNAMED", + "--add-opens=java.base/java.io=ALL-UNNAMED", + "--add-opens=java.base/java.net=ALL-UNNAMED", + "--add-opens=java.base/java.security=ALL-UNNAMED", + "--add-opens=java.base/java.text=ALL-UNNAMED", + "--add-opens=java.base/jdk.internal.access=ALL-UNNAMED", + "--add-opens=java.desktop/java.awt.font=ALL-UNNAMED", + "--add-opens=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED", + ) + } + } + } lint { disable.add("InvalidPackage") } @@ -45,7 +67,7 @@ dependencies { testImplementation("androidx.test.ext:junit:1.2.1") testImplementation("com.google.truth:truth:1.1.3") testImplementation("junit:junit:4.13") - testImplementation("org.robolectric:robolectric:4.16") + testImplementation("org.robolectric:robolectric:4.17") testImplementation("org.mockito:mockito-core:5.17.0") androidTestImplementation("androidx.test:runner:1.1.1") androidTestImplementation("androidx.test.espresso:espresso-core:3.1.1") From 5fe1208416bcd0ce86cf5462f7bee0c8edec7a0e Mon Sep 17 00:00:00 2001 From: jesswrd Date: Fri, 25 Sep 2026 22:42:16 +0000 Subject: [PATCH 4/4] [various] Update CHANGELOGs and versions for Robolectric 4.17 Generated with: dart run script/tool/bin/flutter_plugin_tools.dart update-release-info \ --version=minimal --base-branch= \ --changelog="Updates Robolectric to 4.17 and adds the JVM arguments it requires for unit tests." The video_player entry (example-app-only change, NEXT section) was reworded by hand since that example gets no new JVM arguments. --- packages/camera/camera_android/CHANGELOG.md | 4 ++++ packages/camera/camera_android/pubspec.yaml | 2 +- packages/camera/camera_android_camerax/CHANGELOG.md | 4 ++++ packages/camera/camera_android_camerax/pubspec.yaml | 2 +- packages/file_selector/file_selector_android/CHANGELOG.md | 3 ++- packages/file_selector/file_selector_android/pubspec.yaml | 2 +- .../google_maps_flutter_android/CHANGELOG.md | 4 ++++ .../google_maps_flutter_android/pubspec.yaml | 2 +- packages/image_picker/image_picker_android/CHANGELOG.md | 3 ++- packages/image_picker/image_picker_android/pubspec.yaml | 2 +- packages/in_app_purchase/in_app_purchase_android/CHANGELOG.md | 3 ++- packages/in_app_purchase/in_app_purchase_android/pubspec.yaml | 2 +- packages/local_auth/local_auth_android/CHANGELOG.md | 3 ++- packages/local_auth/local_auth_android/pubspec.yaml | 2 +- .../shared_preferences_android/CHANGELOG.md | 3 ++- .../shared_preferences_android/pubspec.yaml | 2 +- packages/url_launcher/url_launcher_android/CHANGELOG.md | 3 ++- packages/url_launcher/url_launcher_android/pubspec.yaml | 2 +- packages/video_player/video_player/CHANGELOG.md | 1 + packages/video_player/video_player_android/CHANGELOG.md | 3 ++- packages/video_player/video_player_android/pubspec.yaml | 2 +- 21 files changed, 37 insertions(+), 17 deletions(-) diff --git a/packages/camera/camera_android/CHANGELOG.md b/packages/camera/camera_android/CHANGELOG.md index a3508826254d..7b3f6e1bd127 100644 --- a/packages/camera/camera_android/CHANGELOG.md +++ b/packages/camera/camera_android/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.10.12+1 + +* Updates Robolectric to 4.17 and adds the JVM arguments it requires for unit tests. + ## 0.10.12 * Adds support for custom video output path in video recording. diff --git a/packages/camera/camera_android/pubspec.yaml b/packages/camera/camera_android/pubspec.yaml index eee55dccbabe..6455ed0ec716 100644 --- a/packages/camera/camera_android/pubspec.yaml +++ b/packages/camera/camera_android/pubspec.yaml @@ -3,7 +3,7 @@ description: Android implementation of the camera plugin. repository: https://github.com/flutter/packages/tree/main/packages/camera/camera_android issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22 -version: 0.10.12 +version: 0.10.12+1 environment: sdk: ^3.11.0 diff --git a/packages/camera/camera_android_camerax/CHANGELOG.md b/packages/camera/camera_android_camerax/CHANGELOG.md index 9e8fa13ac644..963f3582262d 100644 --- a/packages/camera/camera_android_camerax/CHANGELOG.md +++ b/packages/camera/camera_android_camerax/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.7.5+1 + +* Updates Robolectric to 4.17 and adds the JVM arguments it requires for unit tests. + ## 0.7.5 * Adds support for custom video output path in video recording. diff --git a/packages/camera/camera_android_camerax/pubspec.yaml b/packages/camera/camera_android_camerax/pubspec.yaml index 14355426e186..e44581040423 100644 --- a/packages/camera/camera_android_camerax/pubspec.yaml +++ b/packages/camera/camera_android_camerax/pubspec.yaml @@ -2,7 +2,7 @@ name: camera_android_camerax description: Android implementation of the camera plugin using the CameraX library. repository: https://github.com/flutter/packages/tree/main/packages/camera/camera_android_camerax issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22 -version: 0.7.5 +version: 0.7.5+1 environment: sdk: ^3.12.0 diff --git a/packages/file_selector/file_selector_android/CHANGELOG.md b/packages/file_selector/file_selector_android/CHANGELOG.md index 2604afdafaeb..002455e7520d 100644 --- a/packages/file_selector/file_selector_android/CHANGELOG.md +++ b/packages/file_selector/file_selector_android/CHANGELOG.md @@ -1,5 +1,6 @@ -## NEXT +## 0.5.2+12 +* Updates Robolectric to 4.17 and adds the JVM arguments it requires for unit tests. * Updates minimum supported SDK version to Flutter 3.41/Dart 3.11. ## 0.5.2+11 diff --git a/packages/file_selector/file_selector_android/pubspec.yaml b/packages/file_selector/file_selector_android/pubspec.yaml index 009bffc61a8a..eefb45954ce2 100644 --- a/packages/file_selector/file_selector_android/pubspec.yaml +++ b/packages/file_selector/file_selector_android/pubspec.yaml @@ -2,7 +2,7 @@ name: file_selector_android description: Android implementation of the file_selector package. repository: https://github.com/flutter/packages/tree/main/packages/file_selector/file_selector_android issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+file_selector%22 -version: 0.5.2+11 +version: 0.5.2+12 environment: sdk: ^3.12.0 diff --git a/packages/google_maps_flutter/google_maps_flutter_android/CHANGELOG.md b/packages/google_maps_flutter/google_maps_flutter_android/CHANGELOG.md index b12bfe1b6aad..aaab1b345450 100644 --- a/packages/google_maps_flutter/google_maps_flutter_android/CHANGELOG.md +++ b/packages/google_maps_flutter/google_maps_flutter_android/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.20.1 + +* Updates Robolectric to 4.17 and adds the JVM arguments it requires for unit tests. + ## 2.20.0 * Adds support for tapping points of interest on the map. diff --git a/packages/google_maps_flutter/google_maps_flutter_android/pubspec.yaml b/packages/google_maps_flutter/google_maps_flutter_android/pubspec.yaml index ed87d07f165e..89b9919f60e9 100644 --- a/packages/google_maps_flutter/google_maps_flutter_android/pubspec.yaml +++ b/packages/google_maps_flutter/google_maps_flutter_android/pubspec.yaml @@ -2,7 +2,7 @@ name: google_maps_flutter_android description: Android implementation of the google_maps_flutter plugin. repository: https://github.com/flutter/packages/tree/main/packages/google_maps_flutter/google_maps_flutter_android issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+maps%22 -version: 2.20.0 +version: 2.20.1 environment: sdk: ^3.12.0 diff --git a/packages/image_picker/image_picker_android/CHANGELOG.md b/packages/image_picker/image_picker_android/CHANGELOG.md index 04c68c76589c..74093ffe050a 100644 --- a/packages/image_picker/image_picker_android/CHANGELOG.md +++ b/packages/image_picker/image_picker_android/CHANGELOG.md @@ -1,5 +1,6 @@ -## NEXT +## 0.8.13+24 +* Updates Robolectric to 4.17 and adds the JVM arguments it requires for unit tests. * Updates minimum supported SDK version to Flutter 3.41/Dart 3.11. ## 0.8.13+23 diff --git a/packages/image_picker/image_picker_android/pubspec.yaml b/packages/image_picker/image_picker_android/pubspec.yaml index 380ac81c23fd..115814d66318 100755 --- a/packages/image_picker/image_picker_android/pubspec.yaml +++ b/packages/image_picker/image_picker_android/pubspec.yaml @@ -2,7 +2,7 @@ name: image_picker_android description: Android implementation of the image_picker plugin. repository: https://github.com/flutter/packages/tree/main/packages/image_picker/image_picker_android issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+image_picker%22 -version: 0.8.13+23 +version: 0.8.13+24 environment: sdk: ^3.12.0 diff --git a/packages/in_app_purchase/in_app_purchase_android/CHANGELOG.md b/packages/in_app_purchase/in_app_purchase_android/CHANGELOG.md index 9bc8e603fd48..4b45d163b03b 100644 --- a/packages/in_app_purchase/in_app_purchase_android/CHANGELOG.md +++ b/packages/in_app_purchase/in_app_purchase_android/CHANGELOG.md @@ -1,5 +1,6 @@ -## NEXT +## 0.5.3+1 +* Updates Robolectric to 4.17 and adds the JVM arguments it requires for unit tests. * Updates minimum supported SDK version to Flutter 3.41/Dart 3.11. ## 0.5.3 diff --git a/packages/in_app_purchase/in_app_purchase_android/pubspec.yaml b/packages/in_app_purchase/in_app_purchase_android/pubspec.yaml index fe84c46eb993..33d30afe49f4 100644 --- a/packages/in_app_purchase/in_app_purchase_android/pubspec.yaml +++ b/packages/in_app_purchase/in_app_purchase_android/pubspec.yaml @@ -3,7 +3,7 @@ description: An implementation for the Android platform of the Flutter `in_app_p repository: https://github.com/flutter/packages/tree/main/packages/in_app_purchase/in_app_purchase_android issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+in_app_purchase%22 -version: 0.5.3 +version: 0.5.3+1 environment: sdk: ^3.12.0 diff --git a/packages/local_auth/local_auth_android/CHANGELOG.md b/packages/local_auth/local_auth_android/CHANGELOG.md index 7128549659f6..f0804744f212 100644 --- a/packages/local_auth/local_auth_android/CHANGELOG.md +++ b/packages/local_auth/local_auth_android/CHANGELOG.md @@ -1,5 +1,6 @@ -## NEXT +## 2.2.1 +* Updates Robolectric to 4.17 and adds the JVM arguments it requires for unit tests. * Updates minimum supported SDK version to Flutter 3.41/Dart 3.11. ## 2.2.0 diff --git a/packages/local_auth/local_auth_android/pubspec.yaml b/packages/local_auth/local_auth_android/pubspec.yaml index ea94e27a97da..d387bdd83760 100644 --- a/packages/local_auth/local_auth_android/pubspec.yaml +++ b/packages/local_auth/local_auth_android/pubspec.yaml @@ -2,7 +2,7 @@ name: local_auth_android description: Android implementation of the local_auth plugin. repository: https://github.com/flutter/packages/tree/main/packages/local_auth/local_auth_android issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+local_auth%22 -version: 2.2.0 +version: 2.2.1 environment: sdk: ^3.12.0 diff --git a/packages/shared_preferences/shared_preferences_android/CHANGELOG.md b/packages/shared_preferences/shared_preferences_android/CHANGELOG.md index 043403b2551f..27c9245d8ad2 100644 --- a/packages/shared_preferences/shared_preferences_android/CHANGELOG.md +++ b/packages/shared_preferences/shared_preferences_android/CHANGELOG.md @@ -1,5 +1,6 @@ -## NEXT +## 2.4.29 +* Updates Robolectric to 4.17 and adds the JVM arguments it requires for unit tests. * Updates minimum supported SDK version to Flutter 3.41/Dart 3.11. ## 2.4.28 diff --git a/packages/shared_preferences/shared_preferences_android/pubspec.yaml b/packages/shared_preferences/shared_preferences_android/pubspec.yaml index 36f60994a664..10f21e6620f3 100644 --- a/packages/shared_preferences/shared_preferences_android/pubspec.yaml +++ b/packages/shared_preferences/shared_preferences_android/pubspec.yaml @@ -2,7 +2,7 @@ name: shared_preferences_android description: Android implementation of the shared_preferences plugin repository: https://github.com/flutter/packages/tree/main/packages/shared_preferences/shared_preferences_android issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+shared_preferences%22 -version: 2.4.28 +version: 2.4.29 environment: sdk: ^3.12.0 diff --git a/packages/url_launcher/url_launcher_android/CHANGELOG.md b/packages/url_launcher/url_launcher_android/CHANGELOG.md index 21504d18d7ff..5ec0c2ff3a55 100644 --- a/packages/url_launcher/url_launcher_android/CHANGELOG.md +++ b/packages/url_launcher/url_launcher_android/CHANGELOG.md @@ -1,5 +1,6 @@ -## NEXT +## 6.3.34 +* Updates Robolectric to 4.17 and adds the JVM arguments it requires for unit tests. * Updates minimum supported SDK version to Flutter 3.41/Dart 3.11. ## 6.3.33 diff --git a/packages/url_launcher/url_launcher_android/pubspec.yaml b/packages/url_launcher/url_launcher_android/pubspec.yaml index 9fdb3f5c3f9f..5b66f236914d 100644 --- a/packages/url_launcher/url_launcher_android/pubspec.yaml +++ b/packages/url_launcher/url_launcher_android/pubspec.yaml @@ -2,7 +2,7 @@ name: url_launcher_android description: Android implementation of the url_launcher plugin. repository: https://github.com/flutter/packages/tree/main/packages/url_launcher/url_launcher_android issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+url_launcher%22 -version: 6.3.33 +version: 6.3.34 environment: sdk: ^3.12.0 diff --git a/packages/video_player/video_player/CHANGELOG.md b/packages/video_player/video_player/CHANGELOG.md index 8e5acaa35ef4..774ec219157e 100644 --- a/packages/video_player/video_player/CHANGELOG.md +++ b/packages/video_player/video_player/CHANGELOG.md @@ -1,5 +1,6 @@ ## NEXT +* Updates the example app to Robolectric 4.17. * Updates minimum supported SDK version to Flutter 3.41/Dart 3.11. ## 2.14.0 diff --git a/packages/video_player/video_player_android/CHANGELOG.md b/packages/video_player/video_player_android/CHANGELOG.md index 939eb3b3f12b..77443c5fc202 100644 --- a/packages/video_player/video_player_android/CHANGELOG.md +++ b/packages/video_player/video_player_android/CHANGELOG.md @@ -1,5 +1,6 @@ -## NEXT +## 2.12.3 +* Updates Robolectric to 4.17 and adds the JVM arguments it requires for unit tests. * Updates minimum supported SDK version to Flutter 3.41/Dart 3.11. ## 2.12.2 diff --git a/packages/video_player/video_player_android/pubspec.yaml b/packages/video_player/video_player_android/pubspec.yaml index fb3fca6317ac..a2b7f4b9f3db 100644 --- a/packages/video_player/video_player_android/pubspec.yaml +++ b/packages/video_player/video_player_android/pubspec.yaml @@ -2,7 +2,7 @@ name: video_player_android description: Android implementation of the video_player plugin. repository: https://github.com/flutter/packages/tree/main/packages/video_player/video_player_android issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+video_player%22 -version: 2.12.2 +version: 2.12.3 environment: sdk: ^3.12.0