跳转至

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

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

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

最新动态

《Android 应用稳定性剖析与优化》小册发布

Android 应用稳定性剖析与优化

性能优化是 Android 开发必备技能之一,本小册针对性能优化中“稳定性”这一主题,从基础优化技术出发,到实际优化案例实践。共涵盖 4 个常见的、也是最可能导致疑难杂症产生的主题,包括 APM 中稳定性建设、内存相关稳定性、线程稳定性以及 Binder 稳定性等逐一学习优化&监控技巧。

精选博客

一种Android已加载类检测方法

上个月介绍了高德复制ClassTable指针,通过标准 API 间接访问类加载状态,以统计线上代码覆盖率的方案,但是上文中并没有详细介绍该方案具体是如何实现的。

本文介绍一种适用于线上的,低侵入的,无包体影响的 ,高效全面稳定的已加载类检测方法,仅需plt hook一处方法调用。具体方式是通过对android::base::LogMessage::stream()方法 进行 hook ,拦截加载类的日志打印并上报。

得物 Android 包体积资源优化实践

得物包体积资源优化实践的一些方案,具体包括以下内容:

  • 图片压缩:使用 cwebp 对图片进行webp转换,使用 guetzli 对JPEG进行压缩,使用pngquant对PNG 进行压缩,使用 gifsicle 对gif进行压缩。
  • 资源去重:找到资源文件目录下不同名的相同的文件,然后删除掉重复的文件,最后到 arsc 中修改记录,将删除的文件索引名称进行替换。
  • 资源混淆:用长路径替换短路径,一来减小文件名大小,二来降低arsc中常量池中二进制文件大小。
  • 资源下发:资源下发的主体主要是 so 文件和图片,能下发的资源就下发是包体优化的一大利器。
  • 无用资源移除:及时清理无用资源,防止无用资源的持续恶化。

相比于其他包体积优化方案,资源优化往往实现起来更加简单,效果也更加明显,还是非常实用的。

Android 应用内存占用分析

Android Memory(二) -- 应用内存占用分析

大家最熟悉的内存分析工具应该是 Android Studio 自带的 Memory Profiler,Profiler 虽然使用起来方便,但是功能上并不全面,无法了解详细的内存占用情况,本文主要介绍了三种内存占用分析方法,分别是:

  • 通过Android Studio自带的Memory Profiler查看内存
  • 通过 adb shell dumpsys meminfo ${PROCESS_NAME} 查看内存情况
  • 通过adb shell run-as com.transsion.phoenix "cat /proc/${PID}/smaps 查看Smap数据

度加剪辑App的MMKV应用优化实践

移动端开发中,IO 密集问题在很多时候没有得到充足的重视和解决,贸然的把 IO 导致的卡顿放到异步线程,可能会导致真正的问题被掩盖,前人挖坑后人踩。其实首先要想的是,数据存储方式是否合理,数据的使用方式是否合理。

本文介绍了度加剪辑 App 中对文件磁盘 IO 这部分的使用和优化,主要涉及 MMKV 的应用。MMKV 基于 mmap 内存映射技术,避免了数据在用户态跟内核态大量的拷贝切换,极大的提升了读写效率。然而,MMKV依然有不少IO操作发生在主线程,且磁盘相对是低速设备,同步时效率较低,有时难免会出现性能问题。

本文介绍了在使用 MMKV 过程中发现的如下问题,并提供了一些解决方案

  • 存储较长的字符串,例如云控json 时,由于 MMKV的重写和扩容机制有时会导致卡顿
  • 新 MMKV_ID 第一次存储key-value数据时, 会误触一次 msync 系统调用,导致卡顿
  • MMKV 初始化时可能导致卡顿
  • MMKV 存储大数据导致导致占用增多,容易 OOM

聊聊Android线程优化这件事

在日常开发APP的过程中,难免需要使用第二方库和第三方库来帮助开发者快速实现一些功能,提高开发效率。但是,这些库也可能会给线程带来一定的压力,主要表现在以下几个方面:

  • 线程数量增多:一些库可能会在后台启动一些线程来执行任务,这样会增加系统中线程的数量,从而导致系统资源的浪费。
  • 线程竞争:一些库可能会在同一时间启动多个线程来执行任务,这样会导致线程之间的竞争,从而影响程序的执行效率。
  • 线程阻塞:一些库可能会在执行任务时阻塞主线程,从而导致程序的卡顿和响应速度变慢。

本文主要介绍了货拉拉为了解决使用第二方库和第三方库代理的线程问题,在线程优化方面做的一些工作

  1. 线程检测,评估优化空间。
  2. 线程统计,收集优化范围。
  3. 线程和线程池优化,线程数收敛。
  4. 线程栈裁剪,减少线程内存。

本文从检测到统计到优化,一步一步,深入浅出 Android 线程优化,非常具有实操性。

一文带你走进得物视频

随着移动网络的普及和互联网带宽的不断提升,视频观看已成为互联网的主要应用之一,面对海量的视频内容,用户们提出了越来越高的要求,如需要更快的加载速度、更流畅的播放体验、更高的画质和分辨率等,这些要求又产生了一系列挑战。

本文主要介绍了得物视频在视频体验优化方面做的一系统工作,主要包括以下内容:

  • 建立性能基线:针对视频播放场景建立 FPS,CPU,内存,发热,失败率等数据基线并持续优化
  • 视频质量提升:视频转码私有化部署,高帧率视频支持等
  • 视频卡顿率优化:视频播放器缓存库优化,视频预加载,预缓存策略优化等
  • 视频秒开优化:视频播放器异步初始化,播放器全局实例化,首帧优化,seek 后首帧优化等

最后更新: November 17, 2024