这种作假的东西其实我是很反感的,有些无良客户居然提要求把1G的改成2G的,2G的改成4G的,

导致我现在都不相信现在手机显示出来的数据了,但是没办法,为了能混口饭吃,唉...

本文提供2种方法,并已Ram Rom为例

1.在TextView.java(frameworks/base/core/java/android/widget/TextView.java),因为三方软件我们没办法直接修改,但是从显示上来看肯定是textview,因而我们可以直接在SetText()的方法中去修改

private void setText(CharSequence text, BufferType type,boolean notifyBefore, int oldlen) {mTextSetFromXmlOrResourceId = false;if (text == null) {text = "";}String packageName = getContext().getPackageName();if (packageName.equals("com.antutu.ABenchMark")|| packageName.equals("com.cpuid.cpu_z")|| packageName.equals("com.ludashi.benchmark")) {//这两个是我们在frameworks/base/core/res/res/valuess/configs.xml中写死的值String fakeRamSize = getContext().getResources().getString(com.android.internal.R.string.custom_ram_size);String fakeRomSize = getContext().getResources().getString(com.android.internal.R.string.custom_rom_size);//然后就是用我们自己定义的字符串去替换,三方的字符串if (fakeRamSize != null && !fakeRamSize.equals("") && s.startsWith("Total:") && s.endsWith("MB")) {String totals = s.substring(s.indexOf(":") + 1, s.indexOf("B") + 1);text = s.replace(totals, fakeRamSize);}if (fakeRomSize != null && !fakeRomSize.equals("") && s.startsWith("Total:") && s.endsWith("GB")) {String totals = s.substring(s.indexOf(":") + 1, s.indexOf("B") + 1);text = s.replace(totals, fakeRomSize);}if (fakeRamSize != null && !fakeRamSize.equals("") && s.contains("/") && s.endsWith("MB")) {String totals = s.substring(s.lastIndexOf("/") + 1, s.lastIndexOf("B") + 1);text = s.replace(totals, fakeRamSize);}if (fakeRomSize != null && !fakeRomSize.equals("") && s.contains("/") && s.endsWith("GB")) {String totals = s.substring(s.lastIndexOf("/") + 1, s.lastIndexOf("B") + 1);text = s.replace(totals, fakeRomSize);}}
}

通过上面的方法,我们就可以把ram rom,替换成我们想要的大小,并且肯定是整数。

2. 大家都看到了,用TextView改的方法很low,对不对?这上面只是3个应用就写了这么多代码,有这么多判断,那如果市面上又出来其他主流检测工具呢???

另外,从性能上面讲,系统里有多少Textview,每个显示之前都要判断是不是三方应用,如果是三方应用,每个TextView还要判断已什么开头,我的天!如果说这不影响性能,鬼才信啊!因此,我们的第二种方法会解决这些问题。

思路是这样的,先考虑三方应用是如何获取系统的ram rom的,至于如何获取,在这里不再详述,大家可以自行百度,经过调试最后发现,这些主流的App获取Rom、Ram的方式是:

//ROM
String path = Environment.getDataDirectory().getPath();
StatFs statFs = new StatFs(path);
long blockCount = statFs.getBlockCountLong();
long blockSize = statFs.getBlockSizeLong();
long availableBlocks = statFs.getAvailableBlocksLong();
long totalBytes = statFs.getTotalBytes();
long freeBytes = statFs.getFreeBytes();//RAM
//RAM是保存在proc/meminfo文件里面的,meminfo的大概结构式这样的
/**MemTotal: 所有可用RAM大小。MemFree: LowFree与HighFree的总和,被系统留着未使用的内存。Buffers: 用来给文件做缓冲大小。Cached: 被高速缓冲存储器(cache memory)用的内存的大小(等于diskcache minus SwapCache)。SwapCached:被高速缓冲存储器(cache memory)用的交换空间的大小。已经被交换出来的内存,仍然被存放在swapfile中,用来在需要的时候很快的被替换而不需要再次打开I/O端口。Active: 在活跃使用中的缓冲或高速缓冲存储器页面文件的大小,除非非常必要,否则不会被移作他用。Inactive: 在不经常使用中的缓冲或高速缓冲存储器页面文件的大小,可能被用于其他途径。SwapTotal: 交换空间的总大小。SwapFree: 未被使用交换空间的大小。Dirty: 等待被写回到磁盘的内存大小。Writeback: 正在被写回到磁盘的内存大小。AnonPages:未映射页的内存大小。Mapped: 设备和文件等映射的大小。Slab: 内核数据结构缓存的大小,可以减少申请和释放内存带来的消耗。SReclaimable:可收回Slab的大小。SUnreclaim:不可收回Slab的大小(SUnreclaim+SReclaimable=Slab)。PageTables:管理内存分页页面的索引表的大小。NFS_Unstable:不稳定页表的大小。要获取android手机总内存大小,只需读取”/proc/meminfo”文件的第1行,并进行简单的字符串处理即可。*/public static String getMemInfoIype(Context context, String type) {try {FileReader fileReader = new FileReader("/proc/meminfo");BufferedReader bufferedReader = new BufferedReader(fileReader, 4 * 1024);String str = null;while ((str = bufferedReader.readLine()) != null) {if (str.contains(type)) {break;}}bufferedReader.close();// \\s表示   空格,回车,换行等空白符// +号表示一个或多个的意思     String[] array = str.split("\\s+");// 获得系统总内存,单位是KB,乘以1024转换为Byteint length = Integer.valueOf(array[1]).intValue() * 1024;return android.text.format.Formatter.formatFileSize(context, length);} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return null;}

因此我们只需要在源头改变数据的大小就OK,由于我对C不是太熟悉,所以开始时我采用的是修改java代码达到目的。下面是修改Rom

// 刚才已分析,ROM用的是BlockCount和blocksize的乘积,由于blocksize固定,所以我们用一下改法
// 在对应项目的system.prop文件中添加 ro.faker.rom.size = 8L
/*
扩展一下
属性名称以“ro.”开头,那么这个属性被视为只读属性。一旦设置,属性值不能改变。
属性名称以“persist.”开头,当设置这个属性时,其值也将写入/data/property。
属性名称以“net.”开头,当设置这个属性时,“net.change”属性将会自动设置,以加入到最后修改的属性名。(这是很巧妙的。 netresolve模块的使用这个属性来追踪在net.*属性上的任何变化。)
属性“ ctrl.start ”和“ ctrl.stop ”是用来启动和停止服务。每一项服务必须在/init.rc中定义.
*/public long getBlockCountLong() {long fakerRomSize = SystemProperties.getLong("ro.faker.rom.size", 0L);return fakerRomSize == 0L? (int) mStat.f_blocks: (int) (1024 * 1024 * 1024L * fakerRomSize / getBlockSizeLong());}当然,getBlockCount()这个方法最好也改一下,这是过时的方法,但是仍可以使用这个方法一般不会有问题,因为大多数都是通过这种方法获取的,但是如果想万无一失,可以通过修改libcore\luni\src\main\native\libcore_io_Linux.cpp文件中的static jobject makeStructStatVfs(JNIEnv* env, const struct statvfs& sb) {static jmethodID ctor = env->GetMethodID(JniConstants::structStatVfsClass, "<init>","(JJJJJJJJJJJ)V");if (ctor == NULL) {return NULL;}return env->NewObject(JniConstants::structStatVfsClass, ctor,static_cast<jlong>(sb.f_bsize),static_cast<jlong>(sb.f_frsize),static_cast<jlong>(sb.f_blocks),static_cast<jlong>(sb.f_bfree),static_cast<jlong>(sb.f_bavail),static_cast<jlong>(sb.f_files),static_cast<jlong>(sb.f_ffree),static_cast<jlong>(sb.f_favail),static_cast<jlong>(sb.f_fsid),static_cast<jlong>(sb.f_flag),static_cast<jlong>(sb.f_namemax));
}这种改法大家有兴趣自己实现吧,尴尬而不是礼貌的微笑

下面是修改RAM的,这个搞得我头皮发麻,因为之前没搞过C和Kernel,提前说明一下,kernel层和framework层是相对独立的,所以在安卓8.1 上之前的在项目的ProjectConfig.mk中定义一个宏,在kernel层通过Makefile编译的方法不能再用了,废话不说,上代码

// 上面分析过meminfo文件了,这里就不多说了,首先你要清楚项目用的内核版本是什么,可以在手机设置里面看到 ,kernel-4.9\fs\proc\meminfo.c,这个文件生成了meminfo
// 这个方法生成的KB
static int meminfo_proc_show(struct seq_file *m, void *v)
{struct sysinfo i;unsigned long committed;long cached;
......#if defined(CONFIG_FAKER_RAM_SIZE) && (CONFIG_FAKER_RAM_SIZE> 0)show_val_kb(m, "MemTotal:       ", CONFIG_FAKER_RAM_SIZE* 1024 * 256L);#elseshow_val_kb(m, "MemTotal:       ", i.totalram);#endifshow_val_kb(m, "MemFree:        ", i.freeram);show_val_kb(m, "MemAvailable:   ", available);show_val_kb(m, "Buffers:        ", i.bufferram);
......
}/*
通过这个CONFIG_FAKER_RAM_SIZE,我们就可以随意改变RAM的大小了,这个东西的配置有讲究,注意
首先在kernel-4.9\fs\proc\Kconfig中定义,格式如下 不能错,bool string的写法类似
config FAKER_RAM_SIZE    int FAKER_RAM_SIZEdefault 0CONFIG_FAKER_RAM_SIZE这个就是,config FAKER_RAM_SIZE 合起来的,定义在对应的项目中
kernel-4.9\arch\arm64\configs\xoxo_debug_defconfig
kernel-4.9\arch\arm64\configs\xoxo_defconfig
两个文件都添加如下配置,数值就是项目中需要的RAM大小1G 就是1
CONFIG_FAKER_RAM_SIZE = 1   错误写法 不能留空格 不能留空格 不能留空格
CONFIG_FAKER_RAM_SIZE=1     正确写法
*/

到此为止,就已经实现要求了,Android O,Android P 测试OK,希望你像IG一样,永不加班!

对了补充一句,能拒绝造假的,坚决拒绝,太特么恶心了!!!

Mr.Alright---安卓如何修改3rd App(某兔兔、某大师、CPU-Z)等检测信息相关推荐

  1. Mr.Alright---安兔兔、cpu-Z等三方检测apk的主频和屏幕尺寸如何修改

    开发中经常会遇到,三方检测apk的监测数据和实际的监测数据不符合的情况,今天来看看 主频 和 屏幕尺寸如何修改,如果有需求改ram rom的可参考这篇 Mr.Alright---安卓如何修改3rd A ...

  2. 手机dpi修改工具_手机dpi修改器app下载-手机dpi修改工具官方版 v1.0_5577安卓网

    手机dpi修改器app下载,这是一款能调节手机dpi的辅助软件,软件设置步骤十分简单,无须root就能调节dpi参数,玩家可以针对不同的游戏选用不同的dpi,这样就能快速找到最佳的手感,欢迎下载! [ ...

  3. 文章向大家介绍安卓逆向,解决app抓包抓不到的问题,主要包括安卓逆向,解决app抓包抓不到的问题使用实例、应用技巧

    本文章向大家介绍安卓逆向,解决app抓包抓不到的问题,主要包括安卓逆向,解决app抓包抓不到的问题使用实例.应用技巧.基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下. 有时候 ...

  4. android 修改rom大小,安卓手机修改G1 ROM

    核心提示:本教程为大家介绍安卓系统修改G1 ROM,希望对大家有帮助. 首先,我们需要安装JKD6,定义电脑的java环境.安装下载的jdk-6u10-rc2-bin-b32-windows-i586 ...

  5. appinventor2 MySQL,写给大家看的安卓应用开发书 App Inventor 2快速入门与实战pdf

    没错,你有能力创建自己的安卓应用,而且一点都不难.AppInventor2,让你分分钟成为应用开发者! 本书由浅入深地介绍了强大的可视化编程工具AppInventor2,任何人都可以用它来开发自己的应 ...

  6. PendingIntent重定向:一种针对安卓系统和流行App的通用提权方法——BlackHat EU 2021议题详解 (下)

    以用户隐私安全为中心,用责任兑付信任,OPPO成立子午互联网安全实验室(ZIWU Cyber Security Lab).实验室以"保护用户的安全与隐私,为品牌注入安全基因"为使命 ...

  7. 安卓架构组件(1)-App架构指导

    相关文章: [翻译]安卓架构组件(2)-添加组件到你的项目中 [翻译]安卓架构组件(3)-处理生命周期 [翻译]安卓架构组件(4)-LiveData [翻译]安卓架构组件(5)-ViewModel [ ...

  8. 计算机毕业设计Python+uniapp+安卓智能衣柜管理APP(WEB+APP+LW)

    计算机毕业设计Python+uniapp+安卓智能衣柜管理APP(WEB+APP+LW) 该项目含有源码.文档.程序.数据库.配套开发软件.软件安装教程 项目运行 环境配置: Pychram社区版+ ...

  9. 安卓手机移动办公App软件的开发

    在移动办公软件的开发和应用中,安卓手机的普及为其奠定良好基础.现阶段,企业信息化水平越来越高,进而提高企业的办公效率和管理效率,在一定程度上增加对移动办公软件的需求量,然而我国的移动办公软件开发和应用 ...

最新文章

  1. python虚拟环境安装pyqt5_python虚拟环境安装pyqt5
  2. 安装程序无法创建新的系统分区也无法定位现有系统分区_如何拥有一个 Windows 10 和 Debian 10 的双系统...
  3. 为什么Fiori客户主数据的头像在异步模式下取不回来
  4. vue父组件向子组件动态传值的两种方法
  5. nginx:启动、重启、关闭、版本查看、安装目录获取
  6. CAD答辩周 -- 与自己相关的几场
  7. EIGRP and the OSPF redistribute
  8. C#写一个URL编码转换GB23121的方法,然后可以取到天气预报
  9. Android MediaCodec学习笔记
  10. 插件//better-scroll(BScroll/滚动插件)使用方法及其在 vue 中使用
  11. mp4格式-播放和断点续播
  12. Unity制作九宫格手机手势解锁密码
  13. winscp 进入mysql命令_Winscp使用密钥登录
  14. endnote中科大版是什么意思_ios14.2rc是什么意思 ios14.2rc版是原来的“GM”版吗
  15. ROS通信机制进阶学习
  16. idea 代码格式化 谷歌_Google Docsmaklet格式化代码
  17. 转:詹姆斯·马奇:领导者容易把自己看成是组织中的英雄
  18. 什么是Verilog HDL?
  19. [Android]ProgressBar进度条
  20. Notion-数据导入

热门文章

  1. 公式符号:箭头带一个小尾巴,箭头带一个竖线是什么符号
  2. 联发科有没有高端处理器_没有高端也无妨 联发科12nm神U出货超过5000万
  3. 总结了9句话,送给所有的大一新生
  4. 信息技术必修丨计算机基础练习题(附答案)
  5. MaxDOS+WinPE
  6. 基于Matlab的饮料瓶识别,以及打印对应信息
  7. PeopleSoft Enterprise应付账款管理
  8. CSS实现霓虹灯按钮,CSS实现炫酷的霓虹灯按钮动画
  9. 自然语言之文本预处理
  10. JLabel标签较为常见部分的使用方法