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

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

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

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

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

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

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

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

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

    我也做 indie 工具( TV Tracker ,追剧进度/日历/提醒,不正片): https://tv-tracker.uk/go?c=v2ex ——对数据可信度同感。
    Woodrow
    Woodrow
    Oct 22❤️2
    21
    有没有老哥逆向下华为的
    iv8d
    iv8d
    Oct 22
    22
    小米产品可能就手机 MIUI 还有点技术,其他都是能跑起来就算吧,这也是很多不停上产品企业的通病,根本静不下心来做产品,你看现在的美的等都差不多了。
    PopRain
    PopRain
    Oct 22
    23
    @zealotxxxx 晕。。。。我是 PRO 的用户
    lovelyxiaod
    24
    同求逆向苹果, 小米是这样不奇怪.
    sl797
    sl797
    Oct 22
    25
    那你再逆向下 keep,看看是不是半斤八两
    chargeAha
    chargeAha
    Oct 22
    26
    @KNaiFen 也一样的感觉,都在讨论手环了
    hailaz
    hailaz
    Oct 22
    27
    要不把竞品都逆向一下,看看是惊还是喜
    akakidz
    akakidz
    Oct 22
    28
    感谢老哥的解读,早就发现数据偏移严重的问题了,现在我主要用来看心率和监测睡眠,饮食摄入和消耗已经同步给 GPT 记录了,估出来的值还可以...至少在体重上的反馈是符合预期的
    netblue
    netblue
    Oct 22
    29
    手表也是,只要一切换模型,心率就变的不一样了,哪怕你都没运动。
    Chihiro316
    Chihiro316
    OP
    Oct 23
    30
    @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 ,是正经的运动生理学模型。
    JinleeWe
    JinleeWe
    Oct 23❤️1
    31
    不知道你对一个揣在兜里的手机算卡路里报有多大期待。。。。
    他也就能读取步数做个猜测啊,难道同步微信支付宝看看你买了多少可乐和汉堡么?
    手机他又没有心率和血氧传感器
    kujo
    kujo
    Oct 29
    32
    热量无所谓啦,看看就行。我想知道心率准不准
    kujo
    kujo
    Oct 29
    33
    @akakidz 睡眠估计也不准
    libasten
    libasten
    Oct 30 via Android
    34
    有人逆向华为,佳明的吗?哈哈
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1898 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 206ms · UTC 08:12 · PVG 16:12 · LAX 00:12 · JFK 03:12
    ♥ Do have faith in what you're doing.