Google Play发布应用触发NumberFormatException问题排查求助
排查Google Play发布后NumberFormatException崩溃问题
问题核心
- 模拟器调试正常,但Google Play下载安装后触发
NumberFormatException: s == null崩溃 - 异常栈最初指向DiaryTwoActivity第22行(未使用的
import androidx.lifecycle.MutableLiveData语句),删除该行后问题仍存在 - 唯一涉及字符串转整数的逻辑:从Firebase Remote Config获取
app_update配置中的app_version并调用toInt(),调试时该值为"46"可正常转换 - 近期变更:compileSDK从32升级到33,minSDKVersion从31降至26(targetSDK保持31)
排查步骤
1. 修复异常栈行号偏移问题
发布版本默认开启R8/ProGuard混淆,混淆后的栈回溯行号会和原始代码不匹配:
- 找到打包时生成的
mapping.txt(路径一般为app/build/outputs/mapping/release/) - 进入Google Play控制台 → 你的应用 → 质量 → 崩溃 → 对应崩溃条目 → 上传该mapping文件,即可得到真实的异常发生行号,定位真正的问题代码
- 注意:删除import语句后需重新生成release包并上传最新mapping,旧映射会导致行号依旧错位
2. 给Firebase Remote Config逻辑加空值防护
调试时app_version为有效值,但线上可能因配置未发布、网络异常、默认值缺失返回null,必须做兜底处理:
String appVersionStr = remoteConfig.getString("app_version"); int appVersion; // 先判断空值和空字符串 if (appVersionStr == null || appVersionStr.trim().isEmpty()) { // 用当前应用的versionCode作为默认值 appVersion = BuildConfig.VERSION_CODE; } else { try { appVersion = Integer.parseInt(appVersionStr); } catch (NumberFormatException e) { // 解析失败也用默认值,可选上报异常到统计平台 appVersion = BuildConfig.VERSION_CODE; } }
同时检查Firebase Remote Config控制台:确保给app_version设置了有效的默认字符串值,避免未拉取到远程配置时返回null
3. 排查SDK版本变更的潜在影响
- 权限检查:minSDK降至26后,确认
INTERNET、ACCESS_NETWORK_STATE权限已在Manifest中声明,Android 6.0+设备上若需动态申请则完成逻辑补充 - Firebase依赖兼容:检查
com.google.firebase:firebase-config等相关依赖版本,确保与compileSDK 33兼容,建议升级到最新稳定版本
4. 本地模拟线上环境测试
- 用
gradlew assembleRelease生成签名release包,安装到覆盖minSDK(26)到targetSDK(31)范围的真实设备上测试 - 模拟网络异常场景:断开网络后启动应用,验证是否因无法拉取Remote Config导致
app_version为null,触发崩溃
内容的提问来源于stack exchange,提问作者Hyejung
相关产品推荐
相关产品推荐

