Как разрешить KeyStoreConnectException на Android 10?
Мое приложение довольно хорошо работает на всех ОС Android, кроме Android 10. Я использую устройство Motorola One Power, которое было обновлено до Android 10. Мы используем Android Keystore для шифрования баз данных.
Приложение выдает сбой при запуске с ошибкой ниже.
android.security.keystore.KeyStoreConnectException: не удалось связаться со службой хранилища ключей в android.security.keystore.AndroidKeyStoreCipherSpiBase.ensureKeystoreOperationInitialized(AndroidKeyStoreCipherSpiBase.java:256) в android.security.keySpiBase.java:256.crypto.Cipher.tryTransformWithProvider(Cipher.java:2980)
Это проблема KeyStoreConnectException. Приложению требуется время для подключения к KeyStoreConnectException.
Примечание. Если я запускаю приложение в отладочном режиме, оно работает нормально.
Пожалуйста, помогите мне найти решение. Заранее спасибо.
3 ответа
Как указал MatPag, это известная ошибка в Android 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
}
}
}
И затем вы вызываете это так (помните - в фоновом потоке):
keyStoreWorkaroundForAndroid10 {
cipherEncrypt.init(Cipher.ENCRYPT_MODE, publicKey)
}
Это известная ошибка, которая отслеживается здесь https://issuetracker.google.com/issues/147384380.
Google исправил это и, вероятно, будет доступен в Android 11.
В настоящее время мы не знаем, будет ли это исправлено с помощью исправлений безопасности на Android 10 в какой-то момент.
Я думаю, что запуск вашего кода занимает много времени, вы можете перейти к потоку, попробуйте!