You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android无剩余空间SD卡写入无报错问题(Native C++)

Android Native C++ API写入无剩余空间SD卡时无错误返回的严重问题

我们在不同设备、不同Android版本中发现:使用Native C++ API向无剩余空间的SD卡写入数据时,Android不会返回任何错误!

具体表现为:可以成功创建新文件,文件写入函数返回正常状态,但实际并未写入任何内容,磁盘上该文件的实际大小始终为0字节。

复现步骤

  • 使用Android Studio创建新的Native C++项目;
  • 在C++代码中添加测试函数并调用;
  • 通过Android Studio启动项目,确认问题复现。

测试代码

#include <android/log.h>

bool test()
{
    std::srand(std::time(0));

    auto path = "/storage/150E-2D07/Download/test_1";

    FILE *f2 = nullptr;
    bool ok = true;

    std::int64_t bytesWritten = 0;

#define checkok if (!ok) goto _error

    ok = nullptr != (f2 = fopen(path, "wb"));
    checkok;
    ok = ferror(f2) == 0;
    checkok;

    for (int i = 0; ; ++i)
    {
        char a[16*1024];
        for (int i = 0; i < sizeof(a); ++i)
            a[i] = std::rand()%256;

        ok = sizeof(a) == fwrite(a, 1, sizeof(a), f2);
        checkok;

        ok = ferror(f2) == 0;
        checkok;

        ok = !fflush(f2);
        checkok;

        ok = ferror(f2) == 0;
        checkok;

        bytesWritten += sizeof(a);
        if (!(i % 1000))
            __android_log_print(ANDROID_LOG_VERBOSE, "TEST", "writing.. bytes written: %f", bytesWritten/1024.0/1024.0);
    }

    return true;

    _error:
    if (f2)
        fclose(f2);

    return false;
}

额外异常表现

  • 当SD卡无剩余空间时,fwrite函数的运行速度会快很多(远超SD卡的实际性能)。
  • 在带500MB模拟SD卡的Android 13虚拟机中测试:运行应用后写入了1.4GB数据,终止程序后将文件复制到电脑,发现前500MB是真实数据,剩余部分全为零。

这显然是Android系统的严重bug,如此关键的bug为何至今存在且未被重视?

内容的提问来源于stack exchange,提问作者Alexander Dyagilev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 08:33:18