美文网首页
《Android群英传:神兵利器》— 第六章

《Android群英传:神兵利器》— 第六章

作者: 夜瑾漠 | 来源:发表于2018-10-15 19:42 被阅读0次

    第六章:App 背后的故事——性能检测与分析工具

    《Android群英传:神兵利器》个人读书笔记,仅做学习记录之用

    [TOC]

    6.1 性能优化之前

    6.2 Google 的技术指导

    6.3 UI 性能分析

    • UI 性能的目标:
      1、减少绘图的等待时间
      2、使帧率更加平稳、连贯

    6.3.1 16ms 黄金准则

    • Android 设备的屏幕刷新频率为 60 帧每秒,要使画面流畅就需要让每一帧的时间不超过 1/60fps=16.6ms 每帧。

    6.3.2 Android 系统对 UI 的提升

    • UI 性能的发展:
      1、软解时代:Android2.3,所有绘图由 CPU 完成,即通过软件运算画图
      2、硬解时代:Android2.3之后,Android 系统增加了 GPU,绘图开始由 GPU 进行渲染
      3、黄油时代:Android4.1之后,google 发布了 “Project Butter”——黄油计划。通过 VSYNC 垂直同步机制和多缓冲机制(three frame buffer)进一步提高绘制效率
      4、异步绘制时代:Android5.0 之后系统增加了 Render Thead,即使某一帧发生延迟也不会影响下一帧的绘制

    6.3.3 布局核心准则

    • 布局的绘制通常分为三步:measure、layout、draw
    • 核心准则:尽量使布局的 view 树扁平,降低布局的层级
    • 提高 View 的使用率也是优化的关键,可以通过 include 标签进行 View 的复用
    • 通过 DrawableLeft、DrawableRight 方式来组合控件等
    • 最重要的还是尽可能的减少 View 的数量

    6.3.4 RelativeLayout VS LinearLayout

    • RelativeLayout 可以使布局更加扁平,而 LinearLayout 需要嵌套使用,在布局深度上具有优势。
    • RelativeLayout 在进程测量时,需要进行多次绘制,尤其是嵌套使用的时候,耗时更为严重。
    • 两者需结合实际来分析,使用 LinearLayout,层级不能太深,使用 RelativeLayout,尽量避免嵌套。

    6.3.5 HierarchyViewer

    • 主要是用来查看布局层级,减少不必要冗余的 View,还可以发现 Overdraw(重复的绘制)
    • 官方建议使用 Android Device Monitor 来代替这个工具

    6.3.6 Merge 与 ViewStub

    6.3.7 图形重绘 Overdraw

    6.3.8 Tracer for OpenGL

    6.3.9 GPU Profiler

    6.3.10 Profile GPU Rendering

    6.3.11 Framestats

    6.3.12 Logcat

    6.3.13 traces.txt

    6.3.14 Android Studio GPU Monitor

    • 监测当前运行页面的渲染,并实时显示出来

    6.3.15 Systrace

    • 系统级的性能检测工具,可以完成一些深层次的性能检测
    • Systracede 的初始化的两种方式:In DDMSIn Command Line

    6.3.16 CPU 区域

    6.3.17 SufaceFlinger

    6.3.18 应用区域

    6.3.19 Alert

    6.4 Traceview

    • Android 平台下的数据采集工具,可以得到两种数据:单次执行最耗时的方法执行次数最多的方法

    6.4.1 In Source Code

    Debug.startMethodTracing();
    ···代码···
    Debug.stopMethodTracing();
    
    • 数据会自动保存到 SDCard 目录下

    6.4.2 In DDMS

    6.4.3 Traceview 分析

    6.4.4 图形列表

    6.4.5 详细列表

    6.5 应用启动时间计算

    6.5.1 启动时间定义

    • 一般认为 setContentView 中的 View 全部显示结束了,才算是应用启动完毕

    6.5.2 ADB 计算启动时间

    • 1、ThisTime:最后一个启动的 Activity 的启动耗时
      2、TotalTime:所有 Activity 的启动耗时
      3、WatiTime:ActivityManagerService 启动 App 的 Activity 时的总时间(包括当前 Activity 的 onPause() 和自己 Activity 的启动)
    • 过程分解:
      1、上一个 Activity 的 onPause()
      2、系统调用 AMS 耗时
      3、第一个 Activity(也许是闪屏页)耗时
      4、第一个 Activity 的 onPause() 耗时
      5、第二个 Activity 的启动耗时
      ThisTime:5TotalTime:3、4、5的总耗时WatiTime:1、2、3、4、5的总耗时
    • 使用脚本多次重复应用“启动——Kill——启动”,取平均值

    6.5.3 使用相机分析

    6.6 内存探究

    • 开发者管理、优化内存的核心准则:
      1、在对象不需要的时候,确保对象能够被销毁
      2、如果对象没有被销毁,则该对象一定是作为可复用的对象,而不是存在多个。

    6.6.1 内存区分

    • 寄存器 Registers:用于存储指令、地址、数据
      栈 Stack:存放基本类型的数据、对象的引用和函数地址等,由系统控制
      堆 Heap:存放对象本身和数组,由开发者控制
      静态域 static field:存储静态变量
      常量池 constant pool:存储常量
    堆/栈 GC 管理 存取速度
    由 GC 系统控制。变量生命周期结束后,由 GC 系统决定何时回收
    由虚拟机控制。变量生命周期结束后,由虚拟机释放该变量占用的内存空间
    • 常用内存类型:
      1、VSS-Virtual Set Size:虚拟耗用内存(包含共享库占用的内存)
      2、RSS-Resident Set Size:实际使用物理内存(包含共享库占用的内存)
      3、PSS-Porportional Set Size:实际使用物理内存(比例分配共享库占用的内存)
      4、USS-Unique Set Size:进程独自占用的物理内存(不包含共享库占用的内存)
    • 一般来说内存占用大小:VSS ≥ RSS ≥ PSS ≥ USS

    6.6.2 系统内存分析工具

    6.6.3 获取内存信息

    6.6.4 GC 系统

    • GC 的同步与非同步:指 Android 2.3 之前的版本,GC 是会打断被 GC 的线程,遍历 Heap,而 Android 2.3 之后的版本,GC 与被 GC 的线程可以同时工作而互不影响。
    • Android5.0 之后,系统第二次优化了 GC,加快了清理速度、减少了打断线程的次数。同时除了清理垃圾之外,还可以为大内存对象分配特殊的地址,方便内存碎片的整理,提高了内存使用率,同时也避免了 OOM

    6.6.5 ActivityManager.MemoryInfo

    • 用于封装系统级别的内存数据,包含:
      1、totalMem:系统可用总内存
      2、availMem:系统当前剩余内存
      3、lowMemory:是否处于低内存状态
      4、threshold:内存阈值

    6.6.6 Dubug.MemoryInfo

    • 获取单个 App 进程的内存使用情况

    6.6.7 Runtime

    6.6.8 获取更多内存

    6.8 onLowMemory

    • 是系统低内存管理系统(LMK)发出的系统警告

    6.8.1 ComponentCallback

    6.8.2 onTimeMemory

    6.9 内存泄漏检测

    • 所谓的内存泄漏,实际上是指本该被回收的内存由于某种原因,绕开了GC的回收算法,从而导致该内存被无效数据霸占,使得内存总量变小

    6.10 Logcat

    • 实际上是分析系统、App 性能和运行情况的重要工具

    6.11 Dump Heap

    6.12 Allocation Tracker

    6.12.1 In Android Studio

    6.12.2 In DDMS

    6.13 Android Studio Memory Monitor

    6.14 内存泄漏分析

    • 在 Android 中并不存在所谓的内存泄漏,这里的内存泄漏是指内存没有在恰当的时候释放掉。

    6.15 Memory Analysis Tool(MAT)

    • 检测内存泄漏的利器。原先是 eclipse 中的一个插件,现在则是当做一个独立运行的工具,可直接下载

    6.15.1 准备Dump Heap文件

    6.15.2 分析

    6.16 LeakCanary

    • Square 的杰作

    6.16.1 引用LeakCanary

        debugCompile(name: 'leakcanary-android-1.3', ext: 'aar')
        releaseCompile(name: 'leakcanary-android-no-op-1.3', ext: 'aar')
    

            一个 debug 一个 release,由于强大的 Gradle ,使得 LeakCanary 可以在 debug 模式中正常工作。而在 release 版本中完全不开启检测功能,同时整个切换过程不需要修改一行代码。

    6.16.2 初始化LeakCanary

    • 在应用的 application 的 onCreate() 中
        @Override
        public void onCreate()
        {
          super.onCreate();
            LeakCanary.install(this);
        }
    

    6.16.3 检测

    • 在 launcher 中会生成一个图标入口——Leaks,点击进入即可看到对应时间点的 Leaks 信息。

    6.17 CPU Performance

    • 优化 CPU 有两个直接的提升:1、优化耗电;2、提升 App 的使用体验,特别是动画效果、视屏编解码等

    6.18 Top

    6.18.1 总览

    6.18.2 详细

    6.19 Show CPU Usage

    6.20 Android Studio CPU Monitor

    6.21 Method Tracing

    6.22 BatteryPerformance

    6.22.1 电量消耗计算

    6.22.2 耗电元凶

    • 1、Wakelocks——Android 中的耗电大户,一定要保证在何时的时机调用,其他时间必须严格禁止
      2、AlarmManager——虽由系统托管,但过多的 Alarm 会造成系统频繁唤醒,从而造成耗电
      3、轮询——在有些程序中,为了实现某些监听,经常会在后台执行轮询操作,它会让 CPU 无法正常进入休眠而持续的保持着高耗能
      4、频繁的网络请求——一个 App 应该在何时的时间发起网络请求,同时使用缓存等方式,尽量减少网络的消耗
      5、长时间的 CPU 占用——CPU 计算会消耗非常多的电量。如果一个 App 的算法缺陷、设计缺陷,导致其 CPU 占用率一直维持着比较高的水平,那么一定会非常耗电

    6.22.3 电量分析

    • Battery Historian

    6.23 综合测试工具

    • 网易 Emmagee——主要用于监控单个App的CPU,内存,流量,启动耗时,电量,电流等性能状态的变化
    • 腾讯 GT
    • Google AnotherMonitor

    6.24 Android Device Monitor

    6.24.1 Threads

    6.24.2 System Information

    6.25 高通性能工具

    6.25.1 Trepn Profiler

    6.25.2 App Tune-up Kit

    6.26 云测平台

    • 阿里:阿里云测
    • 腾讯:腾讯优测
    • Testin
    • 上述测试平台大体功能相同:
      1、兼容性测试:通过大量真机覆盖大部分机型
      2、压力测试:通过脚本实现压力测试
      3、缺陷分析:通过代码静态扫描和测试中发生的 ANR、Crash 等提供应用的缺陷分析、
      4、性能测试:在测试中监控应用性能等数据
      5、远程真机租用:用户可以远程访问 DeviceLab 中的真机,并通过远程控制的方式进行使用

    这章节主要介绍 App 性能检测相关的内容,主要是一些工具的使用。整理的很是完善,推荐阅读

    相关文章

      网友评论

          本文标题:《Android群英传:神兵利器》— 第六章

          本文链接:https://www.haomeiwen.com/subject/uzywaftx.html