仅在 Android 12 上崩溃“活动客户端记录不得为空才能执行事务项”

问题描述 投票:0回答:1

几周前,我注意到 Crashlytics 崩溃了:

Fatal Exception: java.lang.IllegalArgumentException: Activity client record must not be null to execute transaction item
   at android.app.servertransaction.ActivityTransactionItem.getActivityClientRecord(ActivityTransactionItem.java:85)
   at android.app.servertransaction.ActivityTransactionItem.getActivityClientRecord(ActivityTransactionItem.java:58)
   at android.app.servertransaction.ActivityTransactionItem.execute(ActivityTransactionItem.java:43)
   at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
   at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2438)
   at android.os.Handler.dispatchMessage(Handler.java:106)
   at android.os.Looper.loopOnce(Looper.java:226)
   at android.os.Looper.loop(Looper.java:313)
   at android.app.ActivityThread.main(ActivityThread.java:8663)
   at java.lang.reflect.Method.invoke(Method.java)
   at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:567)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1135)

似乎发生在应用程序启动时,但在 Android 12 上为 100%,在三星(75% 三星 Galaxy A51)设备上为 95%。我检查了 A51,但对我来说它工作正常,我无法重现该问题。也许有人已经解决了这个问题,或者对可能出现什么问题或哪里出了问题有一些见解?谢谢!

android firebase crash crashlytics
1个回答
3
投票

看起来这是 Android 12 中的一个错误,已修复,但尚未完全推出。参考:https://issuetracker.google.com/issues/210886009

您可以通过绕过 Android 12 上的启动屏幕 API 来解决此问题,如下所示:

class MyActivity : AppCompatActivity() {
    private var splashScreen: SplashScreen? = null
    private val shouldAvoidSplashScreen = Build.VERSION.SDK_INT == Build.VERSION_CODES.S ||
        Build.VERSION.SDK_INT == Build.VERSION_CODES.S_V2

    private var dismissSplash = false

    override fun onCreate(savedInstanceState: Bundle?) {
        if (shouldAvoidSplashScreen) setTheme(R.style.Theme_MyApp) else {
            splashScreen = installSplashScreen()
        }
        super.onCreate(savedInstanceState)
        if (shouldAvoidSplashScreen.not()) splashScreen?.run {
            setKeepOnScreenCondition { !dismissSplash }
        }
        setContent { ... }
   }
}
© www.soinside.com 2019 - 2024. All rights reserved.