Android 12l 中的 Flutter 崩溃并显示“无接口方法 addWindowLayoutInfoListener”

Kla*_*vas 18 android flutter

我必须将一个用 flutter 编写的项目升级到compileSdkVersion 33\n自从我升级后,该应用程序至少在模拟器中崩溃了。\n一个新的 flutter 项目与compileSdkVersion 33没有问题,但我找不到 gradle.build 文件或中的差异安卓清单。

\n

有任何想法吗?

\n

颤动版本:

\n
    Doctor summary (to see all details, run flutter doctor -v):\n[\xe2\x9c\x93] Flutter (Channel stable, 3.3.5, on macOS 12.6 21G115 darwin-arm, locale de-DE)\n[\xe2\x9c\x93] Android toolchain - develop for Android devices (Android SDK version 32.1.0-rc1)\n[\xe2\x9c\x93] Xcode - develop for iOS and macOS (Xcode 14.0.1)\n[\xe2\x9c\x93] Chrome - develop for the web\n[\xe2\x9c\x93] Android Studio (version 2021.3)\n[\xe2\x9c\x93] IntelliJ IDEA Ultimate Edition (version 2022.2.2)\n[\xe2\x9c\x93] VS Code (version 1.72.2)\n[\xe2\x9c\x93] Connected device (3 available)\n[\xe2\x9c\x93] HTTP Host Availability\n
Run Code Online (Sandbox Code Playgroud)\n

错误:

\n
D/FlutterLocationService(13862): Binding to location service.\nE/AndroidRuntime(13862): FATAL EXCEPTION: main\nE/AndroidRuntime(13862): Process: de.roegmbh.checkit, PID: 13862\nE/AndroidRuntime(13862): java.lang.NoSuchMethodError: No interface method addWindowLayoutInfoListener(Landroid/app/Activity;Lj$/util/function/Consumer;)V in class Landroidx/window/extensions/layout/WindowLayoutComponent; or its super classes (declaration of 'androidx.window.extensions.layout.WindowLayoutComponent' appears in /system_ext/framework/androidx.window.extensions.jar)\nE/AndroidRuntime(13862):    at androidx.window.layout.ExtensionWindowLayoutInfoBackend.registerLayoutChangeCallback(ExtensionWindowLayoutInfoBackend.kt:68)\nE/AndroidRuntime(13862):    at androidx.window.layout.WindowInfoTrackerImpl$windowLayoutInfo$1.invokeSuspend(WindowInfoTrackerImpl.kt:52)\nE/AndroidRuntime(13862):    at androidx.window.layout.WindowInfoTrackerImpl$windowLayoutInfo$1.invoke(Unknown Source:8)\nE/AndroidRuntime(13862):    at androidx.window.layout.WindowInfoTrackerImpl$windowLayoutInfo$1.invoke(Unknown Source:4)\nE/AndroidRuntime(13862):    at kotlinx.coroutines.flow.SafeFlow.collectSafely(Builders.kt:61)\nE/AndroidRuntime(13862):    at kotlinx.coroutines.flow.AbstractFlow.collect(Flow.kt:212)\nE/AndroidRuntime(13862):    at androidx.window.java.layout.WindowInfoTrackerCallbackAdapter$addListener$1$1.invokeSuspend(WindowInfoTrackerCallbackAdapter.kt:96)\nE/AndroidRuntime(13862):    at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)\nE/AndroidRuntime(13862):    at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)\nE/AndroidRuntime(13862):    at android.os.Handler.handleCallback(Handler.java:942)\nE/AndroidRuntime(13862):    at android.os.Handler.dispatchMessage(Handler.java:99)\nE/AndroidRuntime(13862):    at android.os.Looper.loopOnce(Looper.java:201)\nE/AndroidRuntime(13862):    at android.os.Looper.loop(Looper.java:288)\nE/AndroidRuntime(13862):    at android.app.ActivityThread.main(ActivityThread.java:7898)\nE/AndroidRuntime(13862):    at java.lang.reflect.Method.invoke(Native Method)\nE/AndroidRuntime(13862):    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)\nE/AndroidRuntime(13862):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)\n
Run Code Online (Sandbox Code Playgroud)\n

小智 52

尝试在 android/app/build.gradle 文件中添加以下依赖项:

implementation 'androidx.window:window:1.0.0'
implementation 'androidx.window:window-java:1.0.0'
Run Code Online (Sandbox Code Playgroud)

这是在 Groovy 中。如果您使用的是 Kotlin,请使用适当的语法添加这些依赖项。


当我添加flutter_local_notifications包所需的脱糖时,我遇到了这个问题。我正在运行具有以下配置的 Android 模拟器(android/app/build.gradle):

minSdkVersion 22
compileSdkVersion 33
targetSdkVersion 33
Run Code Online (Sandbox Code Playgroud)

我的gradle版本是7.5.1,我的android gradle插件版本是7.3.1。因此,我使用 desugar_jdk_libs 版本 1.2.2 来支持 targetSdkVersion 33

coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.2.2'
Run Code Online (Sandbox Code Playgroud)

minSdkVersion 为 22,因此默认启用multidex 。

  • 如果我知道你住在哪里,我就会送你一个蛋糕 (5认同)

小智 13

根本原因:

FlutterView#onAttachedToWindow使用androidx.windowWindowInfoTracker api获取设备信息

一旦电话系统包含/system_ext/framework/androidx.window.extensions.jar 就会呼叫WindowLayoutComponent.addWindowLayoutInfoListener(Landroid/app/Activity;Ljava/util/function/Consumer;)V

如果APP启用java 8+ api desuagr,

会将 java 8+ api 包从 jave 转换为 j$ 从 java/util/function/Consumer 到j$/util/function/Consumer

在应用程序代码中,将调用 WindowLayoutComponent.addWindowLayoutInfoListener(Landroid/app/Activity; Lj$/util/function/Consumer;)V

但在 /system_ext/framework/androidx.window.extensions.jar 中 api 是 WindowLayoutComponent.addWindowLayoutInfoListener(Landroid/app/Activity; Ljava/util/function/Consumer;)V

所以会抛出java.lang.NoSuchMethodError

解决方案:

androix.window 已修复此问题 https://cs.android.com/androidx/platform/frameworks/support/+/d9a44f767d5d821200bcf9f0093c413a258c5351 https://cs.android.com/androidx/platform/frameworks/support/+/d9a44f767d5d821200bcf9f0093c413a 258c5351:窗口/窗口/src/main/java/androidx/window/layout/ExtensionWindowLayoutInfoBackend.kt;dlc=0a3d4b6fd89bc54e78ddab5a941972ee6546be2e

因此更改 androidx.window:window 版本即可1.1.0-alpha04解决此问题