为什么 Flutter 调试模式可以,发布模式打包出来的则无法运行?
环境使用 gradle-7.5-all.zip ,
buildscript {
ext.kotlin_version = ‘1.9.10’
repositories {
maven {
url ‘https://maven.aliyun.com/repository/public/’
}
google()
mavenCentral()
maven { url “https://jitpack.io” }//maven 仓库
}
dependencies {
classpath ‘com.android.tools.build:gradle:7.2.0’
classpath “org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version”
}
}
使用 flutter_blue: ^0.8.0 依赖。发布模式查看不到什么报错。然后再调试模式,正常调起蓝牙服务。
为什么 Flutter 调试模式可以,发布模式打包出来的则无法运行?
更多关于为什么 Flutter 调试模式可以,发布模式打包出来的则无法运行?的实战教程也可以访问 https://www.itying.com/category-92-b0.html
在真机编译运行。
lutter ( 7085): [ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: PlatformException(error, Field state_ for t2.i not found. Known fields are [private int t2.i.e, private static final t2.i t2.i.f, private static volatile r1.a1 t2.i.g], null, java.lang.RuntimeException: Field state_ for t2.i not found. Known fields are [private int t2.i.e, private static final t2.i t2.i.f, private static volatile r1.a1 t2.i.g]
E/flutter ( 7085): at r1.v0.n0(Unknown Source:72)
E/flutter ( 7085): at r1.v0.T(Unknown Source:698)
E/flutter ( 7085): at r1.v0.R(Unknown Source:12)
E/flutter ( 7085): at r1.k0.e(Unknown Source:60)
E/flutter ( 7085): at r1.k0.a(Unknown Source:49)
E/flutter ( 7085): at r1.d1.d(Unknown Source:17)
E/flutter ( 7085): at r1.d1.e(Unknown Source:4)
E/flutter ( 7085): at r1.z.A(Unknown Source:4)
E/flutter ( 7085): at r1.z$a.C(Unknown Source:9)
E/flutter ( 7085): at r1.z$a.B(Unknown Source:0)
E/flutter ( 7085): at t2.a.a(Unknown Source:775)
E/flutter ( 7085): at j3.k$a.a(Unknown Source:17)
E/flutter ( 7085): at w2.c.l(Unknown Source:18)
E/flutter ( 7085): at w2.c.m(Unknown Source:40)
E/flutter ( 7085): at w2.c.i(Unknown Source:0)
E/flutter ( 7085): at w2.b.run(Unknown Source:12)
E/flutter ( 7085): at android.os.Handler.handleCallback(Handler.java:958)
E/flutter ( 7085): at android.os.Handler.dispatchMessage(Handler.java:99)
E/flutter ( 7085): at android.os.Looper.loopOnce(Looper.java:257)
E/flutter ( 7085): at android.os.Looper.loop(Looper.java:368)
E/flutter ( 7085): at android.app.ActivityThread.main(ActivityThread.java:8839)
E/flutter ( 7085): at java.lang.reflect.Method.invoke(Native Method)
E/flutter ( 7085): at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:572)
E/flutter ( 7085): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1049)
E/flutter ( 7085): )
E/flutter ( 7085): #0 StandardMethodCodec.decodeEnvelope (package:flutter/src/services/message_codecs.dart:652)
E/flutter ( 7085): #1 MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:310)
E/flutter ( 7085): <asynchronous suspension>
E/flutter ( 7085): #2 FlutterBlue.state (package:flutter_blue/src/flutter_blue.dart:56)
E/flutter ( 7085): <asynchronous suspension>
E/flutter ( 7085): #3 AppBleService.init.<anonymous closure> (package:weight_app/services/app_ble.dart:40)
E/flutter ( 7085): <asynchronous suspension>
E/flutter ( 7085):
更多关于为什么 Flutter 调试模式可以,发布模式打包出来的则无法运行?的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
貌似找到问题了,可能是 flutter 混淆把依赖的 class 搞丢了。现在配置了保护,就能正常了。
proguard-rules.pro 位置 android\app<a target="_blank" href=“http://proguard-rules.pro” rel=“nofollow noopener”>proguard-rules.pro
-ignorewarnings
-keep class io.flutter.app.** { ; }
-keep class io.flutter.plugin.* { ; }
-keep class io.flutter.util.* { ; }
-keep class io.flutter.view.* { *; }
-keep class * {
public private *;
}
android\app\build.gradle 也需要修改,设置规制文件
buildTypes {
release {
signingConfig signingConfigs.release
proguardFiles getDefaultProguardFile(‘proguard-android.txt’), ‘proguard-rules.pro’ // 自定义混淆规则文件
}
}
_____
不知道是不是真的这个原因。要等有空才能确定…
ext.kotlin_version 这种写法在新版 flutter 中过时了吧。 新版本是写在 settings.gradle 中了. 这种可能导致其他的依赖无统一使用指定的 kotlin 编译。
flutter_blue 而且你这个包也过时了啊。三年前更新的。 还是更新到新版 flutter_blue_plus 吧。要不然后期升级更加工作量巨大。
以前同事搭的模板,flutter 一升级上去,好多不兼容。可能后面会换 plus 吧。太多东西要改了。
针对Flutter调试模式可以运行而发布模式打包出来的应用无法运行的问题,以下是一些可能的原因及解决方案:
- 依赖问题:调试模式下,Flutter应用可能会自动加载一些依赖项,但在发布模式下,这些依赖项可能没有被正确包含。应确保所有必需的依赖项都已添加到项目的配置文件(如pubspec.yaml)中。
- 代码优化问题:发布模式下,Flutter会进行代码优化以提高性能和减少应用大小,这可能导致一些在调试模式下正常工作的代码出现问题。应检查代码,特别是与性能优化相关的部分。
- 设备兼容性问题:调试模式下应用可能在某些设备上正常工作,但在发布模式下会出现兼容性问题。这可能是由于设备上的硬件或软件限制导致的,应在发布前进行广泛的设备测试。
- 第三方库冲突:使用第三方库时可能会出现库之间的冲突,这些冲突在调试模式下可能不会被暴露出来,但在发布模式下会导致应用崩溃。应检查所有第三方库的版本兼容性。
综上所述,解决这类问题通常需要仔细检查应用的依赖项、代码优化、设备兼容性和第三方库冲突等方面。确保在发布前进行充分的测试,并及时修复和调试任何出现的问题。