Android 如何解决安卓10上的KeystoreReconnectException?

Android 如何解决安卓10上的KeystoreReconnectException?,android,android-keystore,android-security,keystore-access,Android,Android Keystore,Android Security,Keystore Access,除了安卓10,我的应用程序在所有安卓操作系统上都运行得很好。我使用的是摩托罗拉One Power设备,它是用安卓10更新的。我们正在使用Android密钥库加密数据库 应用程序在luanch上崩溃,错误如下 android.security.keystore.KeyStoreReconnectException:无法与密钥库服务通信 在android.security.keystore.androidkeystoripherspibase.ensureKeystoreOperationIniti

除了安卓10,我的应用程序在所有安卓操作系统上都运行得很好。我使用的是摩托罗拉One Power设备,它是用安卓10更新的。我们正在使用Android密钥库加密数据库

应用程序在luanch上崩溃,错误如下

android.security.keystore.KeyStoreReconnectException:无法与密钥库服务通信 在android.security.keystore.androidkeystoripherspibase.ensureKeystoreOperationInitialized(androidkeystoripherspibase.java:256)中 位于android.security.keystore.androidkeystrecipherspibase.engineInit(androidkeystrecipherspibase.java:148) 位于javax.crypto.Cipher.tryTransformWithProvider(Cipher.java:2980)

这是一个KeyStoreConnectException问题。应用程序正在花费时间连接到KeyStoreReconnectException

注意:如果我在调试模式下运行应用程序,那么它工作正常。


请帮我找到解决办法。提前感谢。

我认为您的代码运行需要很长时间,您可以转到线程,试试看

这是一个在这里跟踪的已知错误

谷歌修复了它,可能会在安卓11中提供


我们目前不知道安卓10上的安全补丁是否会在某个时候修复它

,正如MatPag所指出的,这是安卓10上的一个安全补丁,在早期或更高版本中不存在。当我在几个地方调用Cipher::init()时,Kotlin中有一个方便的高阶包装函数:

private fun keyStoreWorkaroundForAndroid10(f: () -> Unit) {
    for (i in 0..3) {
        try {
            f()
            return
        } catch (e: ProviderException) {
            Timber.d("Applying Android 10 KeyStoreConnectException bug workaround. Counter: ${i}, Exception: ${e.message}")
            Thread.sleep(100)
            continue
        }
    }
}
然后你这样称呼它(记住——在后台线程中):


我也有同样的问题,我意识到只有在后台线程上使用密码时才会发生这种情况。如果我在主线程上执行,它就可以正常工作。你找到解决这个问题的方法了吗?我在主线程上使用它,但仍然在CrashlyticsDid中得到这个错误。你设法解决了这个错误吗?
keyStoreWorkaroundForAndroid10 {
    cipherEncrypt.init(Cipher.ENCRYPT_MODE, publicKey)
}