Android 性能优化技术月报 | 2024 年 12 月
每个月都会有一些 Android 性能优化相关的优质内容发布,然而,碎片化阅读使得这些知识难以形成完整体系,且容易被遗忘。为解决这些问题,我决定尝试使用技术月报的形式,总结我在最近一个月内查阅的 Android 性能优化相关的优质内容。
月报的主要内容包括:整理展示我在最近一个月所查阅的 Android 性能优化领域的最新技术动态、精选博客,精选视频等内容。
精选博客
如何理解Native Crash问题
文章主要介绍了 Android 开发中 Native Crash 的相关内容,包括常见的 Native Crash 类型、以及常见的 native crash 定位方法。
- Android日志:当程序发生了 Native Crash 错误,Android 的日志会输出到 log crash buffer 上,因此我们通过adb logcat -b crash 抓取到相应的错误报告,而日志本身能提供的信息是有限的,仅仅是错误堆栈,与当前线程的寄存器信息。
- Tombstone 定位:tombstone 文件保存的信息有错误程序的体系结构,通俗的说 arm、arm64 等,发生时间点,程序名,错误类型,错误程序的进程号、线程号,错误现场寄存器,堆栈和部分寄存器地址附近的内存信息,程序内存映射表 /proc/self/maps ,FD 信息以及发生错误时该程序输出的日志。线上需要 root 权限才能获取到 tombstone 文件。
- Coredump :Coredump 文件是一个二进制文件,包含进程在崩溃时的完整内存镜像和状态信息。其主要用于在调试器(如 gdb)中进行详细调试。开启起来更为麻烦, 需要修改内核配置并重新编译内核。
记一次手机厂商的BUG排查
记一次手机厂商的BUG排查,App码农如何自证清白,不背锅:关于排除全面屏手势区域不生效的问题
这篇文章主要讲述了作者对全面屏手势区域不生效问题的排查过程。作者通过多种方法调试,最终发现是 MIUI 的 launcher 添加的透明窗口导致部分排除区域被系统忽略。问题其实不算复杂,排查方法和思路值得借鉴。
- 通过开启“显示指针位置”功能,显示触摸位置小白点
- 通过 Pine 去 hook AIDL 接口,确认系统接口是否调用成功
- 通过 grep -r 'reportSystemGestureExclusionChanged' 查找手机系统中的源码
- 通过开启指针位置隐藏功能,把系统已排除了的手势区域标记为红色
- 通过dumpsys window | grep 'Window #' -A 10查看当前有哪些window
Android R8 耗时优化
作者在进行全源码编译时,Release 包编译时间过长,其中 minifyReleaseWithR8 任务耗时近 14 分钟。作者对编译过程进行分析,尝试了多种方法但效果不佳,最后选择优化 r8 来提高编译速度。
具体方法是使用 GraalVM 将 r8.jar 编译成二进制文件,并通过参数传递、获取 r8、生成二进制文件以及 hook AGP 中的 runR8 方法等步骤来实现。
发现通过二进制运行,速度有一定的提升,优化前 13m40s, 优化后 7m45s,提升 40% 左右。
Android 崩溃率收敛至 0.01% 实践
文本主要介绍了项目中的崩溃收敛机制,包括创建修 BUG 分支、崩溃容灾机制、其他崩溃收敛以及 OOM 问题收敛等内容,旨在降低线上崩溃率,提高应用稳定性。
- 崩溃收敛机制: 每个版本发布之后,我们会创建一个opt分支,用于修复线上崩溃,下版上线。每天早晨查看Dump后台,分配给各个开发人员并排期。
- 崩溃容灾机制:系统异常问题,某手机厂商问题,依赖第三方 SDK 修复问题等。
- 其他崩溃收敛:梳理常见崩溃场景,维护研发质量表。包括空指针问题(推荐使用注解、Kotlin、判空等方法解决)、角标越界异常(集合传入 index 及操作 Spannable 接口时注意数值范围)、并发修改异常(推荐新集合遍历或使用线程安全集合)、系统服务调用(try catch 并写入日志文件判断是否上报)、数据库类问题(针对不同问题如内存申请过多、存储空间不足、数据库损坏等进行优化、检测和修复)。
- OOM 问题收敛:介绍 OOM 产生条件和原因,使用快手的 KOOM 监控线上内存泄露,自研开发者工具实时显示 APP 当前总体内存并设置阈值提醒开发同学,还监控线程数量和 FD 数量,通过工具排查问题。
最后更新:
January 5, 2025