修改Android应用硬编码定位坐标后,扫码功能崩溃问题求助
问题分析与修复方案
崩溃原因
- Location对象缺失必要属性:你只硬编码了经纬度的返回值,但应用扫码逻辑可能还依赖
Location实例的其他字段(比如定位精度、提供者、时间戳),这些字段未初始化,后续调用时触发异常。 - double值不完整:
const-wide/high16仅设置double的高16位,剩余位为0,生成的坐标值大概率超出合法范围(经度±180、纬度±90),触发应用的坐标校验逻辑崩溃。 - 上下文逻辑被破坏:原代码调用
getLongitude()时会使用p0指向的Location实例,直接替换成常量可能打乱寄存器状态或后续依赖该实例的逻辑。
修复方法
方法1:构造完整的Location实例(推荐)
不要直接替换返回值,而是创建一个合法的Location对象,填充必要字段后让后续逻辑使用:
# 创建Location实例,指定提供者(比如gps) new-instance p1, Landroid/location/Location; const-string p2, "gps" invoke-direct {p1, p2}, Landroid/location/Location;-><init>(Ljava/lang/String;)V # 设置目标经度(示例:-123.456,完整double十六进制值) const-wide v1, 0xc0531f9e374bc6a8L invoke-virtual {p1, v1, v2}, Landroid/location/Location;->setLongitude(D)V # 设置目标纬度(示例:37.890,完整double十六进制值) const-wide v1, 0x404a9374bc6a7f36L invoke-virtual {p1, v1, v2}, Landroid/location/Location;->setLatitude(D)V # 可选:补充精度、时间戳等必填字段 const v1, 0x3e8 # 精度设置为1000米 invoke-virtual {p1, v1}, Landroid/location/Location;->setAccuracy(F)V # 将新实例赋值给p0,覆盖原对象 move-object p0, p1 # 执行原getLongitude调用,保证上下文逻辑一致 invoke-virtual {p0}, Landroid/location/Location;->getLongitude()D move-result-wide v1
方法2:使用完整的double常量
如果坚持硬编码返回值,必须用const-wide设置完整的double值,避免数值非法:
# 替换原invoke-virtual和move-result-wide,直接设置合法经度值 const-wide v1, 0xc0531f9e374bc6a8L # 对应-123.456
(纬度同理,使用对应坐标的完整double十六进制值)
方法3:检查扫码逻辑的依赖
反编译应用的扫码模块,确认是否在获取经纬度后还会调用Location的其他方法(比如getProvider()、getTime()),如果有,需要确保这些方法也能返回合法值。
内容的提问来源于stack exchange,提问作者Batuhan Aydogan
相关产品推荐
相关产品推荐

