设置手机存储作假统一切换指令及接口
修改一套UI下的内存显示大小,Rom的显示是由"/system/private/.space"和"/system/private/.spaceinfo"的值控制的
一:电脑端
1.确定电脑端默认Rom大小
a. 打开 /kernel-3.10/fs/statfs.c 。(该文件无法使用项目宏,可做分支)
查看 logonum[] 的值是否为:"/proc/env_logo_id" ,与 /frameworks/base/core/java/android/os/ProjectManager.java中
writeLogoId(int value)方法的文件路径要一样。
b.
注意一下变量 :
static char filepath[] = "/system/private/.space";
static char realfilepath[] = "/system/private/.spaceinfo";
static char logonum[] = "/proc/env_logo_id";
缓存的大小 : static char buf[16];
c.读取logoid的方法 : static int zhanFan_readLogo(char *path)
d.在user_statfs(const char __user *pathname, struct kstatfs *st)函数中修改,包括默认UI或指定UI下的Rom,方法如下
int user_statfs(const char __user *pathname, struct kstatfs *st)
{
struct path path;
int error;
unsigned int lookup_flags = LOOKUP_FOLLOW|LOOKUP_AUTOMOUNT;
retry:
error = user_path_at(AT_FDCWD, pathname, lookup_flags, &path);
if (!error) {
error = vfs_statfs(&path, st);
path_put(&path);
if (retry_estale(error, lookup_flags)) {
lookup_flags |= LOOKUP_REVAL;
goto retry;
}
}
int type = -1;
u64 customizedSize128G = 128*1024;
u64 customizedSize64G = 64*1024;
u64 customizedSize32G = 32*1024;
u64 customizedSize16G = 16*1024;
u64 customizedSize8G = 8*1024;
u64 customizedSize4G = 4*1024;
u64 asize = 1024;
u64 bsize = 4096;
u64 orgblocks = st->f_blocks;//手机的真实Rom大小
char *filterpath = "/mnt/shell/emulated";
if (strcmp(pathname,"/data/log_temp/boot/") != 0){
printk("zhanfan orgblocks = %lld \n",orgblocks);//真实Rom大小
printk("zhanfan st->f_bsize = %ld \n",st->f_bsize);//区块大小
printk("zhanfan st->f_bfree = %lld \n",st->f_bfree);//真实可用Rom大小
printk("zhanfan st->f_bavail = %lld \n",st->f_bavail);
}
if (strcmp(pathname,filterpath) == 0
|| strcmp(pathname,"/data") == 0
|| strcmp(pathname,"/data/media") == 0
|| strcmp(pathname,"/storage/sdcard0") == 0){
zhanFan_getNameByPid(sys_getpid(),cmdlinebuff,pnamebuff,sizeof(cmdlinebuff));
if (zhanFan_checkPIDName(pnamebuff) && zhanFan_readSpaceFile() != 1 ){
type = zhanFan_readSpaceFile(); //读取".space"文件,获得数据比较运算,反馈给电脑端作假后的Rom值
if (type == 4){
st->f_blocks = (customizedSize4G*asize*asize/bsize);
}else if (type == 8){
st->f_blocks = (customizedSize8G*asize*asize/bsize);
}else if (type == 16){
st->f_blocks = (customizedSize16G*asize*asize/bsize);
}else if (type == 32){
st->f_blocks = (customizedSize32G*asize*asize/bsize);
}else if (type == 64){
st->f_blocks = (customizedSize64G*asize*asize/bsize);
}else if (type == 128){
st->f_blocks = (customizedSize128G*asize*asize/bsize);
}else{
if( zhanFan_readLogoFile() == -1 || zhanFan_readLogoFile() == 12){//默认UI时logoid为-1
if((st->f_blocks > 0) && (st->f_blocks < (customizedSize4G*asize*asize/bsize))) {//真实Rom在0到4G之间
st->f_blocks = (customizedSize4G*asize*asize/bsize);
} else if((st->f_blocks > (customizedSize4G*asize*asize/bsize)) && (st->f_blocks < (customizedSize8G*asize*asize/bsize))) {
st->f_blocks = (customizedSize8G*asize*asize/bsize);
}
} else if(zhanFan_readLogoFile() == 21){//UI_21时 返回16G
st->f_blocks = (customizedSize16G*asize*asize/bsize);
} else if(zhanFan_readLogoFile() == 22){//UI_22时 返回16G
st->f_blocks = (customizedSize64G*asize*asize/bsize);
} else {
st->f_blocks = (customizedSize8G*asize*asize/bsize);
}
printk("zhanfan st->f_blocks = %lld \n",st->f_blocks);//查看作假Rom的大小
printk("zhanfan zhanFan_readLogoFile() = %d \n",zhanFan_readLogoFile());//查看logo_id
}
u64 result = 0;
result = st->f_blocks - orgblocks;//作假Rom和真实Rom的差值给可用内存做补指
st->f_bfree += result;//作假Rom可用内存
st->f_bavail += result;
}
}
以上方法解析: 以上是对可用内存做减法运算,显示可用内存很大
orgblocks : 手机的真实Rom大小
zhanFan_readLogoFile() == -1 默认UI时logoid为-1
一下是对可用内存做乘法运算,显示可用内存根据作假总Rom的变化而变化
/*
u64 result = 0;
result = st->f_blocks;
do_div(result,orgblocks);//算出真实Rom和作假Rom的比值
st->f_bfree = st->f_bfree*result;//真实可用Rom乘上比值,获得作假可用Rom
st->f_bavail = st->f_bavail*result;
*/
e.
编译 : make kernel
然后 : make bootimage
烧入手机
二:统一切换指令
a.打开/frameworks/base/core/java/android/os/ProjectManager.java
/**
* Rom ;文件不存在时,获取各分支或UI 下的Rom默认值大小,
* 没有文件时,参与统一切换指令的显示方法,
* 要与/kernel-3.10/fs/statfs.c中各UI的默认值保持一致
* ROM 1 (真实), 4 (4G),8 (8G) ,16(16G) ,32(32G),64(64G),128(128G) 没文件时读到 8
*
*/
private static final String INTERNAL_DIR = "/system/private/";
private static final String SPACE_FILE_NAME = ".space";
public static int getRomSpace(){
byte rom_flag = 0;
File rom_File = new File(INTERNAL_DIR,SPACE_FILE_NAME);
//if file not exist,first write
if(!rom_File.exists()){
if(FeatureOption.CUSTOM_PROJECT_C && isUi22() ){
return 128;//返回 默认128G
} else if(FeatureOption.CUSTOM_PROJECT_B ){
return 64;//返回 默认64G
} else if( FeatureOption.CUSTOM_PROJECT_A && isUi13() ) ){
return 32;//返回 默认32G
} else if( FeatureOption.CUSTOM_PROJECT_A && isUi17() ){
return 16;//返回 默认16G
} else if(FeatureOption.CUSTOM_PROJECT_C && isUi12() ){
if(getRealBigToailSpace()){//根据判断返回 4G / 8G
return 8;//返回 默认8G
}
return 4;//返回 默认4G
}
return 8;
}
try {
FileInputStream fis = new FileInputStream(rom_File);
rom_flag = (byte)fis.read();
fis.close();
} catch (Exception e) {
Log.e(TAG,"readRomSpace e " + e.toString());
}
Log.e(TAG,"space="+rom_flag);
return (int)rom_flag;
}
/**
* getTrueRomValue
* 是否大于4G 大于时 返回 1 小于4G时 返回 0;
*
*/
public static int getTrueRomValue() {
// 获取可用磁盘大小类
StatFs statFs = new StatFs(Environment.getDataDirectory().getAbsolutePath());
// 获取可用区块的个数<