设置内部sdcard存储下限

在Android中,内部存储有一部分区域是必须预留出来供系统运行应用程序的。

但是在Android原生设计中没有考虑这点,内部存储是可以完全填充满的。

这样会导致系统在运行程序,尤其是需要操作数据库的程序时,出现SQLiteFullException的错误。

解决的方法是在sdcard.c文件中加入一个限制,比如限制当存储低于100M时,不再允许第三方应用存储媒体文件。

如adb push 文件到/storage/sdcard0/中,或录音,拍照等保存到/storage/sdcard0/中。

这100M的空间专门预留出来保证系统程序的运行。

sdcard.c文件所在路径为源码中:system/com/sdcard/sdcard.c

修改完后可直接编译sdcard目录,会生成一个sdcard文件,push到系统/system/bin目录下,重启后即生效。

修改代码:

1.在sdcard.c的开始位置定义宏

// begin:SQLiteFullException happened when device memory is empty.

#define LIMIT_USEDATA_SIZE (100 * 1024 * 1024)

// end:SQLiteFullException happened when device memory is empty.

2.在fuse结构体中增加变量free_blksize

struct fuse {

......

__u64 next_generation;

// begin:SQLiteFullException happened when device memory is empty.

__u64 free_blksize;

// end:SQLiteFullException happened when device memory is empty.

......

}

3.在init方法中做初始化

static void fuse_init(struct fuse *fuse, int fd, const char *source_path,

gid_t write_gid, derive_t derive, bool split_perms) {

......

fuse->next_generation = 0;

// begin:SQLiteFullException happened when device memory is empty.

struct statfs stat;

if (statfs(source_path, &stat) < 0) {

fuse->free_blksize = 0;

} else {

fuse->free_blksize = stat.f_bfree * stat.f_bsize;

}

// end:SQLiteFullException happened when device memory is empty.

fuse->derive = derive;

......

}

4.在handle_write方法中实现功能

static int handle_write(struct fuse* fuse, struct fuse_handler* handler,

const struct fuse_in_header* hdr, const struct fuse_write_in* req,

const void* buffer) {

......

TRACE("[%d] WRITE %p(%d) %[email protected]%llu\n", handler->token,

h, h->fd, req->size, req->offset);

// begin:SQLiteFullException happened when device memory is empty.

if (!strncmp(fuse->root.name, "/data/media", fuse->root.namelen)) {

pthread_mutex_lock(&fuse->lock);

fuse->free_blksize -= req->size;

pthread_mutex_unlock(&fuse->lock);

if (fuse->free_blksize <= LIMIT_USEDATA_SIZE) {

struct statfs stat;

if (statfs(fuse->root.name, &stat) < 0) {

fuse->free_blksize = 0;

return -errno;

} else {

pthread_mutex_lock(&fuse->lock);

fuse->free_blksize = stat.f_bfree * stat.f_bsize;

pthread_mutex_unlock(&fuse->lock);

}

errno = ENOSPC;

return -errno;

}

}

// end:SQLiteFullException happened when device memory is empty.

res = pwrite64(h->fd, buffer, req->size, req->offset);

......

}

设置内部sdcard存储下限

时间: 2024-10-17 04:33:10

设置内部sdcard存储下限的相关文章

Android--数据持久化之内部存储、Sdcard存储

前言 之前一直在讲AndroidUI的内容,但是还没有完结,之后会慢慢补充.今天讲讲其他的,关于数据持久化的内容.对于一个应用程序而言,不可避免的要能够对数据进行存储,Android程序也不例外.而在Android中,提供了几种实现数据持久化的方法.后面会分别介绍. 在Android中,可以使用几种方式实现数据持久化: Shared Preferences:共享参数形式,一种以Key-Value的键值对形式保存数据的方式,Android内置的,一般应用的配置信息,推荐使用此种方式保存. Inte

Android Preference存储、res/raw、asset、openFileOutput、sdcard存储、Cache详解

*res/raw.assets.其它存储的相同点: 两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制. 两者都是只读,是不能存储数据的目录. 相同都可以放文件. *res/raw.assets.其它存储的不同点: res/raw中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即R.id.filename:assets文件夹下的文件不会被映射到R.java中,访问的时候需要AssetManager类. res/raw不可以有目录结构,而assets则可以有目

手机内部file存储

---恢复内容开始--- 将数据存储到文件中 package com.example.hzq_study; import java.io.BufferedWriter;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStreamWriter; import android.app.Activity;import

Android中StatFs获取系统/sdcard存储(剩余空间)大小

package com.orgcent.util; import java.io.File; import android.os.Environment; import android.os.StatFs; public class MemoryStatus { static final int ERROR = -1; /** * 外部存储是否可用 * @return */ static public boolean externalMemoryAvailable() { return andr

数据存储——手机内部文件存储

一.特点 1.存储的是任意类型的文件 2.使用IO输入输出流操作文件 3.存放的目录:/data/data/包名/files/ 4.可以设置不被其他应用操作 5.应用卸载之后,数据同时被删除 二.API 1.FileOutputStream  文件输出流 1-openFileOutput(文件名,操作模式) mode  操作模式 1>MODE_PRIVATE,不能被别的应用访问,覆盖模式 2>MODE_APPEND,不能被别的应用访问,追加模式 2-close( )关闭输出流 2.PrintS

sp,文件以及SDcard存储

XML: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical" > <Button      

Android使用Linux mount获取SdCard存储目录

Android的智能手机各不相同,现在很多Android智能手机都是自带存储,有的还带有扩展内存的Sdcard卡槽. 在Android开发中,很多时候根据Android提供的获取SdCard存储方法获取不到不到存储目录的位置,由于Android的系统是linux系统,所以我想到使用linux命令mouunt来获取linux的挂载目录. 这样呢,基本上在Android上都可以获取到应用数据存放的目录. 使用命令获取到的目录我并没有遍历,如果你还是获取不到,可以把mount获去到的所有目录都遍历一次

【C/C++语言】int 在计算机内部的存储

int在32位计算机中占4个字节,主要是想弄清楚这4个字节的在内存中存放的顺序. 1 #include <iostream> 2 3 using namespace std; 4 5 typedef struct int_char 6 { 7 int a; 8 unsigned char *b; 9 }; 10 11 int main() 12 { 13 int_char A; 14 int i; 15 //test int; 16 A.a=0x01ab02cd; 17 A.b=(unsign

万能存储工具类SDCard存储 /data/data/存储 assets存储 raw存储

万能存储工具类 SDCard存储  /data/data/存储  assets存储 raw存储 粘贴过去就可以用了 <uses-permission android:name="android.permission.INTERNET" /> <!-- SDCard中创建与删除文件权限 --> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS&qu