Android 性能优化技术月报 | 2023 年 12 月
每个月都会有一些 Android 性能优化相关的优质内容发布,然而,碎片化阅读使得这些知识难以形成完整体系,且容易被遗忘。为解决这些问题,我决定尝试使用技术月报的形式,总结我在最近一个月内查阅的 Android 性能优化相关的优质内容。
月报的主要内容包括:整理展示我在最近一个月所查阅的 Android 性能优化领域的最新技术动态、精选博客,精选视频等内容。
最新动态
火热报名中 | 抖音客户端基础技术大揭秘
2024年1月13~14日两天,新年最新一期『抖音客户端基础技术大揭秘』技术沙龙活动重磅来袭,基于抖音客户端实践驱动的 iOS 和 Android 两场技术分享协助您开启新的一年技术之旅。
Android 专场具体包括如下内容:
- 抖音 ANR 自动归因平台建设实践
- 抖音 Android 启动调度框架探索
- 抖音 Android 线下质量体系建设实践
- 抖音安卓ART虚拟机优化策略与实践
- 抖音Android厂商合作优化探索与实践
精选博客
这是你们项目中WebView的样子吗?
你们项目中或者理想中的WebView的使用姿势是如何的?有哪些规范、功能?本文介绍了作者对于一个WebView使用的一些理解
- 可监控是 WebView 很重要的一个功能,包括耗时监控,错误监控等
- 与前端的交互也是 WebView 一个很重要的功能,可以把前端调用安卓的入口收敛到一个,然后通过传入方法名来分发到不同方法上
- WebView 的
WebViewClient
,WebChromeClient
中往往会包含很多自定义逻辑,很多项目都是直接封装一个 BaseWebViewClient,然后在里面做一堆逻辑处理,比如上面说的监控方法,或者 loading 操作等,BaseWebViewClient 往往会变得臃肿,可以使用用拦截器的思路优化。
Android GC 抑制
Android 2.3 引入了并发 GC。并发 GC 的好处,是减少了 GC 的停顿时间,减轻 GC 停顿导致用户感受到的卡顿。
但是,并发 GC,有时候还是会抢占 CPU,导致主线程、RenderThread 等被迫切换到小核上,或者抢不到 CPU 时间片,导致页面卡顿。由此,为了优化一些核心场景的体验,坊间开始流行起 "GC 抑制"。
GC 抑制的核心思想,是短时间内干扰,甚至停止并发 GC,避免并发 GC 带来的抢占 CPU 问题。而短时间内的 GC 抑制,通常不会导致 OOM 等问题。
本文主要探讨 Android 5.0 以后的 GC 抑制。具体分三个方面:
- GC 抑制的收益
- GC 抑制的两种实现方案: 挂起 GC 线程与调大 heap 触发 GC 的阈值
- GC 抑制的应用场景
总得来说,应用开发者实现 GC 抑制比较困难,无论是 inline hook 还是虚函数 hook,耗时都要几毫秒,甚至十几毫秒。而在应用启动的场景中,不一定会发生 GC。容易造成负优化,主要还是学习各种技术思路及方案实现为主。
App跨平台框架VS原生开发深度评测之2023版
App跨平台框架历史悠久,从cordova、react native、flutter,直到最近的uni-app x。江山代有才人出,每个都试图颠覆原生,但过去却一直未成功。
过去的问题到底在哪里?本文作者对比了各种技术路线,分析这些跨平台开发框架和原生应用的差别具体在哪里。需要注意的是,本文作者是 DCloud 的架构师,也就是 uni-app 与 uni-app x 的开发者,虽然难免有自卖自夸之嫌,但相信也可以为大家在技术选型时带来一些启发。
100行代码搭建一个IO泄露监测框架
IO 一般就是指的常见的文件流读写、数据库读写,相信每个人都知道,完成读写后都应该手动调用流的 close() 方法关闭,一旦忘记就引起了 io 泄漏了。
如果项目中这种问题场景比较多,就会导致 fd 无节制的增加,导致应用内存紧张,严重甚至引发 OOM,非常影响用户体验。
java 中的AutoCloseable
搭配try-with-resource
与 Kotlin 中的use
都可以帮助我们实现自动化的关闭流。但是真正到写代码时有时还是会忘记;而且项目中还可能存在历史代码也忘记了关闭流,查找起来也是毫无头绪的。
因此搭建一个 IO 泄漏监测框架还是很有必要的,本文就介绍了如何借助动态代理和反射,仅用100行代码来实现 IO 泄露的监控。
一种鸿蒙应用网络数据监控方法
本文分析了鸿蒙的网络库请求逻辑在 libhttp.z.so 中,内部使用 curl 实现。如果我们想做接口性能监控比如 dns 解析耗时,建连耗,就可以利用curl提供的能力去做。
同时由于鸿蒙模拟器及真机无法安装 CA 证书,抓包不便,本文也通过 hook curl 实现了打印网络请求内容,缓解了鸿蒙上调试接口时拿不到接口调试数据的困难。