Flutter Release APK启动崩溃(Debug模式正常)问题排查
Flutter Release APK在Android 13启动即崩溃的解决方法
问题概述
Flutter应用在模拟器、真机Debug模式下运行正常,但打包为Release APK安装到Android 13设备后启动即崩溃。Logcat核心错误为java.lang.NoSuchMethodException: t2.T0.values [],项目compile SDK版本为33。
完整错误日志
FATAL EXCEPTION: RxCachedThreadScheduler-2 Process: mt.com.nectar.nectar_warehouse_management, PID: 28632 Z0.b: java.lang.ExceptionInInitializerError at V2.a.f(Unknown Source:46) at R2.n.run(Unknown Source:26) at R2.n.call(Unknown Source:0) at java.util.concurrent.FutureTask.run(FutureTask.java:264) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:307) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1137) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:637) at java.lang.Thread.run(Thread.java:1012) Caused by: java.lang.ExceptionInInitializerError at u2.n.e(Unknown Source:0) at u2.o.a(Unknown Source:0) at t2.k0.b(Unknown Source:10) at H1.f.get(Unknown Source:82) at w1.a.get(Unknown Source:13) at G1.f.l(Unknown Source:2) at G1.c.get(Unknown Source:52) at H1.d.get(Unknown Source:33) at java.util.concurrent.FutureTask.run(FutureTask.java:264) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:307) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1137) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:637) at java.lang.Thread.run(Thread.java:1012) Caused by: java.lang.RuntimeException: java.lang.NoSuchMethodException: t2.T0.values [] at java.lang.Enum.enumValues(Enum.java:272) at java.lang.Enum.-$$Nest$smenumValues(Unknown Source:0) at java.lang.Enum$1.create(Enum.java:279) at java.lang.Enum$1.create(Enum.java:277) at libcore.util.BasicLruCache.get(BasicLruCache.java:63) at java.lang.Enum.getSharedConstants(Enum.java:291) at java.lang.Class.getEnumConstantsShared(Class.java:2461) at java.util.EnumSet.getUniverse(EnumSet.java:412) at java.util.EnumSet.noneOf(EnumSet.java:114) at java.util.EnumSet.of(EnumSet.java:240) at u2.n.<clinit>(Unknown Source:92) at u2.n.e(Unknown Source:0) at G1.f.l(Unknown Source:2) at N2.f.d(Unknown Source:41) at java.util.concurrent.FutureTask.run(FutureTask.java:264) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:307) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1137) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:637) at java.lang.Thread.run(Thread.java:1012) Caused by: java.lang.NoSuchMethodException: t2.T0.values [] at java.lang.Class.getMethod(Class.java:2103) at java.lang.Class.getDeclaredMethod(Class.java:2081) at java.lang.Enum.enumValues(Enum.java:269) at java.lang.Enum.-$$Nest$smenumValues(Unknown Source:0) at java.lang.Enum$1.create(Enum.java:279) at java.lang.Enum$1.create(Enum.java:277) at libcore.util.BasicLruCache.get(BasicLruCache.java:63) at java.lang.Enum.getSharedConstants(Enum.java:291) at java.lang.Class.getEnumConstantsShared(Class.java:2461) at java.util.EnumSet.getUniverse(EnumSet.java:412) at java.util.EnumSet.noneOf(EnumSet.java:114) at java.util.EnumSet.of(EnumSet.java:240) at u2.n.<clinit>(Unknown Source:92) at u2.n.e(Unknown Source:0) at u2.o.a(Unknown Source:0) at w1.a.get(Unknown Source:13) at java.util.concurrent.FutureTask.run(FutureTask.java:264) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:307) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1137) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:637) at java.lang.Thread.run(Thread.java:1012)
项目配置文件
app/build.gradle
def localProperties = new Properties() def localPropertiesFile = rootProject.file('local.properties') if (localPropertiesFile.exists()) { localPropertiesFile.withReader('UTF-8') { reader -> localProperties.load(reader) } } def flutterRoot = localProperties.getProperty('flutter.sdk') if (flutterRoot == null) { throw GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") } def flutterVersionCode = localProperties.getProperty('flutter.versionCode') if (flutterVersionCode == null) { flutterVersionCode = '1' } def flutterVersionName = localProperties.getProperty('flutter.versionName') if (flutterVersionName == null) { flutterVersionName = '1.0' } apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'com.google.gms.google-services' apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" android { compileSdk 33 sourceSets { main.java.srcDirs += 'src/main/kotlin' } defaultConfig { applicationId "mt.com.nectar.nectar_warehouse_management" minSdkVersion 29 targetSdkVersion 33 versionCode flutterVersionCode.toInteger() versionName flutterVersionName multiDexEnabled true } buildTypes { release { // TODO: Add your own signing config for the release build. // Signing with the debug keys for now, so `flutter run --release` works. signingConfig signingConfigs.debug } } compileOptions { sourceCompatibility JavaVersion.VERSION_17 targetCompatibility JavaVersion.VERSION_17 } kotlinOptions { jvmTarget = '17' } buildToolsVersion '33.0.0' namespace 'mt.com.nectar.nectar_warehouse_management' } flutter { source '../..' } dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation platform('com.google.firebase:firebase-bom:32.0.0') implementation 'com.google.firebase:firebase-messaging' implementation 'com.google.firebase:firebase-analytics' implementation 'com.google.firebase:firebase-inappmessaging-display:20.3.2' implementation 'com.android.support:multidex:1.0.3' }
AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="mt.com.nectar.nectar_warehouse_management"> <application android:label="Nectar Warehouse Management" android:icon="@mipmap/logo_green"> <activity android:name=".MainActivity" android:launchMode="singleTop" android:theme="@style/LaunchTheme" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode" android:hardwareAccelerated="true" android:windowSoftInputMode="adjustResize" android:exported="true"> <!-- Specifies an Android theme to apply to this Activity as soon as the Android process has started. This theme is visible to the user while the Flutter UI initializes. After that, this theme continues to determine the Window background behind the Flutter UI. --> <meta-data android:name="io.flutter.embedding.android.NormalTheme" android:resource="@style/NormalTheme" /> <!-- Displays an Android View that continues showing the launch screen Drawable until Flutter paints its first frame, then this splash screen fades out. A splash screen is useful to avoid any visual gap between the end of Android's launch screen and the painting of Flutter's first frame. --> <meta-data android:name="io.flutter.embedding.android.SplashScreenDrawable" android:resource="@drawable/launch_background" /> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> <intent-filter> <action android:name="FLUTTER_NOTIFICATION_CLICK"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter> </activity> <service android:name="com.google.firebase.messaging.FirebaseMessagingService" android:exported="false"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service> <!-- Don't delete the meta-data below. This is used by the Flutter tool to generate GeneratedPluginRegistrant.java --> <meta-data android:name="flutterEmbedding" android:value="2" /> </application> <uses-permission android:name="android.permission.INTERNET" /> </manifest>
修复方案
该错误是Release模式下代码混淆移除了枚举类的values()方法,导致初始化异常。以下是具体修复方法:
方案1:添加枚举类混淆保护规则
在android/app/proguard-rules.pro文件中添加以下规则(无此文件则直接创建),防止枚举类核心方法被混淆:
-keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); }
方案2:临时关闭混淆(仅测试用)
在app/build.gradle的release构建类型中添加配置,关闭代码混淆和资源压缩:
buildTypes { release { signingConfig signingConfigs.debug minifyEnabled false shrinkResources false } }
注意:正式发布不建议使用此方案,会增大APK体积且降低代码安全性。
方案3:更新Firebase依赖版本
错误堆栈涉及Firebase相关代码,尝试将Firebase BOM版本升级到最新稳定版(如32.7.1或更高),修复依赖兼容性问题:
implementation platform('com.google.firebase:firebase-bom:32.7.1')
验证步骤
- 执行
flutter clean清除项目缓存 - 重新打包Release APK:
flutter build apk --release - 将APK安装到Android 13设备测试启动情况
内容的提问来源于stack exchange,提问作者Toxic
相关产品推荐
相关产品推荐

