You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 13:43:11