You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动