Ionic7+Angular16+Capacitor5安卓重启崩溃问题求助
问题描述
我有一个基于Ionic、Angular和Capacitor的应用,近期已升级至Ionic 7、Angular 16、Capacitor 5的最新版本。安卓端首次安装后运行无异常,但重启应用时出现崩溃,抛出以下异常:
FATAL EXCEPTION: main Process: App Id, PID: 26600 java.lang.RuntimeException: Unable to start activity ComponentInfo{APPID/APPID.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3540) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3700) 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:2136) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:236)at android.app.ActivityThread.main(ActivityThread.java:8061) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:656) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:967) Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference at com.getcapacitor.Bridge.isNewBinary(Bridge.java:381) at com.getcapacitor.Bridge.loadWebView(Bridge.java:255) at com.getcapacitor.Bridge.<init>(Bridge.java:215) at com.getcapacitor.Bridge.<init>(Unknown Source:0) at com.getcapacitor.Bridge$Builder.create(Bridge.java:1513) at com.getcapacitor.BridgeActivity.load(BridgeActivity.java:42) at com.getcapacitor.BridgeActivity.onCreate(BridgeActivity.java:36) at android.app.Activity.performCreate(Activity.java:8127) at android.app.Activity.performCreate(Activity.java:8098) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1310) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3513) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3700) 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:2136) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:236) at android.app.ActivityThread.main(ActivityThread.java:8061) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:656) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:967)
项目环境信息
Ionic CLI : 7.1.1 Ionic Framework : @ionic/angular 7.0.14 @angular-devkit/build-angular : 16.1.0 @angular-devkit/schematics : 16.1.0 @angular/cli : 16.1.0 @ionic/angular-toolkit : 9.0.0 Capacitor: Capacitor CLI : 5.1.0 @capacitor/android : 5.1.0 @capacitor/core : 5.1.0 @capacitor/ios : 5.1.0 NodeJS : v18.10.0 npm : 8.19.2 Android Studio Flamingo | 2022.2.1 Patch 2 Java 17 Gradle 8.0.0
问题分析与解决方法
原因分析
从崩溃栈可以定位到,空指针异常发生在com.getcapacitor.Bridge.isNewBinary(Bridge.java:381)方法中,是调用String.equals()时触发的——说明Capacitor在检查二进制版本时,读取到的存储版本字符串为null。
该问题属于Capacitor 5.x早期版本的已知兼容性问题:首次启动应用时,版本信息未正确写入SharedPreferences,或升级过程中旧存储数据格式与新版本不兼容,导致重启时读取版本值为空,触发空指针。
可行解决方法
方法1:升级Capacitor到最新稳定版
Capacitor后续版本已修复该空指针问题,执行以下命令完成升级:
npm install @capacitor/core@latest @capacitor/android@latest @capacitor/cli@latest npx cap sync android
方法2:手动修复Bridge类的空值判断
如果暂时无法升级,可修改安卓端Bridge.java中的isNewBinary方法,添加空值校验:
找到com.getcapacitor.Bridge类的isNewBinary方法,修改为:
private boolean isNewBinary() { String storedVersion = preferences.getString(KEY_BINARY_VERSION, null); String currentVersion = getBinaryVersion(); // 先判断存储版本是否为空,避免空指针 if (storedVersion == null) { saveBinaryVersion(); return true; } boolean isNew = !storedVersion.equals(currentVersion); if (isNew) { saveBinaryVersion(); } return isNew; }
修改后重新编译安卓项目即可。
方法3:自定义BridgeActivity提前初始化版本信息
创建自定义的MainActivity,在父类初始化前提前检查并写入版本信息:
public class MainActivity extends BridgeActivity { @Override protected void onCreate(Bundle savedInstanceState) { SharedPreferences preferences = getSharedPreferences("CapacitorStorage", Context.MODE_PRIVATE); String storedVersion = preferences.getString("binaryVersion", null); if (storedVersion == null) { String currentVersion = BuildConfig.VERSION_NAME; preferences.edit().putString("binaryVersion", currentVersion).apply(); } super.onCreate(savedInstanceState); } }
确保AndroidManifest.xml中引用该自定义Activity。
内容的提问来源于stack exchange,提问作者Jitendera Kumar
相关产品推荐
相关产品推荐

