在我们的日常工作过程中,经常会遇到线上出现问题,但是又需要模拟到某个城市以复现问题,模拟定位成为了必不可少的需求,但是又不能给正式环境留下漏洞以实现模拟位置。那么如何模拟位置呢,用什么工具可以做到呢,下面进行阐述。
既然要定位,那么我们肯定要了解清楚定位的基本原理。
定位方式分析:
定位可分为:GPS定位,基站定位,WIFI定位
GPS定位:需要GPS硬件支持,直接和卫星交互来获取当前经纬度。
优点:可在无网络时使用。
缺点:可在户外使用、比较耗电。
基站定位:一般我们手机附近有三个基站及以上,基站间进行三角定位,由于基站的位置是不变的,发出电磁波利用电磁波的中转时间推测出手机所在的坐标;
优点:只要有基站就能知道设备的大概位置。
缺点:定位精准度不高,偏远地区无法使用,如果基站信息更新不及时定位不准确。
WIFI定位:我们的WIFI都有一个固定的Mac地址,我们安装无线路由器以后,手机会搜集周围的WIFI信息,并通过定位SDK上传到云端,通过WIFI的SSID+WIFI信息去云端数据库进行匹配来确定用户的位置,这就是为什么搬家以后定位还是在以前住的地方的原因,因为云端数据库信息还没有来得及更新,只有时间长了,算法根据权重进行了更正,位置才可能发生变化。也就解释了为什么打开地图类软件会让你开启WIFI提高定位精准度,虽然你可能没有连上WIFI
优点:只要有wifi就能使用。
缺点:户外无法使用,商场干扰强。
工具选择xposed: 工具作用可修改app中的任何方法。
搭建xposed环境:可参考:https://repo.xposed.info/module/de.robv.android.xposed.installer
查询全国基站数据:可参考:https://location.services.mozilla.com/downloads
查询基站是否可用:可进行测试:http://api.cellocation.com:82/cell.html
查询经纬度信息:可参考 http://api.map.baidu.com/lbsapi/getpoint/index.html
通过以上分析我们就可以利用工具模拟位置:
思考,如何屏蔽到不需要的定位呢,以避免暴漏真是位置:
GPS定位可通过修改经纬度。对应安卓中的类 Location -> getLatitude,getLongitude
基站定位可通过修改当前基站编号,屏蔽附近基站,来达到目的。对应安卓中的类 TelephonyManager -> getNeighboringCellInfo,getAllCellInfo,getCellLocation
WIFI定位可通过屏蔽附近WiFi达到目的:对应安卓中的类 WifiManager -> getScanResults
每次只是用一种方式进行定位以避免位置暴漏:
这里我们举例使用基站进行定位:
使用Xposed工具屏蔽GPS定位,屏蔽Wifi定位,下载查询全国基站数据后解压,查询某地的经纬度信息,通过经纬度查询基站数据信息(需要利用正则表达式查询)
例如: 通过以上步骤查询到的基站信息为:loc:4301,cid:20986
通过查询基站是否可用:
利用xposed设置当前基站信息:
运行重启设备后,就可正常修改位置;
总结与反思:
xposed的诞生无疑是把双刃剑,对我们软件测试复现Bug带来的极大的便利,同时由于他强大的功能也使的一些灰色产业兴起。不得不使我们产生极大的危机感,因此我们应该更加致力于App数据安全中,使用各种检测技术保护数据安全。
当然实现模拟定位的方式还有很多,例如使用Magisk,EdXposed,模拟器等…, 这只是一个方向,更重要的是他很强大,我们必须重视,保护数据安全。