热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

AndroidApp性能优化——内存、CPU、耗电量、启动时间指标获取

最近公司要求对App进行性能优化。考虑到既然是优化性能,那首先要获取App的相关性能指标,比如:内存占用、CPU利用率、App启动时间、App耗电量等情况,获取以上各指标后,才能针

最近公司要求对App进行性能优化。考虑到既然是优化性能,那首先要获取App的相关性能指标,比如: 内存占用CPU利用率App启动时间App耗电量等情况,获取以上各指标后,才能针对性分析确定是否存在优化的可能。



  • 查看App启动时间(冷启动、热启动)

  • 查看进程内存占用

  • 查看进程CPU使用率

  • 查看App耗电量


一、App启动时间

本小节记录以下三个adb shell 命令:



  • adb shell am start -W [包名]

    启动APP,查询App的启动时间

  • adb shell am start -n [包名]/[包名.Activity]

    启动一个Activity(不记录启动时间)

  • adb shell am force-stop [包名]

    关闭一个APP进程


1.1、App启动时间

查询App的启动时间,可以用以下命令:

// 启动APP,查询App的启动时间
// adb shell am start -W [包名]
adb shell am start -W com.xiaxl.demo

adb shell 查询App启动时间

查询结果中,对应的时间参数详细解析如下:



  • ThisTime:对应activity启动耗时;

  • TotalTime:应用自身启动耗时 = ThisTime + 应用application等资源启动时间

  • WaitTime:系统启动应用耗时 = TotalTime + 系统资源启动时间


1.2、启动一个Activity(不记录启动时间)

单纯启动一个Activity,不记录启动时间,可以使用以下命令。

// 启动一个Activity(不记录启动时间)
// adb shell am start -n [包名]/[包名.Activity]
adb shell am start -n com.xiaxl.demo/com.volley.demo.DmTestActivity

adb shell 启动一个Activity(不记录启动时间)

示例图中,对应Activity在AndroidManifest.xml中的声明方式如下:



1.3、关闭一个App进程

关闭一个App进程用如下命令。

// 关闭一个APP进程用如下命令。
// adb shell am force-stop [包名]
adb shell am force-stop com.xiaxl.demo

adb shell 关闭一个APP进程


二、进程内存占用

本小节记录以下四个adb shell 命令:



  • adb shell dumpsys meminfo [进程名]

    Android系统中,查看某一进程的内存占用情况

  • adb shell ps

    Android系统中,显示全部系统进程

  • adb shell ps | grep [keyword]

    Android系统中,筛选包含特定关键词的进程

  • adb shell cat /proc/meminfo

    Android系统中,查看整个系统的内存详情


2.1、查看进程内存占用

Android系统中,查看某一进程的内存占用情况可以使用以下命令。

// 查看Android系统中,某一进程的内存占用情况
// adb shell dumpsys meminfo [进程名]
adb shell dumpsys meminfo com.xiaxl.demo

adb shell查看进程内存占用

以上截图中 TOTAL 字段,为对应进程占用的系统总内存;其他字段不再做详细介绍。


2.2、显示全部系统进程

Android系统中,若不了解对应进程的进程名称,可用如下命令显示全部系统进程

// Android系统中,显示全部系统进程
adb shell ps

adb shell 显示全部系统进程


2.3、筛选进程

Android系统中,亦可根据特定关键词,筛选包含特定关键词的进程

// Android系统中,筛选包含特定关键词的进程
adb shell ps | grep [keyword]

adb shell 筛选包含特定关键词的进程


2.4、查看系统内存详情

Android系统中,如果需要查看整个系统的内存详情,可以使用以下命令。

// Android系统中,查看整个系统的内存详情
adb shell cat /proc/meminfo

adb shell 查看系统的内存详情

相关参数的详细解释如下所示:

