Android 11 系统修改无源码第三方应用的显示内容

【问题描述】

使用安兔兔,AIDA64等apk检测时,部分数值不正确

【问题分析】

这里展开聊聊为什么检测出来的内部存储以及运行内存要比真实的要小

为什么应用中的内部存储总大小比物理内部存储小?

实际是16GB的机器,但是被检测出来的只有9025MB,可用的也只有8446MB。差异如此之大,肯定是APK的计算出了问题

使用指令查看内部存储,发现实际只计算了挂载/data路径的大小,并没有把系统空间计算进来

9242148 / 1024 = 9025.5


为什么应用中的总内存比物理内存小?

关系:
物理内存 >= memblock管理的内存 > 伙伴系统管理的内存
物理内存 = memblock管理的内存 + 预申请内存
memblock管理的内存 = 伙伴系统管理的内存 + reserverd内存(memblock的reserved type)


/proc/meminfo中的MemTotal相比物理内存少了两个部分:

  • kernel进入前预申请的部分,此时memblock还未初始化。这部分的大小可以统计 /d/memblock/memory相对物理内存少的部分。
  • kernel reserved的部分。这部分内存的大小可以统计/d/memblock/reserved中的各部分之和。

而APK检测出来的运行内存数值一般为/proc/meminfo 中的MemTotal,正是因为缺少了reserverd内存以及 预申请内存,所以显示比实际的物理内存要少。

//关系:4006912K(memblock管理的内存) = 3685040K + 297296K + 24576K
//4006912K比起真正的4GB(4194304), 少了187392K,这部分就是预申请内存的大小
//3685040K 是此时 totalram_pages*4K 的大小, 也即memblcok管理的memory type部分
I/Memory  (    0): 3685040K/4006912K available (11702K kernel code, 878K rwdata, 
			2660K rodata, 640K init, 1807K bss, 297296K reserved, 24576K cma-reserved)
MemTotal:        3718748 kB
为什么开机时 totalram_pages的大小(上例中3685040K) 和 totalram_pages的大小(上例中3718748K) 开机后 不一致呢?

这是因为memblock管理的reserved type中部分内存在初始化完毕后释放了,添加到了伙伴系统(buddy system)中. 详细代码见free_initmem()

【修改对策】

虽说这个并不是系统的bug,但是改还是要改的,那么怎么通过修改系统源码实现更改无源码的第三方APK里的显示内容呢?

一开始我的思路其实是在StringBuilder中判断特定的字符串,但这个对策的弊端在于无法判断包名,如果其他应用也有用到相同的字符串,就可能会有意想不到的bug。

所以最终选择在TextView.java 中修改

public void append(CharSequence text, int start, int end) {
    if (!(mText instanceof Editable)) {
        setText(mText, BufferType.EDITABLE);
    }

    ((Editable) mText).append(text, start, end);

    if (mAutoLinkMask != 0) {
        boolean linksWereAdded = Linkify.addLinks(mSpannable, mAutoLinkMask);
        // Do not change the movement method for text that support text selection as it
        // would prevent an arbitrary cursor displacement.
        if (linksWereAdded && mLinksClickable && !textCanBeSelected()) {
            setMovementMethod(LinkMovementMethod.getInstance());
        }
    }
    
    // Text_Replace start 
    CharSequence typetext = getCustomText(mText);
    if (typetext != null) {
        setText(typetext, mBufferType);
    }
    // Text_Replace end
}

public final void setText(CharSequence text) {
    // Text_Replace start
    CharSequence typetext = getCustomText(text);
    if (typetext != null) {
        text = typetext;
    }
    // Text_Replace end
    setText(text, mBufferType);
}

private CharSequence getCustomText(CharSequence text) {
    if (text == null) {
        return null;
    }

    String packagename = mContext.getPackageName();
    if (packagename.startsWith("com.antutu.ABenchMark")
            || packagename.startsWith("com.cpuid.cpu_z")
            || packagename.startsWith("com.abs.cpu_z_advance")
            || packagename.startsWith("com.finalwire.aida64")) {
       

        String typeText = text.toString();
        if (typeText.contains("23.08")) { 
            typeText = typeText.replace("23.08", "32.00");
        }  else if (typeText.contains("3631")) { 
            typeText = typeText.replace("3631", "4096");
        }
        return typeText;
    }

    return text;
}

【参考文章】

