Flutter 本地通知导致崩溃,仅在 APK 版本中

Luc*_*ira 11 android flutter

我在 1.9 更新之前让这个应用程序运行,然后必须通过将 gradle 版本从 3.2.1 切换到 3.3.1 来解决构建失败

从那时起,对本地通知插件的任何非配置调用都会遇到此堆栈跟踪:

E/flutter (22738): [ERROR:flutter/shell/platform/android/platform_view_android_jni.cc(39)] java.lang.AssertionError: java.lang.NoSuchFieldException: Drawable
E/flutter (22738):      at c.a.a.b.a.ja$a.<init>(:12)
E/flutter (22738):      at c.a.a.b.a.V.a(:5)
E/flutter (22738):      at c.a.a.p.a(:18)
E/flutter (22738):      at c.a.a.b.a.p.a(:21)
E/flutter (22738):      at c.a.a.b.a.p.a(:37)
E/flutter (22738):      at c.a.a.b.a.p.a(:17)
E/flutter (22738):      at c.a.a.p.a(:18)
E/flutter (22738):      at c.a.a.b.a.c.a(:5)
E/flutter (22738):      at c.a.a.p.a(:18)
E/flutter (22738):      at c.a.a.p.a(:96)
E/flutter (22738):      at c.a.a.p.a(:86)
E/flutter (22738):      at c.a.a.p.a(:84)
E/flutter (22738):      at com.dexterous.flutterlocalnotifications.d.e(:7)
E/flutter (22738):      at com.dexterous.flutterlocalnotifications.d.a(:49)
E/flutter (22738):      at com.dexterous.flutterlocalnotifications.d.a(:157)
E/flutter (22738):      at com.dexterous.flutterlocalnotifications.d.b(:40)
E/flutter (22738):      at com.dexterous.flutterlocalnotifications.d.a(:132)
E/flutter (22738):      at d.a.b.a.m$a.a(:2)
E/flutter (22738):      at io.flutter.embedding.engine.a.c.a(:14)
E/flutter (22738):      at io.flutter.embedding.engine.FlutterJNI.handlePlatformMessage(:2)
E/flutter (22738):      at android.os.MessageQueue.nativePollOnce(Native Method)
E/flutter (22738):      at android.os.MessageQueue.next(MessageQueue.java:326)
E/flutter (22738):      at android.os.Looper.loop(Looper.java:160)
E/flutter (22738):      at android.app.ActivityThread.main(ActivityThread.java:6762)
E/flutter (22738):      at java.lang.reflect.Method.invoke(Native Method)
E/flutter (22738):      at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
E/flutter (22738):      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
E/flutter (22738): Caused by: java.lang.NoSuchFieldException: Drawable
E/flutter (22738):      at java.lang.Class.getField(Class.java:1601)
E/flutter (22738):      at c.a.a.b.a.ja$a.<init>(:6)
E/flutter (22738):      ... 26 more
E/flutter (22738): 
F/flutter (22738): [FATAL:flutter/shell/platform/android/platform_view_android_jni.cc(76)] Check failed: CheckException(env). 
Run Code Online (Sandbox Code Playgroud)

我没有对正在运行的版本中的代码进行任何更改。用于配置插件的代码在 init 上运行如下

E/flutter (22738): [ERROR:flutter/shell/platform/android/platform_view_android_jni.cc(39)] java.lang.AssertionError: java.lang.NoSuchFieldException: Drawable
E/flutter (22738):      at c.a.a.b.a.ja$a.<init>(:12)
E/flutter (22738):      at c.a.a.b.a.V.a(:5)
E/flutter (22738):      at c.a.a.p.a(:18)
E/flutter (22738):      at c.a.a.b.a.p.a(:21)
E/flutter (22738):      at c.a.a.b.a.p.a(:37)
E/flutter (22738):      at c.a.a.b.a.p.a(:17)
E/flutter (22738):      at c.a.a.p.a(:18)
E/flutter (22738):      at c.a.a.b.a.c.a(:5)
E/flutter (22738):      at c.a.a.p.a(:18)
E/flutter (22738):      at c.a.a.p.a(:96)
E/flutter (22738):      at c.a.a.p.a(:86)
E/flutter (22738):      at c.a.a.p.a(:84)
E/flutter (22738):      at com.dexterous.flutterlocalnotifications.d.e(:7)
E/flutter (22738):      at com.dexterous.flutterlocalnotifications.d.a(:49)
E/flutter (22738):      at com.dexterous.flutterlocalnotifications.d.a(:157)
E/flutter (22738):      at com.dexterous.flutterlocalnotifications.d.b(:40)
E/flutter (22738):      at com.dexterous.flutterlocalnotifications.d.a(:132)
E/flutter (22738):      at d.a.b.a.m$a.a(:2)
E/flutter (22738):      at io.flutter.embedding.engine.a.c.a(:14)
E/flutter (22738):      at io.flutter.embedding.engine.FlutterJNI.handlePlatformMessage(:2)
E/flutter (22738):      at android.os.MessageQueue.nativePollOnce(Native Method)
E/flutter (22738):      at android.os.MessageQueue.next(MessageQueue.java:326)
E/flutter (22738):      at android.os.Looper.loop(Looper.java:160)
E/flutter (22738):      at android.app.ActivityThread.main(ActivityThread.java:6762)
E/flutter (22738):      at java.lang.reflect.Method.invoke(Native Method)
E/flutter (22738):      at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
E/flutter (22738):      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
E/flutter (22738): Caused by: java.lang.NoSuchFieldException: Drawable
E/flutter (22738):      at java.lang.Class.getField(Class.java:1601)
E/flutter (22738):      at c.a.a.b.a.ja$a.<init>(:6)
E/flutter (22738):      ... 26 more
E/flutter (22738): 
F/flutter (22738): [FATAL:flutter/shell/platform/android/platform_view_android_jni.cc(76)] Check failed: CheckException(env). 
Run Code Online (Sandbox Code Playgroud)

