首先,使用
# stat -f /data
stat -f /data
File: "/data"
ID: c8ba634573858d55 Namelen: 255 Type: ef53
Block Size: 4096 Fundamental block size: 4096
Blocks: Total: 13626988 Free: 10493326 Available: 10438030
Inodes: Total: 3465216 Free: 3441059
看一下手机data分区空间,发现 free与available大小不一致,说明手机有预留空间,
然后在*.rc文件中搜索/system/bin/tune2fs,发现
exec /system/bin/tune2fs -O has_journal -u 10010 -r 51200 /dev/block/platform/bootdevice/by-name/userdata
这句话,是说明为data分区 且uid < 10010的进程保留 51200个块大小的存储空间,也就是192M
但为什么,明明已经做了限制,为什么还能够往内部存储里面写东西呢,
这里就要搞清楚一个问题,这里做的限制是针对uid < 10010的,如果是应用自己填充,也就是填充到/data/data/XXX下,自然会有限制,但是现在的问题是写入到内部存储,也就是写入地址为/sdcard这个空间中,
实际上写入这个空间的真正uid为1023,也就是AID_MEDIA_RW
所以上面的这个预留空间,并不能够让内部存储受到限制,
那怎么怎么改呢,
这就要到/system/core/sdcard/sdcard.c 这个文件下面,
因为我们现在用到的文件系统为sdcardfs,所以直接改的是sdcardfs_setup:
原来:
snprintf(opts, sizeof(opts),
"fsuid=%d,fsgid=%d,%smask=%d,userid=%d,gid=%d",
fsuid, fsgid, multi_user?"multiuser,":"", mask, userid, gid);
改为:
snprintf(opts, sizeof(opts),
"fsuid=%d,fsgid=%d,%smask=%d,userid=%d,gid=%d,reserved_mb=192",
fsuid, fsgid, multi_user?"multiuser,":"", mask, userid, gid);
为什么是192呢,因为之前预留的也是192M,所以在这里内部存储也给预留192M