• 请不要在回答技术问题时复制粘贴 AI 生成的内容
Chihiro316
V2EX  ›  程序员

我用 deepseek 逆向了小米运动的卡路里算法,绷不住了

  •  
  •   Chihiro316 · 18h 4m ago · 3329 views

    起因是主播最近在减肥,每天运动量不变,卡路里却忽高忽低,觉得其中必有蹊跷。让 deepseek 帮忙逆向看了一眼,看完是真绷不住。

    先说明前提:我没戴小米手环,手机放裤兜或边走边刷。手环走的是另一套算法,由手环自己算完传给手机,跟下面这些无关。

    我本以为这算法至少符合运动生理学。结果核心就三条:

    按分钟分档,只看步频

    每分钟步数 ≤138 → 0.04 卡/步 139–277 → 0.06 卡/步 ≥278 → 0.10 卡/步

    注意最后那档:278 步/分相当于 4.6 步/秒,那是苏炳添、陈妤颉这种选手的顶速。而且它要的是整整一分钟都这个频率——人类压根做不到。所以实际只有前两档在用。

    距离 = 步数 × 0.6 ,而且每次更新都取整

    不是最后乘一次,是每次同步来 n 步,就算 int(n × 0.6) 再累加。n=13 时 7.8 → 7 ,丢 0.8 米。同步越勤,丢得越多,所以你看到的是 0.59 而不是 0.6 。

    卡路里会重复累加(这是 bug )

    同一分钟内,它每次更新不是把最新值同步过去,而是把这分钟的旧值再往上加一遍。

    我做了个对照:

    19:20 正常走 54 步,没碰手机 → 2.16 卡 ( 54×0.04 ,正确) 19:21 走 40 步,边走边下拉刷新 → 8.28 卡 8.28 ÷ 40 = 0.207 卡/步,比它自己最高档的 0.10 还高一倍。

    日志里这一分钟被写了 8 次:

    2 步/0.08 → 14 步/0.64 → 17 步/1.32 → 28 步/2.44 → 33 步/3.76 → 35 步/5.16 → 38 步/6.68 → 40 步/8.28 每一个都是「上一次的值 + 这一次的累计值」。这就是为什么你越刷它越大。

    复现

    adb logcat -G 128M && adb logcat -c 走 5 分钟 adb logcat -d -v brief > walk.log 搜 srcDataMap = {calories=[...] 看同一个 time= 的 calories 是不是在涨 注意:logcat 分段时每行会重复带 I/fitness_xxx(pid): 前缀,直接删换行会漏读,得先剥前缀。

    写这些不是想证明小米多烂。就是觉得,每次当我觉得世界总不可能这么草台班子吧?现实就冲过来狠狠地给我上一课。

    一个天天摆在首屏、几千万人在看的数字,能偏 30%~100%,而且偏差取决于你刷不刷手机,挺神奇的。

    21 replies  •  2026-10-22 13:53:30 +08:00
    Ipsum
        1
    Ipsum  
       18h 3m ago via Android
    你这算啥?手表异常耗电才恶心
    x86
        2
    x86  
       18h 3m ago via iPhone
    最开始睡眠检测也是纯忽悠,后面改了不知道现在如何了
    shoaly
        3
    shoaly  
       18h 1m ago
    我一直以为是跟心率联动的, 心率是一个最大的指标. 结果实在算步数啊
    moefishtang
        4
    moefishtang  
       14h 39m ago
    可以分析下手环固件试试看 x
    记得是跟小米运动打包在一起的
    试过用 REA 分析过 OPPO 的耳机固件( Deepseek 分析的,后来余额用完了甚至用的豆包工作),小米手环的不知道行不行
    win8en
        5
    win8en  
       14h 34m ago via Android
    小米就是这样,电饭煲也是,之前一个从事电饭煲研发的朋友,说小米电饭煲的各种做饭功能都是忽悠,各阶段的功率都是一样的,只是换个名字给你看
    mzotw2babm
        6
    mzotw2babm  
       5h 10m ago
    也许小米手环负责这个卡路里计算功能的,只是一个二流大学的应届生吧= =
    sentinelK
        7
    sentinelK  
       4h 56m ago
    其实从信号学的角度讲,任何模拟信号的数字化都是一种信号损失的过程,关键就看你怎么取舍。

    一般器械采集这端就有很大误差,你量化转换的层面再精确,采集端精度就很低又有什么意义。

    所以很多生理指标即便是高端专业仪器也都只能看趋势,不能看绝对数值。
    医院等机构不愿意依据第三方检查结果,除了利益和责任原因,以上也是原因之一。
    labubu
        8
    labubu  
       4h 24m ago via Android
    逆天
    Meursau1T
        9
    Meursau1T  
       3h 22m ago
    估计是因为卡路里计算本来就麻烦,他们直接就摆烂了
    mightofcode
        10
    mightofcode  
       3h 18m ago
    小米除了雷军抓的项目
    都会摆烂
    zealotxxxx
        11
    zealotxxxx  
       3h 9m ago
    不止的,我以前帮忙研发过(不是小米)体脂秤的算法......

    我说实话,完全凑合,拟合各类参数搞个大差不差的数据,至于准不准的问题,你就说是不是感觉能不能用吧。

    这类东西,不认真下功夫去做是没办法的,但是严谨弄投入的资源极多。不是每个公司都是苹果。
    Zarkkkk
        12
    Zarkkkk  
       3h 8m ago
    之前买了一个小米手环 10Pro ,就觉得他那个活力值和卡路里目标完全就是扯淡,虽然我也不指望手环这种非专业设备能多准,但是你不能在我打游戏或者躺床上刷手机的时候提示我卡路里达标了吧。。。。。当然也可能是他把我维持人体机能的消耗也算进去了,但是实在是有点绷不住
    Jamieyang
        13
    Jamieyang  
       2h 56m ago
    卡路里本来就是纯估算的,影响因素太多了。小米手环这么便宜的产品,哪有这么多资金来收集数据做清洗,训练模型。更何况一般消费者的数据都跟卡路里看不出关联性。

    从产品的角度来说,这真做出来了,它可能一整代都收不回成本。
    KNaiFen
        14
    KNaiFen  
       2h 49m ago
    帖子是不是编辑过,怎么都在说手环怎么样怎么样,明明开头就写了这是手机的算法
    0xnycth
        15
    0xnycth  
       2h 41m ago
    我认为越早的认识到世界就是个巨大的草台班子这个事实,对人的发展是越好的
    0o0o0o0
        16
    0o0o0o0  
       2h 29m ago
    能不能逆向一下苹果的
    gesse
        17
    gesse  
       2h 23m ago
    刚刚看了一下,感觉还真是。
    makuixuan1983
        18
    makuixuan1983  
       2h 21m ago
    不要太当真就好
    DefoliationM
        19
    DefoliationM  
       2h 6m ago via Android
    小米的东西嘛,用过的都懂,跑分没输过,体验没赢过。
    Dik3047
        20
    Dik3047  
       1h 29m ago
    草台感拉满。刷一下就多算一轮,数字比运动本身还忙。

    我也做 indie 工具( TV Tracker ,追剧进度/日历/提醒,不正片): https://tv-tracker.uk/go?c=v2ex ——对数据可信度同感。
    Woodrow
        21
    Woodrow  
       14 mins ago
    有没有老哥逆向下华为的
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   5787 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 58ms · UTC 06:07 · PVG 14:07 · LAX 23:07 · JFK 02:07
    ♥ Do have faith in what you're doing.