十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

MozStumbler上传机制揭秘:geosubmit API、周期告警与离线重试的完整链路

MozStumbler上传机制揭秘:geosubmit API、周期告警与离线重试的完整链路 MozStumbler上传机制揭秘geosubmit API、周期告警与离线重试的完整链路【免费下载链接】MozStumblerAndroid Stumbler for Mozilla项目地址: https://gitcode.com/gh_mirrors/mo/MozStumblerMozStumbler 是 Mozilla 出品的 Android 定位数据上传工具Stumbler它会扫描周边的 WiFi、基站与 GPS 信号并把观察记录批量上传到 Mozilla 的 geosubmit API用来持续改善浏览器定位精度。本文将带你完整看懂它的上传链路本地如何落盘排队、周期告警如何定时触发上传、以及网络不可达时如何离线重试一篇讲透这条数据上报通道的工作原理。一、整体链路扫描 → 落盘 → 告警 → 上传MozStumbler 的上传并不“边扫边传”而是分四层流水线扫描落盘StumblerService 负责扫描观察数据先写入本地磁盘队列reports 目录而不是直接发网络请求状态感知存储队列从空变满时服务层收到notifyStorageStateEmpty回调决定是否排定上传告警周期告警UploadAlarmReceiver通过 Android 的 AlarmManager 注册定时/重复广播到点唤醒上传服务实际上传AsyncUploaderMLS在独立线程逐批提交数据到 geosubmit API成功才删除失败则保留重试。核心代码分布在两个模块路径下上传线程libraries/stumbler/src/main/java/org/mozilla/mozstumbler/service/uploadthread/存储服务与 API 客户端libraries/stumbler/src/main/java/org/mozilla/mozstumbler/service/stumblerthread/二、geosubmit API数据如何离开手机真正发起网络请求的是MLSLocationService位于libraries/stumbler/src/main/java/org/mozilla/mozstumbler/service/core/http/MLSLocationService.java。它封装了两个端点提交观察数据https://location.services.mozilla.com/v1/geosubmit即 geosubmit API所有扫描结果都 POST 到这里反向定位查询https://location.services.mozilla.com/v1/geolocate用于“我知道 WiFi/基站求坐标”的场景。提交时会附带 Mozilla API Key 作为查询参数?key...密钥从应用偏好Prefs.getMozApiKey()读取。注意一个细节批量数据在落盘前已经做过 gzip 压缩提交时以precompressed标志告知 HTTP 层不要再二次压缩既省流量也省 CPU。三、周期告警UploadAlarmReceiver 如何定时触发上传上传的“闹钟”由UploadAlarmReceiverlibraries/stumbler/src/main/java/org/mozilla/mozstumbler/service/uploadthread/UploadAlarmReceiver.java统一管理有两种工作模式模式触发方式场景主动模式App 内扫描重复告警isRepeating true固定周期唤醒用户在 App 中持续扫描时被动模式Firefox 宿主单次告警isRepeating false带小延迟浏览器启动时顺带上传积压数据设计上有几个值得新手学习的小技巧防抖scheduleAlarm记录了上一次的等待秒数与重复标志参数不变时不重复注册避免告警被无意义地反复重置唤醒链路告警广播 → 启动UploadAlarmServiceIntentService→ 检查网络 → 创建AsyncUploaderMLS并execute全程不占用主线程上传入口共三处手动上传按钮、停止扫描时立即上传、告警定时器——三者共享同一个AsyncUploader并用AtomicBoolean isUploading做互斥保证同一时刻只有一个上传任务在跑。告警的注册与取消逻辑写在StumblerServicelibraries/stumbler/src/main/java/org/mozilla/mozstumbler/service/stumblerthread/StumblerService.java中队列空了就cancelAlarm队列不空且处于主动模式就排定重复告警。四、离线重试本地队列 失败保留 过期清理这是整套机制最优雅的部分——上传失败不是错误而是常态。AsyncUploader.uploadReportslibraries/stumbler/src/main/java/org/mozilla/mozstumbler/service/uploadthread/AsyncUploader.java逐批取出队列数据按 HTTP 结果分三种处理2xx 成功计入上传统计观测数、基站数、WiFi 数与字节数然后从磁盘删除该批次400 Bad Request判定为脏数据格式损坏等直接删除该批次避免它永远卡住队列其他错误断网、5xx 等不删除反而调用saveAllInMemoryToDisk()把内存中的待传数据立刻刷盘等下次告警周期自然重试。也就是说离线时数据只是安静地躺在磁盘队列里由DataStorageManager位于libraries/stumbler/src/main/java/org/mozilla/mozstumbler/service/stumblerthread/datahandling/DataStorageManager.java管理下一次周期告警到来时会自动继续提交无需用户干预。为防止队列无限膨胀还有两道“保险丝”过期清理告警服务每次唤醒时先检查最旧批次的时间若超过maxWeeksStored周数据保留上限则删除全部数据并取消告警流量保护checkCanUpload会检查“仅 WiFi 上传”偏好若用户开启了useWifiOnly而当前不在 WiFi 环境本次周期直接跳过数据继续留存。五、给想深入源码的读者推荐阅读顺序按这条链路阅读源码效率最高libraries/stumbler/src/main/java/org/mozilla/mozstumbler/service/uploadthread/UploadAlarmReceiver.java—— 告警调度与唤醒入口libraries/stumbler/src/main/java/org/mozilla/mozstumbler/service/uploadthread/AsyncUploader.java—— 批量上传循环与失败处理libraries/stumbler/src/main/java/org/mozilla/mozstumbler/service/uploadthread/AsyncUploaderMLS.java—— 上传成功后的统计回写libraries/stumbler/src/main/java/org/mozilla/mozstumbler/service/core/http/MLSLocationService.java—— geosubmit / geolocate API 封装libraries/stumbler/src/main/java/org/mozilla/mozstumbler/service/stumblerthread/StumblerService.java—— 告警的注册、取消时机想跑测试验证行为可以看libraries/stumbler/src/test/java/org/mozilla/mozstumbler/service/uploadthread/UploadAlarmReceiverTest.java它恰好覆盖了“重复告警防抖”这条规则。六、小结MozStumbler 的上传机制值得做后台数据上报的开发者借鉴磁盘队列保证离线不丢数据周期告警以低功耗方式驱动重试按 HTTP 语义精确区分“可重试”与“脏数据”再配合过期清理防止无限膨胀。整套链路不依赖常驻进程仅在到点时短暂唤醒兼顾了数据完整性与 Android 的省电要求。【免费下载链接】MozStumblerAndroid Stumbler for Mozilla项目地址: https://gitcode.com/gh_mirrors/mo/MozStumbler创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表