对插件的调用是这样进行的:

  void inicializarPluginNotificacoes() {
    flutterLocalNotificationsPlugin = new FlutterLocalNotificationsPlugin();
    var initializationSettingsAndroid = new AndroidInitializationSettings('@drawable/app_icon24');
    var initializationSettings = new InitializationSettings(initializationSettingsAndroid, null);
    flutterLocalNotificationsPlugin.initialize(initializationSettings, onSelectNotification: onSelectNotification);
  }
Run Code Online (Sandbox Code Playgroud)

现在,有趣的是,只有在安装了 apk 之后才会发生崩溃。在带有 flutter run 或 debug run 的开发版本中,崩溃不会发生。

我尝试过的事情: - 由于消息提到可绘制,因此检查图标。如果找不到图标,配置甚至不会运行。

  • 在调用周围使用 try/catch 捕获异常:异常直接通过

  • 检查通知权限,一切都很好,正如我所提到的,代码在更新之前工作

  • 呼叫是用正确时间(小时和分钟)进行的,即使它们不是取消呼叫仍然会使应用程序崩溃

  • 检查对没有预定通知的 id 的取消调用是否会崩溃,它没有在更新之前工作的版本上

  • 添加重要性,优先级并更改频道名称和 ID,没有用,此时变得绝望

我觉得我缺少一些资源,有没有办法更全面地了解崩溃?

Joa*_*oao 35

我遇到了同样的问题,这让我发疯。它只发生在发布版本上,似乎与 AndroidInitializationSettings('app_icon')

Android 集成的flutter_local_notifications文档部分说要添加

-keep class com.dexterous.** { *; }
Run Code Online (Sandbox Code Playgroud)

到 /android/app/proguard-rules.pro

  • 为我工作!我想我花了大约 3 天的时间断断续续地尝试在我的发布版本中修复此崩溃。吸取教训,阅读所有文档。这应该是这个问题的答案。 (4认同)
  • 不知道为什么它在 Android 中如此复杂,我花了几天时间试图解决这个问题......在我的 flutter 应用程序中我找不到 proguard 文件......我需要创建一个吗? (2认同)

小智 5

如果您导出发行版 apk 格式,那么安装后应用程序就会崩溃。您必须执行以下步骤:

  1. 添加proguard-files.pro 文件 比您必须添加文件底部此代码
## flutter_local_notification plugin rules
-keep class com.dexterous.** { *; }

Run Code Online (Sandbox Code Playgroud)
  1. 你的 build.gradle 文件必须是
buildTypes {

    release {
        signingConfig signingConfigs.release
        // Enables code shrinking, obfuscation, and optimization for only
        // your project's release build type.
        minifyEnabled false

        // Enables resource shrinking, which is performed by the
        // Android Gradle plugin.
        shrinkResources false

        // Includes the default ProGuard rules files that are packaged with
        // the Android Gradle plugin. To learn more, go to the section about
        // R8 configuration files.
        proguardFiles getDefaultProguardFile(
                'proguard-android-optimize.txt'),
                'proguard-rules.pro'
    }
}

Run Code Online (Sandbox Code Playgroud)


Jos*_*ias 3

我有完全相同的问题。

我使用了以下内容:

buildTypes {
        release {
           minifyEnabled false
}
    }
Run Code Online (Sandbox Code Playgroud)

请注意,这会禁用您的混淆器。

  • 禁用缩小并不是一个好的解决方案。您应该添加 `-keep class com.dexterous.** { *; }` 行添加到您的 proguard-rules 文件中。 (6认同)
  • @JeroenHeier 感谢您的热烈欢迎:)。据我所知 -&gt;“AAPT2 根据对应用程序清单、布局和其他应用程序资源中的类的引用生成保留规则。例如,AAPT2 为您在应用程序清单中注册为入口点的每个活动包含一个保留规则”。所以,这个“Drawable”正在得到“优化”,所以我猜它因此在发布版本中消失了,从而产生了这个问题。 (2认同)