MemTotal: 688576 kB 总内存
MemFree: 153736 kB 空闲内存
MemAvailable: 339884 kB 可用内存
Buffers: 16 kB 给文件的缓冲大小
Cached: 267672 kB 高速缓冲存储器
SwapCached: 36 kB 被高速缓冲存储用的交换空间的大小
Active: 222900 kB 活跃使用中的高速缓冲存储器页面文件大小
Inactive: 123700 kB 不经常使用中的告诉缓冲存储器文件大小
Active(anon): 31800 kB 活跃的匿名内存(进程中堆上分配的内存,是用malloc分配的内存)
Inactive(anon): 57272 kB 不活跃的匿名内存
Active(file): 191100 kB 活跃的file内存
Inactive(file): 66428 kB    不活跃的file内存
Unevictable: 0 kB    不能被释放的内存页
Mlocked: 0 kB    mlock()系统调用锁定的内存大小
SwapTotal: 2097148 kB    交换空间总大小
SwapFree: 2096884 kB    空闲交换空间
Dirty: 0 kB    等待被写回到磁盘的大小
Writeback: 0 kB    正在被写回的大小
AnonPages: 78876 kB 未映射页的大小
Mapped: 28556 kB    设备和文件映射大小
Shmem: 10160 kB    已经被分配的共享内存大小
Slab: 102916 kB    内核数据结构缓存大小
SReclaimable: 49616 kB    可收回slab的大小
SUnreclaim: 53300 kB    不可回收的slab的大小
KernelStack: 4416 kB kernel消耗的内存
PageTables: 6028 kB 管理内存分页的索引表的大小
NFS_Unstable: 0 kB 不稳定页表的大小
Bounce: 0 kB 在低端内存中分配一个临时buffer作为跳转,把位于高端内存的缓存数据复制到此处消耗的内存
WritebackTmp: 0 kB USE用于临时写回缓冲区的内存
CommitLimit: 2441436 kB 系统实际可分配内存总量
Committed_AS: 308028 kB 当前已分配的内存总量
VmallocTotal: 34359738367 kB 虚拟内存大小
VmallocUsed: 179588 kB    已经被使用的虚拟内存大小
VmallocChunk: 34359310332 kB malloc 可分配的最大的逻辑连续的内存大小
HardwareCorrupted: 0 kB 删除掉的内存页的总大小(当系统检测到内存的硬件故障时)
AnonHugePages: 6144 kB 匿名 HugePages 数量
CmaTotal: 0 kB    总的连续可用内存
CmaFree: 0 kB 空闲的连续内存
HugePages_Total: 0     预留HugePages的总个数
HugePages_Free: 0     池中尚未分配的 HugePages 数量
HugePages_Rsvd: 0   表示池中已经被应用程序分配但尚未使用的 HugePages 数量
HugePages_Surp: 0     这个值得意思是当开始配置了20个大页,现在修改配置为16,那么这个参数就会显示为4,一般不修改配置,这个值都是0
Hugepagesize: 2048 kB 每个大页的大小
DirectMap4k: 108416 kB   映射TLB为4kB的内存数量
DirectMap2M: 940032 kB   映射TLB为2M的内存数量
DirectMap1G: 0 kB 映射TLB为1G的内存数量

三、进程CPU占用

本小节记录以下两个adb shell 命令:



  • adb shell dumpsys cpuinfo | grep [进程名]

    Android系统中,查看某一进程的CPU占用情况情况

  • adb shell cat /proc/cpuinfo

    Android系统中,查看CPU各核心详情


3.1、进程CPU占用

Android系统中,筛选查看某一进程的CPU占用情况可以使用以下命令。

// 查看Android系统中,筛选某一进程的CPU占用情况
adb shell dumpsys cpuinfo | grep [进程名]
// 查看Android系统,CPU占用情况(各进程CPU占用,总的CPU占用)
adb shell dumpsys cpuinfo

adb shell dumpsys cpuinfo | grep [进程名] 命令可以筛选特定进程的CPU占用信息。

adb shell 筛选某一进程的CPU占用

adb shell dumpsys cpuinfo 命令可以展示出每一个进程的CPU占用信息,同时打印总的CPU占用信息。

adb shell 总的CPU占用、各个进程的CPU占用


3.2、CPU各核心详情

Android系统中,如果需要查看CPU各个核心的详细信息,可以使用以下命令。

// Android系统中,查看CPU各个核心的详细信息
adb shell cat /proc/cpuinfo

adb shell 查看CPU各个核心的详细信息

相关参数的详细解释如下所示:

// CPU 架构, 64bit
Processor : AArch64 Processor rev 14 (aarch64)
// 系统中逻辑处理核的编号,0~7表示8核CPU。
processor : 0
// 在系统内核启动时粗略测算的CPU速度(Million Instructions Per Second)
BogoMIPS : 38.40
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm lrcpc dcpop asimddp
// ARM 架构
CPU implementer : 0x51
// 8核
CPU architecture: 8
CPU variant : 0xd
CPU part : 0x805
CPU revision : 14
// 品牌
Hardware : Qualcomm Technologies, Inc LITO

四、App耗电量

App耗电量相关数据获取 与 分析可以采用以下两种方式:



  • adb shell dumpsys batterystats

    采用该命令,获取对应包名应用耗电量数据;

  • Battery-Historian分析工具

    采用该分析工具,可以实现对应包名应用耗电量分析;


4.1、adb shell dumpsys batterystats

