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
相关产品推荐
相关产品推荐

