Android性能优化专栏
目录
03.Native崩溃治理实践
04.ANR监控设计实践
01.ANR整体概述
02.ANR基础分析
- 究竟什么是ANR:ANR Activity not responding(页面没有响应) ;ANR Application not responding 应用没有响应
- ANR产生条件:主线程(是指应用进程中的主线程),超时时间(是指四大组件的超时未响应处理时间),输入事件或者特定操作
- 造成ANR的原因一般有:当前时间没有及时处理(looper被某种原因阻塞导致没有处理事件),当前事件正在处理未及时完成
- 那些操作会引发ANR:比如断点调试;主线程做耗时操作,activity页面做暴力点击事件等,都可能出现ANR
- 如何理解四大组件ANR:Activity是5秒界面未响应则ANR;Service前台20秒后台200秒未完成启动则ANR;Receiver广播前台10秒在onReceive中未处理完则ANR;
03.ANR流程分析
- 触发ANR的步骤是什么:大概是:埋下注册超时 ----> 触发超时 ----> 引发超时ANR,这个在源码中可以找出
- 四大组件Activity触发ANR流程:
- ANR后系统执行流程:App发生anr,进程收到异常终止信号开始写入anr信息(包括堆栈信息,cpu/io使用信息等),最后弹出系统Anr提示窗提示用户
- 那些极端情况不会ANR:进程正在处于正在关闭的状态,正在crash的状态,被kill的状态,或者相同进程已经处在ANR的流程中。
- ANR静默和弹窗如何理解:在源码appNotResponding方法中,会判断如果是前台,则是通过handler发送一个消息,创建anr弹窗对象,赋值给message的obj对象。
- 处理ANR信息收集是如何做的:
- dump进程stack是干什么:
04.ANR是怎么设计
- ANR是怎么设计:
- 什么是输入系统:简单来说,就是与Android设备交互,输入事件的管理和分发。
- 如何理解进程输入系统:
ANR
是一套监控Android
应用响应是否及时的机制,可以把发生ANR
比作是 引爆炸弹,那么整个流程包含三部分组成:
- 埋定时炸弹:中控系统(
system_server
进程)启动倒计时,在规定时间内如果目标(应用进程)没有干完所有的活,则中控系统会定向炸毁(杀进程)目标。 - 拆炸弹:在规定的时间内干完工地的所有活,并及时向中控系统报告完成,请求解除定时炸弹,则幸免于难。
- 引爆炸弹:中控系统立即封装现场,抓取快照,搜集目标执行慢的罪证(
traces
),便于后续的案件侦破(调试分析),最后是炸毁目标。
05.ANR监控排查思路
- 检测ANR核心原理是什么:监测ANR的核心原理是消息调度和超时处理。
- 使用FileObserver监听 /data/anr/traces.txt的变化:缺点:高版本ROM需要root权限。解决方案:海外Google Play服务、国内Hardcoder。
- 监控消息队列的运行时间(WatchDog):利用主线程的消息队列处理机制,应用发生卡顿,一定是在dispatchMessage中执行了耗时操作。打点统计dispatchMessage方法执行的时间,如果超出阀值,表示发生卡顿。
05.CPU消耗优化实践
06.卡顿监控设计实践
10.高性能图片优化方案
06.不同版本对Bitmap管理
Bitmap 在内存中的组成部分,在任何系统版本中都会存在以下 3 个部分:
- Java Bitmap 对象:位于 Java 堆,即我们熟悉的 android.graphics.Bitmap.java ;
- Native Bitmap 对象:位于 Native 堆,以 Bitmap.cpp 为代表,除此之外还包括与 Skia 引擎相关的 SkBitmap、SkBitmapInfo 等一系列对象;
- 图片像素数据:图片解码后得到的像素数据。
Bitmap 内存回收,谷歌设计两种回收机制:
- Finalizer 机制,提供对象回收之前释放资源时机
- 引用机制,类似做了一个弱引用,虚引用机制,能够利用引用类型感知Java对象回收
Android 8.0 之后Bitmap创建过程分析
- 步骤 1 - 创建解码器:创建一个面向输入流的解码器;
- 步骤 2 - 创建内存分配器:创建像素数据的内存分配器,默认使用 Native Heap 内存分配器(HeapAllocator),如果使用了 inBitmap 复用会采用其他分配器;
- 步骤 3 - 预分配像素数据内存:使用内存分配器预分配内存,并创建 Native Bitmap 对象;
- 步骤 4 - 解码:使用解码器解码,并写入到预分配内存;
- 步骤 5 - 返回 Java Bitmap 对象:创建 Java Bitmap 对象,并包装了指向 Native Bitmap 的指针,返回到 Java 层。
16.App启动优化实践
4.7 启动白屏说明
问题说明:Android启动白屏/黑屏(即使给启动activity设置布局也照样存在),主要是给App设置style样式导致。这个黑(白)屏正式的称呼应该是Preview Window,即预览窗口。主要是app启动——Preview Window(也称为预览窗口)——启动页,预览窗口导致bug!
解决办法:1.给当前启动页添加一个有背景的style样式,windowBackground就是即将展示的preview window;2.禁止加载Preview。