zoukankan      html  css  js  c++  java
  • Android App性能优化——内存、CPU、耗电量、启动时间指标获取

    最近公司要求对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中的声明方式如下:

    <activity
        android:name="com.volley.demo.DmTestActivity"
        android:exported="true"></activity>
    

    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 =

    欢迎关注我的公众号

  • 相关阅读:
    没事千万不要升级VirtualBox和Vagrant!
    以太坊开源项目
    以太坊合约第三方库
    Redis dbfilename
    SUSE Redis 开机启动
    SUSE Linux Enterprise Server 12 SP3 安装redis 6.0以上版本
    HTML基础练习
    html基础
    关于css 浮动的例子
    css 实现三角形
  • 原文地址:https://www.cnblogs.com/xiaxveliang/p/14884167.html
Copyright © 2011-2022 走看看