У меня есть вопрос относительно исключения обработки монет.
В модуле, где я определил EncryptedSharedPreferences.create()
, иногда возникает исключение, которое приводит к сбою в устройстве пользователя. Я вижу в отчете о сбоях, что сбой происходит уже более 200 раз. Ниже приведено более конкретное исключение.
Caused by java.security.UnrecoverableKeyException: Failed to obtain information about key
...
Caused by android.security.KeyStoreException: -49
По-видимому, об этой проблеме уже сообщалось, но нет действительного ответа на ее решение. Поскольку я использую Koin для определения EncryptedSharedPreferences
, я подумал, что лучше обрабатывать его внутри функции single{}
. Поместите try catch
, который поймает исключение. Но когда я пытаюсь бросить Exception
внутри попытки, он не поймал исключение, это просто сбой, а не то, что я ожидал. Код выглядит следующим образом
single(named(ENCRYPTED_SHARED_PREF)) {
val context = androidApplication().applicationContext
try {
val masterKey =
MasterKey.Builder(context, MasterKey.DEFAULT_MASTER_KEY_ALIAS)
.setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
.build()
EncryptedSharedPreferences.create(
context,
SP_ENCRYPTED_KEY,
masterKey,
EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
)
throwError()
} catch (e: Exception) {
Timber.d("[SHARED PREF] Terjadi exception")
when (e) {
is KeyStoreException -> {
Toast.makeText(context, "Terjadi exception", Toast.LENGTH_SHORT).show()
}
}
//Update missing link below
androidApplication().getSharedPreferences(SP_KEY, Context.MODE_PRIVATE)
}
}
...
@Throws(KeyStoreException::class)
fun throwError(): Nothing {
throw KeyStoreException("Terjadi exception")
}
Теперь вопрос, есть ли способ обработки такого рода исключений внутри Koin single
или нет? Я пытался найти документацию и погуглить ее, мне кажется, это тупик.
Другая полезная информация:
EncryptedSharedPreferences
версия :androidx.security:security-crypto:1.1.0-alpha03
- Система отслеживания ошибок для
EncryptedSharedPreferences
, с которой я столкнулся: https://issuetracker.google.com/u/1/issues/167977579 - Сбой или исключение не связано с проблемой Koin, а связано с
EncryptedSharedPreferences
- Версия монеты:
org.koin:koin-android-viewmodel:2.1.6
ОБНОВИТЬ РЕШИТЬ
Мне потребовалось некоторое время, чтобы понять, что блок catch
должен возвращать что-то вроде значения или другого объекта, скажем, обычно разделяемого предпочтения. В коде нет ничего плохого после тщательного исследования. Спасибо всем, я также обновляю код в своем объяснении выше.
single {}
. Этому исключению есть причина. Возможно, это поможет вам: stackoverflow.com/questions/36652675/ - person ChristianB   schedule 28.12.2020single
должен возвращать значение (или бросать), поэтому убедитесь, что ваш код восстановления работает таким же образом. - person laalto   schedule 28.12.2020