小米应用商店应用下载逻辑分析

查看 31|回复 3
作者:Doratmon   
背景
由于工作需要,最近浅浅分析了一下小米应用商店下载应用的逻辑,发现一些有趣的地方,因此记录一下。
测试环境
小米8(Root)、应用商店_4.97.0、reqable
抓包下载应用请求
需要先安装好reqable CA证书,具体可以参考安装证书 | Reqable · API抓包调试 + API测试一站式工具。
推荐大家都试一下reqable,它是小黄鸟(HttpCanary)的进化版,支持电脑分析手机流量,且能够以应用程序为单位筛选流量信息,比如我只关心“应用商店“的流量,就可以筛选“应用商店”。
比如我要下载小红书APP,点击下载,回到Reqable分析后发现如下请求与下载行为。


image-20250627143021-ag7m23e.png (194.57 KB, 下载次数: 0)
下载附件
2025-6-27 14:55 上传

在响应体中返回了apk的下载地址信息(由字段url和host组成),经测试,访问https://pfga-accelerate.market.xiaomi.com/download/AppStore/0c72ebbf503244d939c7691ffd9e7329b0450b038 确实可以直接下载小红书。
{
  "apkSize": 131785961,
  "apkSizeV2": 131785961,
  "apks": [
    {
      "module": "main",
      "type": "standalone",
      "url": "AppStore/0c72ebbf503244d939c7691ffd9e7329b0450b038",
      "hash": "ef9aa32156929dc0a2056be96ea6b4ef",
      "size": 131785961,
      "diffSize": 0,
      "compressSize": 0
    }
  ],
  "obb": [],
  "dms": [],
  "thumbnail": "https://sf0.market.xiaomi.com/thumbnail/",
  "fitness": 0,
  "id": 69661,
  "releaseKeyHash": "d72f9c996b008aa6a26878fb01253008",
  "channelApkId": -1,
  "refPosition": -1,
  "icon": "AppStore/03afa156710c048c989bbe98e74671d50277854df",
  "unfitnessType": 0,
  "filterCode": 0,
  "versionCode": 8890813,
  "downloadCtl": 0,
  "bspatchVersion": 2,
  "patchConfig": {
    "threadCount": 3
  },
  "compressType": 1,
  "compressLevel": "",
  "packageName": "com.xingin.xhs",
  "versionName": "8.89.0",
  "downloadExtraParams": "{\"useKcgEngine\":false}",
  "ext_apm_extraParamsSid": "default",
  "hosts": [
    "https://pfga-accelerate.market.xiaomi.com/download/",
    "https://fgc0.market.xiaomi.com/download/"
  ],
  "useSelfEngine": false,
  "useCrashEscape": false,
  "useSpeedInstallV2": false,
  "isSystemApp": false,
  "showDeskDynamicIcon": false,
  "traceId": "71bc2994166c4f02bce5290524697502",
  "validateManifest": false,
  "downloadSource": "icon",
  "failOverRules": [
    {
      "errCode": 152,
      "engineCode": 1
    },
    {
      "errCode": 151,
      "engineCode": 1
    },
    {
      "errCode": 111136,
      "engineCode": 1
    },
    {
      "errCode": 111176,
      "engineCode": 1
    },
    {
      "errCode": 150,
      "engineCode": 1
    },
    {
      "errCode": 111128,
      "engineCode": 1
    }
  ],
  "host": "https://pfga-accelerate.market.xiaomi.com/download/",
  "totalDownloadSize": 131785961,
  "exp_id": "1901245,1628665,1851678,1890590,1894878,1805848,1894873,1623262,1846069,1835477,1827793,1887479,1700402,1411227,1689163,1627499,1900104,1812259,1384460,1891782,1497480,1695910",
  "useExpId": "1628665,1700402,1497480,1695910"
}
但是后续的请求中并没有发现对pfga-accelerate.market.xiaomi.com的请求,手机又完成了小红书的安装,这是为什么?
观察响应体的字段信息, 有如下发现
"useSelfEngine": false,  "useSpeedInstallV2": false表明使用了系统级的下载服务,而不是HTTP应用内的下载,"patchConfig": {"threadCount": 3}表明使用了多线程下载配置
综上表明,下载请求不由小米应用商店发出,可能委托给了其他应用。继续分析请求发现,实际下载请求由一个叫MTP本机的应用发出。


image-20250627143321-t3w3vc3.png (85.75 KB, 下载次数: 0)
下载附件
2025-6-27 14:55 上传

MTP本机是一个什么应用?MTP = Media Transfer Protocol(媒体传输协议)是一个由微软开发的协议,用于在不同设备之间传输媒体文件和其他数据。说起来我们并不陌生,使用USB线连接电脑与手机,使用文件传输时就是使用的MTP协议。
小米应用商店为什么委托MTP下载应用?因为MTP是一个系统级应用,可以提高下载的稳定性和效率,利用系统级的文件管理能力,这样用户体验也会更好。
MTP里的代码逻辑就没有分析了,主要梳理小米应用商店的下载过程是由哪些应用参与的。

小米, 商店

yujianlixi   

博主分析挺好
magiclyan   

使用MTP协议也有一个额外好处:
当批量更新下载安装的时候一旦出现未响应等情况
不会造成整个流程被挂起而是继续执行
不过麻烦的也是这个不支持中断机制会继续完成后续行为;无论是否具有root权限
一开始以为是商店的root权限后来发现不是
M1A2   

赞,大佬真厉害!!!
您需要登录后才可以回帖 登录 | 立即注册

返回顶部