解决attempted to register plugin but it was already registered with this flutterengine

更新Flutter版本后,App出现闪退问题。错误信息显示插件重复注册。通过调整MainActivity配置解决了问题。

场景

Flutter版本更新后,运行出现以下问题,App闪退。

W/FlutterEngineCxnRegstry(10678): Attempted to register plugin (io.flutter.embedding.engine.plugins.shim.ShimPluginRegistry$ShimRegistrarAggregate@3777b26) but it was already registered with this FlutterEngine (io.flutter.embedding.engine.FlutterEngine@6c93367).
E/AndroidRuntime(10678): FATAL EXCEPTION: main
E/AndroidRuntime(10678): Process: com.example.firstflutterapp, PID: 10678
E/AndroidRuntime(10678): java.lang.RuntimeException: Unable to start activity ComponentInfo{
   
   com.example.firstflutterapp/com.example.firstflutterapp.MainActivity}: java.lang.NullPointerException: Attempt to invoke interface method 'void io.flutter.plugin.common.BinaryMessenger.setMessageHandler(java.lang.String, io.flutter.plugin.common.BinaryMessenger$BinaryMessageHandler)' on a null object reference
E/AndroidRuntime(10678):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3898)
E/AndroidRuntime(10678):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4081)
E/AndroidRuntime(10678):  at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:91)
E/AndroidRuntime(10678):  at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:149)<
当设备尝试访问其无权访问的内存时,通常会触发类似段错误(Segmentation Fault)的异常。这种错误可能是由硬件、驱动程序或运行在设备上的软件引发的,尤其是在访问受保护的内存区域或非法内存地址时。此类错误的常见表现形式之一是系统生成错误代码,例如 `0xWWWWWWWW` 表示非法访问的内存地址,`0xZZZZZZZZ` 表示执行非法访问的指令地址,这些信息可以帮助定位问题来源 [^2]。 ### 错误原因分析 1. **非法内存访问**:设备尝试读取或写入未被分配或受保护的内存区域,例如操作系统内核空间或其他进程的内存区域 [^1]。 2. **驱动程序错误**:设备驱动程序可能存在 bug,例如未正确管理内存映射或访问权限,导致设备访问了不应访问的内存。 3. **硬件故障**:设备本身的硬件问题可能导致其发出错误的内存访问请求。 4. **权限配置错误**:设备的内存访问权限可能配置不当,例如 DMA(直接内存访问)操作未正确设置内存区域的访问权限。 ### 解决方案 1. **检查驱动程序**:确保使用了最新版本的设备驱动程序,并且驱动程序正确处理了内存映射和访问权限。对于 Linux 系统,可以通过 `dmesg` 命令查看内核日志,以识别与设备相关的内存访问错误。 2. **调试工具**:利用调试工具(如 GDB)分析发生错误时的堆栈信息,定位具体是哪个模块或函数触发了非法内存访问。 3. **硬件诊断**:对设备进行硬件诊断,确保其正常工作且没有发出错误的内存请求。 4. **权限与配置检查**:审查设备的内存访问权限配置,确保 DMA 操作等涉及直接内存访问的功能仅限于指定的内存区域。 ### 示例:Linux 内核日志中的段错误信息 在 Linux 系统中,当设备驱动或用户空间程序发生段错误时,内核通常会在日志中记录相关信息。可以使用 `dmesg` 命令查看: ```bash dmesg | grep -i segfault ``` 输出可能类似于: ``` [12345.67890] my_device[123]: segfault at 0xdeadbeef ip 0x080483b4 sp 0xbffff4c0 error 4 in my_program[8048000+1000] ``` 其中 `segfault at` 表示非法访问的内存地址,`ip` 表示触发错误的指令地址,`error 4` 表示访问类型(如权限不足)。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值