Android应用在三星Galaxy A12(Android 12)启动即崩溃且无Crashlytics日志求助
Android应用在三星Galaxy A12(Android 12)启动即崩溃且无Crashlytics日志求助
大家好,我遇到了一个特别棘手的问题,想向各位求助:我的Android应用在绝大多数设备上都能正常运行,但有部分三星Galaxy A12(Android 12)用户反馈,应用一启动就直接崩溃,连闪屏界面都没机会显示,更麻烦的是Crashlytics完全捕获不到这些崩溃的日志,导致我根本没办法定位问题根源。
受影响设备信息
- 设备型号:三星Galaxy A12
- Android版本:Android 12
核心问题
应用启动瞬间崩溃,闪屏界面无法展示,常规崩溃报告工具完全抓不到有效日志,调试陷入僵局。
已尝试的调试方案及结果
1. ABI兼容性排查
一开始我怀疑是ABI架构不兼容的问题,于是在app/build.gradle中配置了多架构支持:
android { defaultConfig { ndk { abiFilters 'armeabi-v7a', 'arm64-v8a' } } }
结果:重新构建并发布后,问题依然存在。
2. ProGuard/R8混淆排查
我猜测可能是代码混淆破坏了关键类,于是更新了ProGuard规则,甚至直接禁用混淆做测试:
buildTypes { release { minifyEnabled false // 也试过配置正确的ProGuard规则 } }
结果:即使关闭混淆,崩溃问题还是没有解决。
3. Firebase测试实验室验证
我在Firebase测试实验室中使用同款三星Galaxy A12(Android 12)设备进行了测试。
结果:应用能正常启动并运行,完全没有出现崩溃情况。
当前状态
- Crashlytics:受影响设备的崩溃日志完全没有记录
- 其他设备:应用运行一切正常
- 测试实验室:同款设备型号测试无异常
- 唯一相关崩溃记录:在Crashlytics中发现一条ABI相关崩溃,但来自Pixel设备,并非三星Galaxy A12
相关Crashlytics崩溃日志(来自Pixel设备)
Fatal Exception: java.lang.RuntimeException: Unable to start activity ComponentInfo{app.MainActivity}: java.lang.RuntimeException: java.util.concurrent.ExecutionException: com.getkeepsafe.relinker.MissingLibraryException: Could not find 'libflutter.so'. Looked for: [armeabi-v7a, armeabi], but only found: []. at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3897) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4076) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:91) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:149) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:103) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2473) at android.os.Handler.dispatchMessage(Handler.java:110) at android.os.Looper.loop(Looper.java:219) at android.app.ActivityThread.main(ActivityThread.java:8349) at java.lang.reflect.Method.invoke(Method.java)
我的app/build.gradle配置
import com.android.build.api.dsl.Packaging import java.io.FileInputStream import java.util.Properties plugins { id("com.android.application") // START: FlutterFire Configuration id("com.google.gms.google-services") id("com.google.firebase.crashlytics") // END: FlutterFire Configuration id("kotlin-android") // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. id("dev.flutter.flutter-gradle-plugin") } // Read key.properties file val keystoreProperties = Properties() val keystorePropertiesFile = rootProject.file("android/key.properties") if (keystorePropertiesFile.exists()) { keystoreProperties.load(FileInputStream(keystorePropertiesFile)) } android { namespace = "my app namespace" compileSdk = 36 ndkVersion = "27.0.12077973" compileOptions { sourceCompatibility = JavaVersion.VERSION_11 targetCompatibility = JavaVersion.VERSION_11 } kotlinOptions { jvmTarget = JavaVersion.VERSION_11.toString() freeCompilerArgs += "-Xallow-jvm-ir-dependencies" } defaultConfig { applicationId = "my app id" // You can update the following values to match your application needs. // For more information, see: https://flutter.dev/to/review-gradle-config. minSdk = 23 targetSdk = 36 versionCode = 5 versionName = "1.0.2" ndk { abiFilters.addAll(listOf("armeabi-v7a", "arm64-v8a")) } } signingConfigs { create("release") { keyAlias = keystoreProperties.getProperty("keyAlias") keyPassword = keystoreProperties.getProperty("keyPassword") storeFile = keystoreProperties.getProperty("storeFile")?.let { file(it) } storePassword = keystoreProperties.getProperty("storePassword") } } buildTypes { debug { ndk { abiFilters.addAll(listOf("armeabi-v7a", "arm64-v8a", "x86", "x86_64")) } isMinifyEnabled = false isShrinkResources = false isDebuggable = true isJniDebuggable = true } release { ndk { abiFilters.addAll(listOf("armeabi-v7a", "arm64-v8a")) } isMinifyEnabled = true isShrinkResources = true proguardFiles( getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" ) signingConfig = if (keystorePropertiesFile.exists()) { signingConfigs.getByName("release") } else { signingConfigs.getByName("debug") } } } }
内容来源于stack exchange




