Android性能优化之启动速度优化(工具篇)

一、Android中的使用启动指标

Android 使用初步显示所用时间 (TTID) 和完全显示所用时间 (TTFD) 指标来优化冷应用启动和温应用启动。

较短的 TTID 有助于用户看到应用是真的在启动。保持较短的 TTFD 非常重要,可确保用户能快速开始与应用互动。

1.1 初步显示所用时间 (TTID)

初步显示所用时间 (TTID) 是指显示应用界面的第一帧所需的时间。该指标用于测量应用生成第一帧所用的时间,包括冷启动期间的进程初始化、冷启动或温启动期间的 activity 创建,以及显示第一帧。让应用的 TTID 保持较低水平,以便用户快速看到应用启动情况,有助于改善用户体验。

TTID 以时间值的形式衡量,表示包含以下事件序列的总经过时间:

  • 启动进程。
  • 初始化对象。
  • 创建和初始化 activity。
  • 膨胀布局。
  • 首次绘制应用。

2.2 完全显示所用时间 (TTFD)

完全显示所用时间 (TTFD) 是指应用与用户进入可交互状态所需的时间。报告的显示时间是显示应用界面的第一帧所用的时间,以及在显示第一帧后异步加载的内容。通常,这是从网络或磁盘加载的主要内容(由应用报告)。换言之,TTFD 包括 TTID 以及应用可供使用所需的时间。让应用的 TTFD 保持在低水平有助于用户快速与应用互动,从而改善用户体验。

1.3 reportFullyDrawn()

调用 omponentActivity reportFullyDrawn() 方法来指示完全绘制状态。

向系统报告您的应用现已完全绘制,以进行诊断和优化。系统可能会调整优化以优先处理在调用 reportFullyDrawn 之前发生的工作,从而改善应用启动。过晚或过早调用 reportFullyDrawn 会错误地表示启动窗口,从而降低应用和启动性能。

@Override
public void reportFullyDrawn() {
    try {
        if (Trace.isEnabled()) {
            Trace.beginSection("reportFullyDrawn() for " + getComponentName());
        }
        if (Build.VERSION.SDK_INT > 19) {
            super.reportFullyDrawn();
        } else if (Build.VERSION.SDK_INT == 19 && ContextCompat.checkSelfPermission(this,
                Manifest.permission.UPDATE_DEVICE_STATS) == PackageManager.PERMISSION_GRANTED) {
            // On API 19, the Activity.reportFullyDrawn() method requires the
            // UPDATE_DEVICE_STATS permission, otherwise it throws an exception. Instead of
            // throwing, we fall back to a no-op call.
            super.reportFullyDrawn();
        }
        // The Activity.reportFullyDrawn() got added in API 19, fall back to a no-op call if
        // this method gets called on devices with an earlier version.
    } finally {
        Trace.endSection();
    }
}

二、启动时间测试方法

2.1 使用ADB

使用 adb 工具执行 Activity Manager 启动一个 Activity : am start,用于在设备上启动指定应用程序并输出启动的相关信息。

server@dev-fj-srv:$ adb shell am start -W -S com.android.deskclock
Stopping: com.android.deskclock
Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] pkg=com.android.deskclock }
Status: ok
LaunchState: COLD
Activity: com.android.deskclock/.DeskClock
TotalTime: 769
WaitTime: 773
Complete

参数:

  • -W: 等待 Activity 启动完成并返回结果。
  • -S: 强制停止目标应用程序并清除其实例状态(如果已运行)。

测试冷启动时间一般加上-S参数

输出结果解释:

  • Stopping: com.android.deskclock: 输出表示正在停止目标应用程序(com.android.deskclock)。
  • Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] pkg=com.android.deskclock }: 输出表示正在启动一个带有指定属性的 Intent,包括操作(action)、类别(category)和包名(package)等信息。
  • Status: ok: 输出表示命令执行状态正常。
  • LaunchState: COLD: 输出表示应用程序的启动状态为冷启动。
  • Activity: com.android.deskclock/.DeskClock: 输出表示启动的 Activity 的完整类名。
  • TotalTime: 622: 输出表示应用程序的总启动时间(以毫秒为单位)。
  • WaitTime: 630: 输出表示等待应用程序启动完成的总时间(以毫秒为单位)。
  • Complete: 输出表示应用程序的启动已完成。

2.2 查看日志输出

在 Logcat 命令行工具中搜索包含名为 Displayed 的值的输出行。该值是 TTID,但是ActivityTaskManager 只有在冷启动的时候才会输出此段日志

server@dev-fj-srv:$ adb logcat -b all | grep Displayed
07-13 13:12:38.692  1165  1247 I ActivityTaskManager: Displayed com.android.deskclock/.DeskClock for user 0: +492ms

2.3 Android Profiler

Android Profiler 是 Android Studio 的一项强大的性能分析工具,可以用于测量和分析应用的启动耗时。

三、启动分析工具

3.1 Android Profiler

随着 Android Studio 的迭代、演进,到目前,Android Studio 有了自己的性能分析工具 Android Profiler,它是一个集合体,集成了多种性能分析工具于一体,让开发者可以在 Android Studio 做开发应用,也不用再下载其它工具就能让能做性能调优工作。

