编程进阶网编程进阶网
  • 基础组成体系
  • 程序编程原理
  • 异常和IO系统
  • 六大设计原则
  • 设计模式导读
  • 创建型设计模式
  • 结构型设计模式
  • 行为型设计模式
  • 设计模式案例
  • 面向对象思想
  • 基础入门
  • 高级进阶
  • JVM虚拟机
  • 数据集合
  • Java面试题
  • C语言入门
  • C综合案例
  • C标准库
  • C语言专栏
  • C++入门
  • C++综合案例
  • C++专栏
  • HTML
  • CSS
  • JavaScript
  • 前端专栏
  • Swift
  • iOS入门
  • 基础入门
  • 开源库解读
  • 性能优化
  • Framework
  • 方案设计
  • 媒体音视频
  • 硬件开发
  • Groovy
  • 常用工具
  • 大厂面试题
  • 综合案例
  • 网络底层
  • Https
  • 网络请求
  • 故障排查
  • 专栏
  • 数组
  • 链表
  • 栈
  • 队列
  • 树
  • 递归
  • 哈希
  • 排序
  • 查找
  • 字符串
  • 其他
  • Bash脚本
  • Linux入门
  • 嵌入式开发
  • 代码规范
  • Markdown
  • 开发理论
  • 开发工具
  • Git管理
  • 百宝箱
  • 开源协议
  • 技术招聘
  • 测试经验
  • 职场提升
  • 技术模版
  • 关于我
  • 目标清单
  • 学习框架
  • 育儿经验
  • 我的专栏
  • 底层能力
  • 读书心得
  • 随笔笔记
  • 职场思考
  • 中华历史
  • 经济学故事
  • 基础组成体系
  • 程序编程原理
  • 异常和IO系统
  • 六大设计原则
  • 设计模式导读
  • 创建型设计模式
  • 结构型设计模式
  • 行为型设计模式
  • 设计模式案例
  • 面向对象思想
  • 基础入门
  • 高级进阶
  • JVM虚拟机
  • 数据集合
  • Java面试题
  • C语言入门
  • C综合案例
  • C标准库
  • C语言专栏
  • C++入门
  • C++综合案例
  • C++专栏
  • HTML
  • CSS
  • JavaScript
  • 前端专栏
  • Swift
  • iOS入门
  • 基础入门
  • 开源库解读
  • 性能优化
  • Framework
  • 方案设计
  • 媒体音视频
  • 硬件开发
  • Groovy
  • 常用工具
  • 大厂面试题
  • 综合案例
  • 网络底层
  • Https
  • 网络请求
  • 故障排查
  • 专栏
  • 数组
  • 链表
  • 栈
  • 队列
  • 树
  • 递归
  • 哈希
  • 排序
  • 查找
  • 字符串
  • 其他
  • Bash脚本
  • Linux入门
  • 嵌入式开发
  • 代码规范
  • Markdown
  • 开发理论
  • 开发工具
  • Git管理
  • 百宝箱
  • 开源协议
  • 技术招聘
  • 测试经验
  • 职场提升
  • 技术模版
  • 关于我
  • 目标清单
  • 学习框架
  • 育儿经验
  • 我的专栏
  • 底层能力
  • 读书心得
  • 随笔笔记
  • 职场思考
  • 中华历史
  • 经济学故事
  • 01.崩溃捕获设计实践
  • 02.崩溃治理优化总结
  • 03.Native崩溃治理实践
  • 04.ANR监控设计实践
  • 05.CPU消耗优化实践
  • 06.卡顿监控设计实践
  • 07.卡顿治理优化实践
  • 08.网络分析与优化实践
  • 09.线程优化实践操作
  • 10.高性能图片优化方案
  • 11.OOM异常优化实践
  • 12.内存监控优化方案
  • 13.内存治理优化实践
  • 14.FPS监测设计实践
  • 15.进程优化设计实践
  • 16.App启动优化实践
  • 17.App页面UI优化实践
  • 18.App稳定性专项实践
  • 19.App瘦身优化实践
  • 20.常见代码优化实践
  • 21.移动端防抓包实践
  • 22.App磁盘沙盒实践
  • 23.Ping工具开发实践
  • 24.Gradle构建优化实践
  • 25.CodeReview实践总结

Android性能优化专栏

目录

  • 01.崩溃捕获设计实践
  • 02.崩溃治理优化总结
  • 03.Native崩溃治理实践
  • 04.ANR监控设计实践
  • 05.CPU消耗优化实践
  • 06.卡顿监控设计实践
  • 07.卡顿治理优化实践
  • 08.网络分析与优化实践
  • 09.线程优化实践操作
  • 10.高性能图片优化方案
  • 11.OOM异常优化实践
  • 12.内存监控优化方案
  • 13.内存治理优化实践
  • 14.FPS监测设计实践
  • 15.进程优化设计实践
  • 16.App启动优化实践
  • 17.App页面UI优化实践
  • 18.App稳定性专项实践
  • 19.App瘦身优化实践
  • 20.常见代码优化实践
  • 21.移动端防抓包实践
  • 22.App磁盘沙盒实践
  • 23.Ping工具开发实践
  • 24.Gradle构建优化实践
  • 25.CodeReview实践总结

