跳转至

Android 性能优化技术月报 | 2023 年 8 月

每个月都会有一些 Android 性能优化相关的优质内容发布,然而,碎片化阅读使得这些知识难以形成完整体系,且容易被遗忘。为解决这些问题,我决定尝试使用技术月报的形式,总结我在最近一个月内查阅的 Android 性能优化相关的优质内容。

月报的主要内容包括:整理展示我在最近一个月所查阅的 Android 性能优化领域的最新技术动态、精选博客,精选视频等内容。

精选博客

常见的 Android 卡顿监控方案

常见的Android应用卡顿监控方案原理和对比

想要监控卡顿或者是监测 App 的流畅度,就必须通过代码手段来获取FPS或者每帧耗时,并转化成可以衡量应用卡顿程度的指标。本文介绍了三种常见的 Android 卡顿监控方案:

  • Choreographer 的 FrameCallback 回调
  • Choreographer + Looper Hook 方案
  • 官方 JankStats 方案

卡顿率如何计算

Jank卡顿及stutter卡顿率说明

帧率高,未必流畅,因此不能简单用帧率来表示卡顿程度。PerfDog 提出了一种新的卡顿计算思路:

考虑视觉惯性,假设以前三帧的平均帧耗时为参考,作为vsync时间间隔,连续两次vsync没有新渲染画面刷新,则认为是一次潜在卡顿,也就是说下一帧耗时大于前三帧平均帧耗时2倍,则认为一次潜在卡顿。同时单帧耗时满足大于两倍电影帧耗时1000ms/24*2 (由于人眼低于24帧才能辨别画面不连续性),则认为是一次真正卡顿。同时若单帧耗时大于3倍电影帧耗时,则认为是一次严重卡顿。

基于PerfDog Jank的基础上,一次Jank卡顿,会有一次卡顿时间Jank time。测试过程中可能有多次Jank卡顿,即有多次卡顿时间Jank time。测试总时长为Time。因此可通过以下方式计算出卡顿率:

Stutter(卡顿率) = ∑Jank time / Time

Android dlopen 方法的使用限制及解决方案

一些大型 App 在做性能监测和优化时,经常需要使用 dl 函数打开系统动态库。但从Android 7.0开始,Android系统开始阻止App中使用dlopen(), dlsym()等函数打开系统动态库。具体原理是是通过检查执行dlopen函数时的LR寄存器值是不是系统库的地址。

如何突破官方的限制呢?下面的文章介绍了一些绕过 Android 7.0 之后系统库访问限制的方法:

得物App安卓冷启动优化-Application篇

本文介绍了得物 APP 的冷启动优化实践,得物技术团队通过对启动阶段的系统资源做统一管控,按需分配和错峰加载等手段将得物App的线上启动指标降低10%,线下指标降低34%,并在同类型的电商App中提升至Top3。本文具体介绍了如下的优化手段

  • WebView 优化
  • ARouter 优化
  • 锁优化
  • 启动框架优化
  • 首页优化

使用Perfetto定位应用启动性能的瓶颈

本文主要介绍了如何使用 Perfetto 定位启动性能问题,主要包括以下内容

  • TTID 与 TTFD 的区别
  • 如何使用 FFmpeg 拆帧精准获取启动耗时
  • Perfetto 是 Android 10 引入的系统级跟踪工具,支持 Android,Linux 和 Chrome,用于取代 Systrace
  • 如何使用 Perfetto 分析启动性能
  • Perfetto 分析实践

精选视频

认识 Android 动态链接

社区说|认识 Android 动态链接

本视频主要介绍了什么是动态链接,动态链接实现细节,动态链接实例分析等内容。动态链接是 Android 性能优化中常用的 Native Hook 技术的基础,因此还是有必要了解一下的


最后更新: January 5, 2025