Ionic Capacitor应用上架Google Play后启动报错求助
NegativeArraySizeException问题 核心原因分析
这个java.lang.NegativeArraySizeException: -1报错几乎都是Release版本混淆(ProGuard/R8)导致关键类/方法被错误裁剪引发的——模拟器运行的是未启用混淆的Debug版本,所以正常;而Google Play发布的是混淆后的Release包,部分代码被破坏后出现数组长度计算为负数的异常。
分步解决方案
第一步:临时禁用混淆验证问题
修改android/app/build.gradle中的Release构建配置,关闭混淆和资源压缩:buildTypes { release { minifyEnabled false shrinkResources false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } }重新打包上传至Play内部测试渠道,安装后验证是否还报错。如果恢复正常,即可确认是混淆规则问题。
第二步:添加Capacitor专属混淆规则
若禁用混淆有效,在android/app/proguard-rules.pro中添加Capacitor官方推荐的混淆规则,避免核心类被裁剪:# 保留Capacitor核心类与插件 -keep class com.getcapacitor.** { *; } -keep class com.getcapacitor.plugin.** { *; } # 保留注解、JS接口与签名信息 -keepattributes *Annotation* -keepattributes JavascriptInterface -keepattributes Signature # 忽略Capacitor相关警告 -dontwarn com.getcapacitor.**若应用使用了第三方原生插件,需额外添加对应插件的混淆规则(可查看插件官方文档获取)。
第三步:升级Capacitor到最新稳定版
部分旧版本Capacitor存在Release打包的已知Bug,执行以下命令升级核心库与Android平台:npm install @capacitor/core@latest @capacitor/android@latest npx cap sync android升级完成后重新打包测试。
第四步:定位具体混淆问题(进阶)
查看Release打包生成的映射文件android/app/build/outputs/mapping/release/mapping.txt,找到报错栈中a1.a.u对应的原始类和方法名(混淆会将类名缩写为短标识),针对性添加保留规则,示例:-keep class com.yourpackage.YourProblemClass { void yourProblemMethod(); }第五步:检查资源文件完整性
极少数情况是资源文件损坏导致的异常,比如Drawable资源格式错误,在Release打包时被错误处理。可尝试删除损坏资源,或保持shrinkResources false关闭资源压缩后验证。
内容的提问来源于stack exchange,提问作者Salini Vijayan

