主要原因
只要是锁屏状态,接收到广播启动应用都会有这个问题, 因为用户还没解锁, 不能读取受保护的内容. 但在DCloudApplication的
onCreate 和 attachBaseContext 里面调用的方法产生异常,但没有捕获. 导致程序崩溃.
上面的两个方法都会调用 io.dcloud.a.a(AdMgr.java:29), 都会产生BUG.
修复:
- DCloudApplication
[内容]
2583-2583/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: uni.UNI8A57EF0, PID: 2583
java.lang.RuntimeException: Unable to instantiate application io.dcloud.application.DCloudApplication: java.lang.IllegalStateException: SharedPreferences in credential encrypted storage are not available until after user is unlocked
at android.app.LoadedApk.makeApplication(LoadedApk.java:1226)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6431)
at android.app.ActivityThread.access$1300(ActivityThread.java:219)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1859)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
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:458)
at android.app.ContextImpl.getSharedPreferences(ContextImpl.java:443)
at io.dcloud.common.adapter.util.SP.getOrCreateBundle(SP.java:135)
at io.dcloud.common.adapter.util.SP.getOrCreateBundle(SP.java:150)
at io.dcloud.feature.ad.a.b(AdSplashUtil.java:90)
at io.dcloud.feature.ad.AdFeatureImplMgr.doForFeature(AdFeatureImplMgr.java:18)
at io.dcloud.a.a(AdMgr.java:29)
at io.dcloud.application.DCloudApplication.attachBaseContext(DCloudApplication.java:79)
at android.app.Application.attach(Application.java:351)
at android.app.Instrumentation.newApplication(Instrumentation.java:1149)
at android.app.LoadedApk.makeApplication(LoadedApk.java:1218)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6431)
at android.app.ActivityThread.access$1300(ActivityThread.java:219)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1859)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
重现步骤
1.模拟器设置有锁屏. application,activity,receiver,service 添加 android:directBootAware="true" 属性.
2.Android 设置一个自启广播( android.intent.action.BLOCK_BOOT_COMPLETE)接收器,并添加android.permission.RECEIVE_BOOT_COMPLETED权限.
- 广播启动到一个前端服务(context.startForegroundService())
- 安装APK,并启动一次,
- 重启模拟器, 查看Logcat输出, 有错误日志.
[运行端版本号]
XBuilder 2.3.9
Android-SDK@2.3.9.70750_20191105
[Android版本号]
Android10 API 29 模拟器
4 个回复
DCloud_Android_ST
暂时不支持开机自启能力
8***@qq.com (作者) - 全栈开发 JAVA PHP JS Android Vue React H5
不是要开放这个能力, 是我们做原生插件有这一需求, 这只是DCloudApplication的bug, 很好修复的呀.
8***@qq.com (作者) - 全栈开发 JAVA PHP JS Android Vue React H5
这是程序BUG, 导致应用崩溃, 异常堆栈都贴出来了呀.
DCloud_Android_ST
已经说了不支持开机自启动逻辑。runtime部分逻辑就是需要启动获取存储数据业务逻辑的。与android10锁屏后禁止获取SharedPreferences 冲突。
2019-11-15 11:40
8***@qq.com (作者) - 全栈开发 JAVA PHP JS Android Vue React H5
DCloud_Android_ST
catch住了业务逻辑也不管了?
2019-11-15 12:48
DCloud_Android_ST
回复 DCloud_Android_ST: 崩溃的问题我们会尽快容错。不过还是暂时不支持开机自启。貌似很多rom也会将自启动拉黑名单吧。
2019-11-15 12:51
8***@qq.com (作者)
回复 DCloud_Android_ST: 因为我开的发插件, 锁屏状态可接收广播自启, 因为是原生的,这部分代码其实还用不到uniapp的功能,程序启动后, 用户操作后才会用到,这时会要求用户解锁, 但要使用Uniapp 不能自定义Application. 建议把那部分代码, 提取到 PandoraEntry 的.onCreate, 包括 io.dcloud.a.a(AdMgr.java:29)和cookieManager 的设置那一部分. 因为有这个流程, 接收广播 -> 启动服务 -> 显示通知 -> 点击通知 -> PandoraEntry 进入Uniapp主页.
2019-11-15 13:36
8***@qq.com (作者)
自启,我们会提示用户加入白名单, 接收广播 -> 启动服务 -> 显示通知 这一部分在锁屏状态, 用户点击通知, 系统会要求解锁.
2019-11-15 13:42