03.Native崩溃治理实践

04.ANR监控设计实践

01.ANR整体概述

02.ANR基础分析

  1. 究竟什么是ANR:ANR Activity not responding(页面没有响应) ;ANR Application not responding 应用没有响应
  2. ANR产生条件:主线程(是指应用进程中的主线程),超时时间(是指四大组件的超时未响应处理时间),输入事件或者特定操作
  3. 造成ANR的原因一般有:当前时间没有及时处理(looper被某种原因阻塞导致没有处理事件),当前事件正在处理未及时完成
  4. 那些操作会引发ANR:比如断点调试;主线程做耗时操作,activity页面做暴力点击事件等,都可能出现ANR
  5. 如何理解四大组件ANR:Activity是5秒界面未响应则ANR;Service前台20秒后台200秒未完成启动则ANR;Receiver广播前台10秒在onReceive中未处理完则ANR;

03.ANR流程分析

  1. 触发ANR的步骤是什么:大概是:埋下注册超时 ----> 触发超时 ----> 引发超时ANR,这个在源码中可以找出
  2. 四大组件Activity触发ANR流程:
  3. ANR后系统执行流程:App发生anr,进程收到异常终止信号开始写入anr信息(包括堆栈信息,cpu/io使用信息等),最后弹出系统Anr提示窗提示用户
  4. 那些极端情况不会ANR:进程正在处于正在关闭的状态,正在crash的状态,被kill的状态,或者相同进程已经处在ANR的流程中。
  5. ANR静默和弹窗如何理解:在源码appNotResponding方法中,会判断如果是前台,则是通过handler发送一个消息,创建anr弹窗对象,赋值给message的obj对象。
  6. 处理ANR信息收集是如何做的:
  7. dump进程stack是干什么:

04.ANR是怎么设计

  1. ANR是怎么设计:
  2. 什么是输入系统:简单来说,就是与Android设备交互,输入事件的管理和分发。
  3. 如何理解进程输入系统:

ANR是一套监控Android应用响应是否及时的机制,可以把发生ANR比作是 引爆炸弹,那么整个流程包含三部分组成:

  1. 埋定时炸弹:中控系统(system_server进程)启动倒计时,在规定时间内如果目标(应用进程)没有干完所有的活,则中控系统会定向炸毁(杀进程)目标。
  2. 拆炸弹:在规定的时间内干完工地的所有活,并及时向中控系统报告完成,请求解除定时炸弹,则幸免于难。
  3. 引爆炸弹:中控系统立即封装现场,抓取快照,搜集目标执行慢的罪证(traces),便于后续的案件侦破(调试分析),最后是炸毁目标。

05.ANR监控排查思路

  1. 检测ANR核心原理是什么:监测ANR的核心原理是消息调度和超时处理。
  2. 使用FileObserver监听 /data/anr/traces.txt的变化:缺点:高版本ROM需要root权限。解决方案:海外Google Play服务、国内Hardcoder。
  3. 监控消息队列的运行时间(WatchDog):利用主线程的消息队列处理机制,应用发生卡顿,一定是在dispatchMessage中执行了耗时操作。打点统计dispatchMessage方法执行的时间,如果超出阀值,表示发生卡顿。

05.CPU消耗优化实践

06.卡顿监控设计实践

10.高性能图片优化方案

06.不同版本对Bitmap管理

Bitmap 在内存中的组成部分,在任何系统版本中都会存在以下 3 个部分:

  1. Java Bitmap 对象:位于 Java 堆,即我们熟悉的 android.graphics.Bitmap.java ;
  2. Native Bitmap 对象:位于 Native 堆,以 Bitmap.cpp 为代表,除此之外还包括与 Skia 引擎相关的 SkBitmap、SkBitmapInfo 等一系列对象;
  3. 图片像素数据:图片解码后得到的像素数据。

Bitmap 内存回收,谷歌设计两种回收机制:

  1. Finalizer 机制,提供对象回收之前释放资源时机
  2. 引用机制,类似做了一个弱引用,虚引用机制,能够利用引用类型感知Java对象回收

Android 8.0 之后Bitmap创建过程分析

  1. 步骤 1 - 创建解码器:创建一个面向输入流的解码器;
  2. 步骤 2 - 创建内存分配器:创建像素数据的内存分配器,默认使用 Native Heap 内存分配器(HeapAllocator),如果使用了 inBitmap 复用会采用其他分配器;
  3. 步骤 3 - 预分配像素数据内存:使用内存分配器预分配内存,并创建 Native Bitmap 对象;
  4. 步骤 4 - 解码:使用解码器解码,并写入到预分配内存;
  5. 步骤 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。

贡献者: yangchong211