Android系统中,查看对应包名应用电量消耗数据,可以采用如下方式。


a、重置电量数据(连接数据线操作)

首先要重置电量数据(重置电量数据,所有App的电量消耗数据将清零);

然后打开全量日志数据(打开全量电量相关日志记录)。

// 重置电量数据
adb shell dumpsys batterystats --reset
// 打开全量日志记录
adb shell dumpsys batterystats --enable full-wake-history

b、APP相关场景测试(断开数据线)

重置电量数据后,需要拔掉数据线,进行相关APP场景测试


c、导出(重新连接数据线)

重新连接数据线 通过以下命令可在命令行查看对应应用的电量消耗,亦可将电量消耗信息导出到文件中

// 查看 应用电量消耗
adb shell dumpsys batterystats [应用包名] | more
// 导出 应用电量消息,这里使⽤命令more分篇查看电量相关数据
adb shell dumpsys batterystats [应用包名] >1.txt

adb shell 查看应用电量消耗

adb shell dumpsys batterystats导出的电量数据


4.2、Battery-Historian分析工具

Battery Historain是谷歌开发的分析工具,其可以用来分析对应包名应用的耗电情况。

因本小节重点还是如何获取对应包名应用耗电相关数据,对于Battery Historain的安装与简单使用可参考我的文章

Mac 中 Battery Historain 安装与使用:

https://xiaxl.blog.csdn.net/article/details/117758299

对应包名应用耗电相关数据获取步骤如下:


a、重置电量数据(连接数据线操作)

首先要重置电量数据(重置电量数据,所有App的电量消耗数据将清零);

然后打开全量日志数据(打开全量电量相关日志记录)。

// 重置电量数据
adb shell dumpsys batterystats --reset
// 打开全量日志记录
adb shell dumpsys batterystats --enable full-wake-history

b、APP相关场景测试(断开数据线)

重置电量数据后,需要拔掉数据线,进行相关APP场景测试


c、导出(重新连接数据线)

重新连接数据线 通过以下命令导出对应应用的电量消耗数据

// Android 7.0(包含) 以上设备执行如下命令:
adb bugreport > bugreport.zip
// Android 6.0(包含) 以下设备执行如下命令:
adb bugreport > bugreport.txt

d、battery-historian 工具分析电量消耗

上一步导出的bugreport文件,上传到battery-historian 工具进行分析。

注:

国内安装Battery Historain太繁琐,主要是各种依赖包国内都下载不下来。

昨天我安装Battery Historain 一下午没搞定,后来搞到半夜一点钟 终于安装完成(中途曾几度想放弃安装,总之安装太繁琐)。

后来发现,已经有人搭建了一个Battery Historain线上环境,相关网址为: https://bathist.ef.lc/

将导出的bugreport文件上传到 https://bathist.ef.lc/ ,便可以开始应用耗电分析了。

battery-historian


五、参考:

使用 Battery Historian 分析耗电情况:

https://developer.android.google.cn/topic/performance/power/battery-historian?hl=zh-cn

Battery Historian GitHub地址如下:

https://github.com/google/battery-historian?spm=a2c6h.12873639.0.0.10ed5c987lIJt6

Android 调试桥 (adb)

https://developer.android.google.cn/studio/command-line/adb?hl=zh-cn

android developer dumpsys:

https://developer.android.google.cn/studio/command-line/dumpsys?hl=zh-cn


= THE END =

欢迎关注我的公众号



推荐阅读
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文讲述了如何通过代码在Android中更改Recycler视图项的背景颜色。通过在onBindViewHolder方法中设置条件判断,可以实现根据条件改变背景颜色的效果。同时,还介绍了如何修改底部边框颜色以及提供了RecyclerView Fragment layout.xml和项目布局文件的示例代码。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 基于事件驱动的并发编程及其消息通信机制的同步与异步、阻塞与非阻塞、IO模型的分类
    本文介绍了基于事件驱动的并发编程中的消息通信机制,包括同步和异步的概念及其区别,阻塞和非阻塞的状态,以及IO模型的分类。同步阻塞IO、同步非阻塞IO、异步阻塞IO和异步非阻塞IO等不同的IO模型被详细解释。这些概念和模型对于理解并发编程中的消息通信和IO操作具有重要意义。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 集成电路企业在进行跨隔离网数据交换时面临着安全性问题,传统的数据交换方式存在安全性堪忧、效率低下等问题。本文以《Ftrans跨网文件安全交换系统》为例,介绍了如何通过丰富的审批流程来满足企业的合规要求,保障数据交换的安全性。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
author-avatar
手机用户2502907463
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有