官方文档:https://developer.android.com/studio/profile

如果应用响应缓慢、动画不连贯、卡顿或耗电量过多,则表示应用性能不佳。修复性能问题需要确定应用在哪些方面对 CPU、内存、图形、网络或设备电池等资源的利用效率低下。

Android Studio 提供了多种分析工具来帮助查找和可视化潜在问题:

  • CPU profiler:有助于追踪运行时性能问题。
  • Memory profiler :有助于跟踪内存分配。
  • Energy profiler:跟踪能源使用情况,这可能会导致电池耗尽。

要分析可分析的应用程序,请执行以下操作:

1.从开发模拟器或设备启动应用程序。

2.在 Android Studio 中,通过选择View > Tool Windows > Profiler来启动分析器。

3.应用程序启动后,点击分析器加 + 按钮 分析器中的按钮查看下拉菜单。选择您的设备,然后选择其他可分析进程下的应用程序条目。
在这里插入图片描述4.分析器应附加到应用程序。只有 CPU 和内存分析器可用,内存分析器的功能有限。

在这里插入图片描述点击CPU:可以选择 System Trace 点击 Record去记录跟踪

在这里插入图片描述
点击Memory:选择 Capture head dump 点击 Record 去捕获堆转储

在这里插入图片描述5. 您可以将 Profiler 数据保存为会话,这些会话会一直保留,直到您退出 Android Studio。通过在多个会话中记录分析信息并在它们之间切换,您可以比较各种场景下的资源使用情况。

  • 要开始新的会话,请点击“开始新的分析会话” 按钮,然后从出现的下拉菜单中选择一个应用程序进程。
  • 当您 记录跟踪捕获堆转储时,Android Studio 会将该数据(连同应用的网络活动)作为单独的条目添加到当前会话中。
  • 要停止向当前会话添加数据,请单击停止当前分析会话 。
  • 要导入上次运行 Android Studio 时导出的跟踪信息,请点击“ 启动新的分析器会话” ,然后选择“从文件加载”。

3.2 Perfetto

Perfetto 是一种新一代的性能分析全栈工具,由 Google 开发并开源。它旨在提供全面、高效的性能分析解决方案,可用于跟踪、收集和分析各种系统和应用程序的性能数据。Perfetto 可以在 Android、Linux、macOS 和 Windows 等平台上使用,并支持多种数据源和数据格式。

官方网站:https://perfetto.dev/

Android 文档:app-startup-perfetto

通过命令行记录跟踪

cd ~/bin/
curl -O https://raw.githubusercontent.com/google/perfetto/main/tools/record_android_trace
chmod u+x record_android_trace

# See ./record_android_trace --help for more
./record_android_trace -o trace_file.perfetto-trace -t 30s -b 64mb \
sched freq idle am wm gfx view binder_driver hal dalvik camera input res memory

通过加参数-a <包名> 进行记录trace,Ctrl_+C后会自动打开trace分析网页

通过 Perfetto 在线界面记录跟踪信息

网址:https://ui.perfetto.dev/#!/record
在这里插入图片描述

如何在 Perfetto 中识别应用启动
如需调试应用启动问题,确定应用启动阶段包含哪些确切内容会很有帮助。如需在 Perfetto 中识别整个应用启动阶段,请按以下步骤操作:

1.在 Perfetto 中,找到包含“Android App Startups”派生指标的行。如果您没有看到该行,请尝试使用设备上的系统跟踪应用捕获跟踪记录。
在这里插入图片描述
2.点击关联的 slice,然后按 m 选择该 Slice。该 Slice 会被括出显示,并标注所用时间。时长也会显示在 Current selection 标签页中。
3.点击图钉图标以固定“Android App Startups”行(将鼠标悬停在该行上即可看到图钉图标)。

4.滚动到相关应用所在的行,然后点击第一个单元格以展开该行。

5.按 w 放大主线程(通常位于顶部),按 sad 分别缩小线程向左移动向右移动
在这里插入图片描述
6.派生指标 slice 可让您更轻松地查看应用启动阶段包含的具体内容,以便您继续进行更详细的调试。

3.3 Systrace

Systrace 是第一代系统级性能分析工具。在 Perfetto 出现之前,基本上是唯一的性能分析工具,它将 Android 系统和 App 的运行信息以图形化的方式展示出来,与 Log 相比,Systrace 的图像化方式更为直观;与 TraceView 相比,抓取 Systrace 时候的性能开销基本可以忽略,最大程度地减少观察者效应带来的影响。

但是在Android SDK Platform-Tools 33.0.1版本时候将 systrace 工具移除,推荐使用Profiler
在这里插入图片描述
最后一个支持systrace的版本platform-tools_r30.0.0-linux.zip

在这里插入图片描述

四、优化指南

https://developer.android.com/topic/performance/appstartup/analysis-optimization?hl=zh-cn
https://developer.android.com/topic/performance/vitals/launch-time?hl=zh-cn

  • 35
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值