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

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

  •  
  •   Chihiro316 · 1 day ago · 5739 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%,而且偏差取决于你刷不刷手机,挺神奇的。

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

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

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

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

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

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

    我也做 indie 工具( TV Tracker ,追剧进度/日历/提醒,不正片): https://tv-tracker.uk/go?c=v2ex ——对数据可信度同感。
    Woodrow
        21
    Woodrow  
       23h 54m ago   ❤️ 2
    有没有老哥逆向下华为的
    iv8d
        22
    iv8d  
       23h 12m ago
    小米产品可能就手机 MIUI 还有点技术,其他都是能跑起来就算吧,这也是很多不停上产品企业的通病,根本静不下心来做产品,你看现在的美的等都差不多了。
    PopRain
        23
    PopRain  
       22h 8m ago
    @zealotxxxx 晕。。。。我是 PRO 的用户
    lovelyxiaod
        24
    lovelyxiaod  
       22h 4m ago
    同求逆向苹果, 小米是这样不奇怪.
    sl797
        25
    sl797  
       22h 2m ago
    那你再逆向下 keep,看看是不是半斤八两
    chargeAha
        26
    chargeAha  
       21h 22m ago
    @KNaiFen 也一样的感觉,都在讨论手环了
    hailaz
        27
    hailaz  
       21h 12m ago
    要不把竞品都逆向一下,看看是惊还是喜
    akakidz
        28
    akakidz  
       20h 48m ago
    感谢老哥的解读,早就发现数据偏移严重的问题了,现在我主要用来看心率和监测睡眠,饮食摄入和消耗已经同步给 GPT 记录了,估出来的值还可以...至少在体重上的反馈是符合预期的
    netblue
        29
    netblue  
       20h 39m ago
    手表也是,只要一切换模型,心率就变的不一样了,哪怕你都没运动。
    Chihiro316
        30
    Chihiro316  
    OP
       51 mins ago
    @sl797 @hailaz

    keep 的

    伪代码( Ghidra 反编译,已整理)
    c


    // 1. 由配速估算心率(无心率设备时)
    hr = estimateHR(speed);

    // 2. 心率夹取到 [60, min(254, 220−年龄)]
    if (hr < 254 && hr <= 220 - age && hr >= 60) keep = hr;
    else keep = 65;

    // 3. 分性别计算
    if (sex == MALE) {
    bmr = 13.75*W + 66.5 + 5.003*H; // Harris-Benedict 男
    activity = (0.6309*hr - 55.0969 + 0.1988*W + 0.2017*A) / 4.184; // Keytel 男
    ageTerm = 6.775*A;
    } else {
    bmr = 9.563*W + 655.1 + 1.85*H; // Harris-Benedict 女
    activity = (0.4472*hr - 20.4022 - 0.1263*W + 0.074*A) / 4.184; // Keytel 女
    ageTerm = 4.676*A;
    }

    restPerSec = ((bmr - ageTerm) / 1440) / 60;
    rate = max(activity/60, restPerSec); // 不低于基础代谢

    total += (t - tPrev) * rate; // 按时间积分


    Keytel 方程 + Harris-Benedict ,是正经的运动生理学模型。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   4598 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 107ms · UTC 05:48 · PVG 13:48 · LAX 22:48 · JFK 01:48
    ♥ Do have faith in what you're doing.