Android内存占用分析 - 知乎

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CruiseYoung提供的带有详细书签的电子书籍目录 http://blog.csdn.net/fksec/article/details/7888251 该资料是《Android高级编程》的代码 对应的书籍资料见: Android高级编程 基本信息 原书名: Professional Android Application Development 原出版社: Wrox 作者: (英)Reto Meier 译者: 王鹏杰 霍建同 出版社:清华大学出版社 ISBN:9787302228448 上架时间:2010-7-1 出版日期:2010 年6月 开本:16开 页码:398 版次:1-1 内容简介   android提供一个开放的开发环境,为针对移动设备编写创新应用程序带来了激动人心的新机遇。作为使用androidsdk构建这些应用程序的实用指南书籍,《android高级编程》从始至终穿插了一系列示例项目,每个项目都引入android的新功能和新技术,以助您达到最圆满的学习效果。书中介绍android的所有基本功能,并通过简明扼要的示例引导您使用高级功能。    《android高级编程》首先简要介绍android软件栈,接着陈述为手机创建稳定可靠、赏心悦目的应用程序的基本原理。通过学习,您可以打下牢固的理论根基,了解使用当前android 1.0 sdk编写定制移动程序所需的知识,还能灵活快捷地运用未来的增强功能构建最前沿的解决方案。    主要内容    ◆android移动开发的最佳实践    ◆简要介绍活动、intent、清单和资    ◆如何使用布局和定制view创建用户界面    ◆存储和共享应用程序数据的技术    ◆如何创建基于地图的应用程序,如何使用gps和地理编码位置等基于位置的服务    ◆如何创建和使用后台服务及notification    ◆使用加速计、指南针和摄像头硬件    ◆与电话和网络硬件相关的所有内容,如电话api、sms和网络管理等    ◆高级开发主题,包括安全、ipc以及一些高级图形和用户界面技术    读者对象    本书面向希望在android手机平台上创建应用程序的所有人员。不管是经验丰富的移动开发人员,还是初出茅庐的新手,都能从本书提供的宝贵信息中获益。 作译者   Reto Meier出生于澳大利西南的珀斯市,现居伦敦。 Reto是一位经验丰富的软件开发人员,拥有逾10年的GUI程序架构、设计和开发经验。他在涉足IT行业前曾从事过海洋石油和天然气开发以及金融工作。 Reto始终不渝地追求掌握新技术,从2007年Android发布之初Reto就迷恋上了此项技术。他利用业余时间研究包括WPF在内的多种开发平台以及Google的各种开发工具。 详情请访问Reto的个人网站RadioactiveYak,网址是http://blog.radioactiveyak.com。 目录 封面 -14 封底 -13 扉页 -12 版权 -11 作者简介 -10 前言 -9 目录 -4 第1章 Android简介 1 1.1 一些背景信息 2 1.1.1 不远的过去 2 1.1.2 未来的前景 2 1.2 对Android的误解 3 1.3 开放的移动开发平台 3 1.4 自带的Android应用程序 4 1.5 Android SDK功能 5 1.5.1 对包括摄像头、GPS和加速计在内的硬件的访问 5 1.5.2 自带的Google地图、地理编码和基于位置的服务 6 1.5.3 后台服务 6 1.5.4 SQLite 数据存储和检索数据库 6 1.5.5 共享数据和应用程序间通信 7 1.5.6 使用Google Talk的P2P服务 7 1.5.7 扩展的数据支持和2D/3D图形 7 1.5.8 优化的内存和进程管理 8 1.6 开放手机联盟简介 8 1.7 运行Android的环境 8 1.8 从事Android开发的原因 9 1.8.1 推动Android普及的因素 9 1.8.2 Android的独到之处 10 1.8.3 改变移动开发格局 10 1.9 开发框架简介 11 1.9.1 开发包中的资 11 1.9.2 理解Android软件栈 12 1.9.3 Dalvik虚拟机 13 1.9.4 Android应用程序架构 14 1.9.5 Android库 14 1.9.6 高级Android库 15 1.10 小结 16 第2章 开始入手 17 2.1 Android开发 18 2.1.1
本项目是一个初学安卓8个月的学生作品,涉及到模块有新闻、分享、天气、商城购物、聊天等。包括mysql数据+ssh框架下的jsp服务端+安卓客户端,安卓客户端还使用了大量的第三方类库,如果对上面的任意一个知识不熟悉的朋友运行这个项目还是非常费劲的,码有比较详细的注释。默认编译版本4.4.2,编码UTF-8。下面是一个简单的对每个界面的介绍。客户端亲测可以正常导入运行,没有搭建服务端,有能力搭建的朋友可以看一下。 引导界面: viewpager 导航 可以判断是否第一次 图文分享:使用的ShareSDK,实现了抓取新闻, 城市选择器修改了一下界面。 主界面:主要是分别类,数据库做了几张一对多的表,查询是写死的,但是因为没有数据,暂时只可以进来今日折扣和女装。 列表界面:列表界面是一个有旋转效果的listview。 商品详情:商品详情是跟随顶部栏变化的viewpager和fragment,分为基本信息、详情和评论,数据是从服务端获取,布局由可以回弹的ScrollView作为容器 订单功能:点击立即购买即会弹出地址填写然后数据操作,点击圆形菜单栏中的订单并会查询数据库返回订单和订单信息等,界面完成了翻页效果(是git上面的框架),订单信息进行了手机和邮箱的校验。 评论功能:在订单中可以进行商品评论 我的购物车的listview的滑动出现删除按钮,和以前的一样 搜索功能:简单的搜索功能实现。 好友列表:用户信息是调取SharedPreferences中的信息,头像是网络加载,slidingmenu的使用slidingmenu由expandablelistview来构建好友列表,可以添加分组和添加好友,会有一个默认子view 能够即时刷新界面和数据库。 用户搜索:能够即时刷新view 聊天功能:简单的socket对聊实现,对聊界面也是由回弹的ScrollView作为容器

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值