Android应用Debug包运行正常 生产包登录后无法跳转首页问题求助
可能的原因
- 混淆规则配置错误:90%以上Debug包正常、生产包异常的问题都来源于此。你的生产包大概率开启了R8/ProGuard混淆,而登录接口用到的
RetroResponse、内部嵌套的Data实体类没有配置混淆白名单,也没有添加@SerializedName注解绑定JSON字段。混淆会把实体类的字段名重命名为a、b、c这类无意义名称,导致JSON解析时无法匹配接口返回的字段,解析过程抛出异常被你代码中的catch块捕获,直接跳过了后续的跳转逻辑。你的代码中catch块仅打印堆栈,没有任何错误提示,就会出现加载消失、停在登录页的现象。 - 空指针未处理:你的代码没有判断
response.isSuccessful(),也没有对response.body()做非空校验,直接调用response.body().getStatus(),如果接口返回异常导致body为空,会直接触发空指针异常进入catch块,跳过跳转逻辑。 - 页面实例失效:如果用户在登录请求返回前退出了登录页面、Fragment被销毁,
getActivity()会返回null,此时startActivity逻辑不会执行,也不会有报错提示。 - 实体类字段类型不匹配:如果接口返回的
status字段是字符串类型(比如"200"),但你的RetroResponse类中用int类型接收,解析时会抛出类型转换异常,进入catch块跳过后续逻辑。
排查解决步骤
- 优先验证混淆问题:本地打开启混淆的Release包直接安装测试,不要上传Google Play,如果能复现问题,直接给所有JSON序列化用到的实体类添加
@SerializedName注解,同时在混淆规则文件中添加实体类的白名单规则,示例如下:
-keep class 你的包名.response.** { *; } # 替换成你存放RetroResponse等实体类的包路径
- 完善代码的异常处理:
进入onResponse后先判断response.isSuccessful() && response.body() != null,再读取body内容
在catch块中添加错误日志打印或者用户提示,避免异常被静默吞掉 - 修复代码里的逻辑错误:登录成功后你往SharedPreferences写入的
isLogin值为false,属于明显的笔误,会导致后续登录状态判断出错。 - 校验
UserHomeActivity配置:确认AndroidManifest.xml中该Activity的注册配置和Debug版本没有差异,没有添加额外的启动限制。
内容的提问来源于stack exchange,提问作者Umang Upadhyay
相关产品推荐
相关产品推荐

