Blankj / Blankj/AndroidUtilCode

未解锁状态下拉起activity,因为FBE原因,导致activity发生crash

Abierto
#1,547 0 comentarios 0 reacciones 1 asignado Reclamado por @Blankj Ver en GitHub
bug
Lenguaje dominante
Java
Estrellas
33.6k
Forks
10.6k
Métricas de merge de PR
Sin PR fusionados en 30 d

Descripción

## 重启未解锁状态下启动Activity,会导致因为FBE加密带来的Crash
1. utilcode在Utils.init时会监听activity的生命周期变化
2. 在用户未解锁情况下,拉起一个activity
3. activity启动时走onCreate
4. 当走到监听回调的onActivityCreated#LanguageUtils.applyLanguage(activity)函数时,会调用SPUtils中的实例
5. 但是SPUtils实例中默认用普通Context初始化,并且没有提供输入初始化Context的入口
6. 此时未解锁状态下访问SPUtils,会带来错误堆栈中的`SharedPreferences in credential encrypted storage are not available until after user is unlocked`错误。

** 建议在`onActivityCreated#LanguageUtils.applyLanguage(activity)`中做安全保护,避免产生crash,或者让业务方自己做SPUtils中数据的restore的工作。 **

- AndroidUtilCode 的版本:1.30.6
- 出现 Bug 的设备型号:黑鲨4Pro
- 设备的 Android 版本:Android11

## 代码业务跟出错无关

## 异常堆栈

```
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.blackshark.sharkman/com.blackshark.sharkman.alarm.AlarmAlertFullScreenActivity}: java.lang.IllegalStateException: SharedPreferences in credential encrypted storage are not available until after user is unlocked
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3578)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3738)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
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:2174)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:233)
at android.app.ActivityThread.main(ActivityThread.java:8240)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:663)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:967)
Caused by: java.lang.IllegalStateException: SharedPreferences in credential encrypted storage are not available until after user is unlocked
at android.app.ContextImpl.getSharedPreferences(ContextImpl.java:504)
at android.app.ContextImpl.getSharedPreferences(ContextImpl.java:489)
at android.content.ContextWrapper.getSharedPreferences(ContextWrapper.java:199)
at com.blankj.utilcode.util.SPUtils.(SPUtils.java:84)
at com.blankj.utilcode.util.SPUtils.getInstance(SPUtils.java:71)
at com.blankj.utilcode.util.SPUtils.getInstance(SPUtils.java:54)
at com.blankj.utilcode.util.UtilsBridge.getSpUtils4Utils(UtilsBridge.java:518)
at com.blankj.utilcode.util.LanguageUtils.applyLanguage(LanguageUtils.java:231)
at com.blankj.utilcode.util.UtilsActivityLifecycleImpl.onActivityCreated(UtilsActivityLifecycleImpl.java:208)
at android.app.Application.dispatchActivityCreated(Application.java:375)
at android.app.Activity.dispatchActivityCreated(Activity.java:1379)
at android.app.Activity.onCreate(Activity.java:1652)
at androidx.core.app.ComponentActivity.onCreate(ComponentActivity.java:85)
at androidx.activity.ComponentActivity.onCreate(ComponentActivity.java:298)
at androidx.fragment.app.FragmentActivity.onCreate(FragmentActivity.java:273)
at com.blackshark.sharkman.common.base.BaseActivity.onCreate(BaseActivity.kt:36)
at com.blackshark.sharkman.alarm.AlarmAlertFullScreenActivity.onCreate(AlarmAlertFullScreenActivity.kt:42)
at android.app.Activity.performCreate(Activity.java:8249)
at android.app.Activity.performCreate(Activity.java:8221)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1310)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3551)
... 11 more
```

## 看堆栈就知道了,很明确的错误

Guía de contribución

No hay ninguna guía de contribución indexada para este repositorio

Evaluación

Este issue todavía no se ha evaluado.

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.