Flutter应用在Release模式下建立TCP连接时无报错崩溃
Flutter IoT应用Release模式TCP连接崩溃(Debug正常)
以下是针对该问题的排查方向和解决方案:
1. 检查网络权限配置
Android平台下,哪怕连接的是无互联网的IoT Wi-Fi,TCP通信依然需要INTERNET权限。Debug模式下Flutter会自动注入该权限,但Release模式如果手动修改过AndroidManifest.xml,可能不小心删掉了这个权限。
- 打开
android/app/src/main/AndroidManifest.xml,确认存在这条权限声明:
<uses-permission android:name="android.permission.INTERNET"/>
iOS平台需要配置ATS允许非安全连接(IoT设备大多用未加密的TCP):
- 在
ios/Runner/Info.plist中添加ATS例外配置:
<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict>
如果想更安全,可以只针对目标IoT设备的IP/域名配置例外,避免全局关闭ATS。
2. 禁用Socket相关代码的混淆
Release模式的代码混淆可能会破坏dart:io中Socket类的结构,导致运行时崩溃。
- 编辑
android/app/proguard-rules.pro,添加以下规则保留Socket相关类:
-keep class dart.io.** { *; } -keep class java.net.Socket { *; }
3. 处理异步异常与连接超时
现有代码的try-catch可能没覆盖所有异步场景,比如setDeviceTime/setDeviceDate中的异常,或者Socket连接超时导致的未处理错误。
- 给Socket连接添加超时限制,避免无限等待:
_socket = await Socket.connect( MyConst.remoteHost, MyConst.remotePort, timeout: const Duration(seconds: 5) );
- 给
setDeviceTime和setDeviceDate单独添加异常捕获,确保所有异步错误都能被处理:
await setDeviceTime().catchError((e) => debugPrint('设置设备时间失败: $e')); await setDeviceDate().catchError((e) => debugPrint('设置设备日期失败: $e'));
4. 查看Release模式的真实崩溃日志
print语句在Release模式下会被Flutter优化剔除,所以控制台看不到错误信息。你可以:
- 用
debugPrint替代print,它在Release模式下仍能输出日志; - 连接Android设备,通过
adb logcat命令查看系统级崩溃日志,搜索你的应用包名,能找到崩溃的具体堆栈信息。
内容的提问来源于stack exchange,提问作者Srisudhan
相关产品推荐
相关产品推荐

