Ionic+Cordova应用API31物理设备启动即崩溃问题求助
Ionic+Cordova Android应用API31物理设备崩溃问题排查
问题描述
我正在测试一款基于Ionic(搭配Cordova)的Android集成Demo,该应用在API26、30、31版本的模拟器上运行正常,但在API31版本的物理设备上,启动加载闪屏后立即崩溃。已在多个论坛搜索,未找到适配的解决方案,终端输出日志如下:
I/chromium: [INFO:CONSOLE(100770)] "Ionic Native: deviceready event fired after 2039 ms", source: http://localhost/vendor-es2015.js (100770) W/KeyStore: KeyStore exception android.os.ServiceSpecificException: (code 7) at android.os.Parcel.createExceptionOrNull(Parcel.java:2387) at android.os.Parcel.createException(Parcel.java:2357) at android.os.Parcel.readException(Parcel.java:2340) at android.os.Parcel.readException(Parcel.java:2282) at android.security.keystore.IKeystoreService$Stub$Proxy.get(IKeystoreService.java:988) at android.security.KeyStore.get(KeyStore.java:233) at android.security.KeyStore.get(KeyStore.java:222) at android.security.keystore.AndroidKeyStoreSpi.engineGetCertificate(AndroidKeyStoreSpi.java:160) at java.security.KeyStore.getCertificate(KeyStore.java:1120) at com.crypho.plugins.RSA.loadKey(RSA.java:71) at com.crypho.plugins.RSA.isEntryAvailable(RSA.java:51) at com.crypho.plugins.SecureStorage.execute(SecureStorage.java:105) at org.apache.cordova.CordovaPlugin.execute(CordovaPlugin.java:117) at org.apache.cordova.CordovaPlugin.execute(CordovaPlugin.java:98) at org.apache.cordova.PluginManager.exec(PluginManager.java:132) at org.apache.cordova.CordovaBridge.jsExec(CordovaBridge.java:59) at org.apache.cordova.engine.SystemExposedJsApi.exec(SystemExposedJsApi.java:41) at android.os.MessageQueue.nativePollOnce(Native Method) at android.os.MessageQueue.next(MessageQueue.java:342) at android.os.Looper.loop(Looper.java:197) at android.os.HandlerThread.run(HandlerThread.java:67) W/KeyStore: KeyStore exception android.os.ServiceSpecificException: (code 7) at android.os.Parcel.createExceptionOrNull(Parcel.java:2387) at android.os.Parcel.createException(Parcel.java:2357) at android.os.Parcel.readException(Parcel.java:2340) at android.os.Parcel.readException(Parcel.java:2282) at android.security.keystore.IKeystoreService$Stub$Proxy.get(IKeystoreService.java:988) at android.security.KeyStore.get(KeyStore.java:233) at android.security.KeyStore.get(KeyStore.java:222) at android.security.keystore.AndroidKeyStoreSpi.engineGetCertificate(AndroidKeyStoreSpi.java:165) at java.security.KeyStore.getCertificate(KeyStore.java:1120) at com.crypho.plugins.RSA.loadKey(RSA.java:71) at com.crypho.plugins.RSA.isEntryAvailable(RSA.java:51) at com.crypho.plugins.SecureStorage.execute(SecureStorage.java:105) at org.apache.cordova.CordovaPlugin.execute(CordovaPlugin.java:117) at org.apache.cordova.CordovaPlugin.execute(CordovaPlugin.java:98) at org.apache.cordova.PluginManager.exec(PluginManager.java:132) at org.apache.cordova.CordovaBridge.jsExec(CordovaBridge.java:59) at org.apache.cordova.engine.SystemExposedJsApi.exec(SystemExposedJsApi.java:41) at android.os.MessageQueue.nativePollOnce(Native Method) at android.os.MessageQueue.next(MessageQueue.java:342) at android.os.Looper.loop(Looper.java:197) at android.os.HandlerThread.run(HandlerThread.java:67) W/PluginManager: THREAD WARNING: exec() call to SecureStorage.init blocked the main thread for 42ms. Plugin should use CordovaInterface.getThreadPool(). D/AndroidRuntime: Shutting down VM E/AndroidRuntime: FATAL EXCEPTION: main Process: com.ionicframework.suacimobile257509, PID: 22032 android.content.ActivityNotFoundException: No Activity found to handle Intent { act=com.android.credentials.UNLOCK } at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:2067) at android.app.Instrumentation.execStartActivity(Instrumentation.java:1727) at android.app.Activity.startActivityForResult(Activity.java:5412) at org.apache.cordova.CordovaActivity.startActivityForResult(CordovaActivity.java:345) at android.app.Activity.startActivityForResult(Activity.java:5370) at android.app.Activity.startActivity(Activity.java:5760) at android.app.Activity.startActivity(Activity.java:5713) at com.crypho.plugins.SecureStorage.startActivity(SecureStorage.java:240) at com.crypho.plugins.SecureStorage.access$700(SecureStorage.java:21) at com.crypho.plugins.SecureStorage$4.run(SecureStorage.java:217) at android.os.Handler.handleCallback(Handler.java:938) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:250) at android.app.ActivityThread.main(ActivityThread.java:7803) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:958) D/SERVER: Handling local request: http://localhost/7-es2015.js I/Process: Sending signal. PID: 22032 SIG: 9
问题定位
从日志核心报错可以确定:
- 前期的
KeyStore exception (code 7)是密钥库访问异常,触发了cordova-plugin-secure-storage插件的逻辑错误; - 致命崩溃原因是**
android.content.ActivityNotFoundException: No Activity found to handle Intent { act=com.android.credentials.UNLOCK }**——插件尝试调用系统的凭证解锁Activity,但当前物理设备的系统(可能是定制ROM)没有提供该组件,导致找不到可处理的Activity而崩溃。
解决方案
- 升级SecureStorage插件:将
cordova-plugin-secure-storage升级到最新版本,旧版本对Android 12(API31)的系统组件适配不足; - 替换为兼容插件:如果升级后问题依旧,改用
cordova-plugin-secure-storage-echo,它是原插件的维护分支,修复了Android 12+的兼容性问题; - 检查设备系统:若使用定制ROM设备,部分厂商移除了原生凭证解锁组件,需在应用中添加降级逻辑,比如无法调用解锁Intent时,切换到本地加密存储方案;
- 添加必要权限:确保
AndroidManifest.xml中包含以下权限:<uses-permission android:name="android.permission.USE_BIOMETRIC" /> <uses-permission android:name="android.permission.USE_FINGERPRINT" />
内容的提问来源于stack exchange,提问作者Melanie Marval
相关产品推荐
相关产品推荐

