做了这么久性能相关的工作,也接触了不少模块,说实话要做好性能这一块,真心不容易.为什么这么说? 是因为需要接触的知识实在是太多了, Android 是一个整体,牵一发而动全身,不是说只懂一个模块就可以做好
在学习的过程中,除了看源码,我还接触到了很多互联网上已有的知识,各位前辈们,将他们的知识和经验倾囊相授,让我少走了很多弯路. 我在自己的笔记里面存了很多很优秀的技术文章和技术文档,现在我决定将这些放到网上,让每一个想进入 Android 系统开发和优化这个领域的人,能通过阅读这篇文章,快速入门. 同时也算是我对知识的一个梳理,查漏补缺,终身学习
这篇文章记录了 Android 性能优化所必须掌握的知识,涵盖性能优化相关的方方面面(当然如果读者同学你也有很棒的私藏文章,也可以加入到这篇文章里面).部分文章可能需要特殊的技巧才能看到,希望你已经掌握了这一部分技巧。另外附送Android 开发者学习路线(2020 版本)
这篇文章会持续更新,最新更新时间:2020-04-27. 更多 Android 相关知识文章可以去个人博客
优化心得和经验
- 系列视频 Android Performance Patterns
- 给 App 提速:Android 性能优化总结
- 移动端性能监控方案 Hertz
- Android 性能优化后续
- Android性能优化之虚拟机调优
- Android UI 性能优化
- Performance Tips
- 美团外卖Android Lint代码检查实践
- Android battery and memory optimizations - Google I/O 2016
- Google 免费的公开课 : Android Performance
- Android APP 性能优化的一些思考
- 使用Android Studio和MAT进行内存泄漏分析
- 历时1年,上百万行代码!首次揭秘手淘全链路性能优化(上)
- 别催更啦!手淘全链路性能优化下篇
- Android开发高手课
- 手Q Android缓存监控与优化实践
- 微信读书(Android)阅读引擎卡顿监控测试
- Data science for mobile OS system optimization
- Matrix TraceCanary -- 初恋·卡顿
- Matrix IOCanary -- I/O 质量监控
- 见微知著,Google Photos Web UI 完善之旅
- 微信 Android 终端内存优化实践
- 支付宝客户端架构解析:Android 客户端启动速度优化之「垃圾回收」
- 抖音BoostMultiDex优化实践:Android低版本上APP首次启动时间减少80%
- 抖音包大小优化-资源优化
- 性能问题终结者”Olympic
- 美团Java线程池实现原理及其在美团业务中的实践
- Probe:Android线上OOM问题定位组件
响应速度
- Android App 启动优化全记录
- Optimizing Boot Times
- Android 中如何计算 App 的启动时间
- Google 官方文档 - Launch-time performance
- 都9102年了,Android 冷启动优化除了老三样还有哪些新招?
- 支付宝 App 构建优化解析:通过安装包重排布优化 Android 端启动性能
- Redex 初探与 Interdex:Andorid 冷启动优化
- Android性能优化笔记(一)——启动优化
- 抖音研发实践:基于二进制文件重排的解决方案 APP启动速度提升超15%
- 爱奇艺Android客户端启动优化与分析
- 深入探索Android启动速度优化
流畅度
- Android 中的卡顿丢帧原因概述 - 方法论
- Android 中的卡顿丢帧原因概述 - 系统篇
- Android 中的卡顿丢帧原因概述 - 应用篇
- Android 平台应用宝和讯飞输入法无障碍服务导致的全局卡顿分析
- Evaluating Performance
- Understanding Systrace
- Using ftrace
- Identifying Capacity-Related Jank
- Identifying Jitter-Related Jank
- 那些年我们用过的显示性能指标
- Slow rendering
- Android 流畅度检测原理简析
- Android JankTracker 原理解析
- Android 界面性能调优手册
- App流畅度优化:利用字节码插桩实现一个快速排查高耗时方法的工具
内存
- Android 中低内存对性能的影响
- Low RAM Configuration
- Linux Swap 与 Zram 详解
- Android 加载不同 DPI 资源与内存消耗间的关系
- ZRAM SWAP 内存管理讲解
- Android OOM 案例分析
- Android 代码内存优化建议-Android 资源篇
- Android 代码内存优化建议-Android 官方篇
- Android 代码内存优化建议-Java 官方篇
- Android 内存优化之一:MAT 使用入门
- Android 内存优化之二:MAT 使用进阶
- Android 内存优化之三:打开 MAT 中的 Bitmap 原图
- Android 代码内存优化建议-OnTrimMemory 优化
- Android LowMemoryKiller原理分析
- Android 匿名共享内存(Ashmem)原理
- 郝健: Linux内存管理学习笔记-第1节课
- 郝健: Linux内存管理学习笔记-第2节课
- 郝健: Linux内存管理学习笔记-第3节课
- 郝健: Linux内存管理学习笔记-第4节课
- 郝健: Linux内存管理学习笔记-第5节课
- 郝健: Linux内存管理学习笔记-第6节课
- Manage your app's memory
- Overview of memory management
- Linux 查看进程消耗内存情况总结
- 一次过程Android平台native heap内存泄露的追查过程
- 浅谈Cache Memory
- Bitmap优化详谈
- 探索 Android 内存优化方法
- 看完这篇文章,解决 APP 中 90 % 的内存异常问题
- 实践App内存优化:如何有序地做内存分析与优化
- 谈谈内存压缩那些事
- dumpsys meminfo 的原理和应用
图形栈
- Android display pipeline本身以及进程调度
- Android 中的 Hardware Layer 详解
- Android 硬件加速原理与实现简介
- Android 图形系统概述
- Choreographer 原理
- SurfaceFlinger 启动篇
- SurfaceFlinger 绘图篇
- Android 应用程序 UI 硬件加速渲染技术简要介绍和学习计划
- Android 应用程序 UI 硬件加速渲染环境初始化过程分析
- Android 应用程序 UI 硬件加速渲染的预加载资源地图集服务(Asset Atlas Service)分析
- Android 应用程序 UI 硬件加速渲染的 Display List 构建过程分析
- Android 应用程序 UI 硬件加速渲染的 Display List 渲染过程分析
- Android 应用程序 UI 硬件加速渲染的动画执行过程分析
- Android硬件加速(一)- 理解Android硬件加速原理的小白文
- Android硬件加速(二)- RenderThread与OpenGL GPU渲染
- Android中的GraphicBuffer同步机制-Fence
- Android P 图形显示系统(一)硬件合成HWC2
- Android P 图像显示系统(二)GraphicBuffer和Gralloc分析
- Android P 图像显示系统(三)Android HWUI 绘制流程
- Android P 图形显示系统(四) Android VirtualDisplay解析
- Android P 图形显示系统(五) 上层Client和SurfaceFlinger的交互
- Android P 图形显示系统(六) SurfaceFlinger合成流程(一)
- Android P 图形显示系统(七) SurfaceFlinger合成流程(二)
- Android P 图形显示系统(八) SurfaceFlinger合成流程(三)
- Android P 图形显示系统(九) Android图形显示子系统概述
- Android P 图形显示系统(十) BufferQueue(一)
- Android P 图形显示系统(十一) BufferQueue(二)
- Android P 图形显示系统(十二) BufferQueue(三)
- 渲染流水线中的光栅化1
- 渲染流水线中的光栅化2
虚拟机
- 带你了解 Android 10 中的 art
- 带你了解 Android 10 中的 art
- 带你了解 Android 10 中的 art
- 带你了解 Android 10 中的 art
- 带你了解 Android 10 中的 art
- ART and Dalvik
- Android 8.0 ART Improvements
- Dalvik bytecode
- Dalvik Executable format
- Dalvik Executable instruction formats
- Constraints
- Configuring ART
- Debugging ART Garbage Collection
- Implementing ART Just-In-Time (JIT) Compiler
- 深入学习Android:虚拟机&运行时
- Android性能优化之虚拟机调优
- Android上的Dalvik虚拟机
- Android上的ART虚拟机
- Android ART 并行拷贝垃圾回收
- Android ART dex2oat 浅析
系统框架
- Task Snapshots
- Android Input 子系统:Input 进程的创建,监听线程的启动
- Android Input 子系统:Input 事件的产生、读取和分发,InputReader、InputDispatcher
- EventHub 与设备、Input 事件的交互
- Android 消息机制,从Java 层到 Native 层剖析
- 理解 Android Binder 机制(1/3):驱动篇
- 理解 Android Binder 机制(2/3):C++ 层
- 理解 Android Binder 机制(3/3):Java 层
- Android Bander 设计与实现 - 设计篇
- 四大组件之综述
- 四大组件之 ActivityRecord
- 四大组件之 ContentProviderRecord
- 四大组件之 BroadcastRecord
- 四大组件之 ServiceRecord
- 简述 Activity 与 Window 关系
- 理解 Android Context
- 理解 Application 创建过程
- 以 Window 视角来看 startActivity
- WMS—启动窗口(StartingWindow)
- WMS—启动过程
- 写给 Android 应用工程师的 Binder 原理剖析
- Binder系列—开篇
- Binder系列1—Binder Driver初探
- Binder系列2—Binder Driver再探
- Binder系列3—启动ServiceManager
- Binder系列4—获取ServiceManager
- Binder系列5—注册服务(addService)
- Binder系列6—获取服务(getService)
- Binder系列7—framework层分析
- Binder系列8—如何使用Binder
- Binder系列9—如何使用AIDL
- Binder系列10—总结
- 彻底理解Android Binder通信架构
- Android Bander设计与实现 - 设计篇
- Binder学习指南
- 你知道android的MessageQueue.IdleHandler吗?
- 聊一聊Android的消息机制
- 聊聊 APK (一) ——直接运行 Dex文件的黑魔法
- 聊聊 APK(二)——Dex 热修复与 Classpath
- 聊聊 APK(三)—— Android 资源编译的秘密
- 卢半山 - 反思|Android 事件拦截机制的设计与实现
- 卢半山 - Binder 内存拷贝的本质和变迁
- 卢半山 - AIDL 中 inout 的本质
- 卢半山 - Binder 的异常机制
- 卢半山 - Binder 世界中的代理机制(上)
- 卢半山 - Binder 概述
- Android 系统架构 —— Choreographer 的工作机制
- Looper的wake机制升级
- Android10.0 Binder通信原理(一)Binder、HwBinder、VndBinder概要
- Android10.0 Binder通信原理(二)-Binder入门篇
- Android10.0 Binder通信原理(三)-ServiceManager篇
- Android10.0 Binder通信原理(四)-Native-C\C++实例分析
- Android10.0 Binder通信原理(五)-Binder驱动分析
- Android10.0 Binder通信原理(六)-Binder数据如何完成定向打击
- Android10.0 Binder通信原理(七)-Framework binder示例
- Android10.0 Binder通信原理(八)-Framework层分析
- Android10.0 Binder通信原理(九)-AIDL Binder示例
- Android10.0 Binder通信原理(十)-AIDL原理分析-Proxy-Stub设计模式
稳定性
- 彻底理解安卓应用无响应机制
- 应用与系统稳定性第一篇---ANR问题分析的一般套路
- 应用与系统稳定性第二篇---ANR的监测与信息采集
- 应用与系统稳定性第三篇---FD泄露问题漫谈
- 应用与系统稳定性第四篇---单线程导致的空指针问题分析
- 应用与系统稳定性第五篇---Watchdog原理和问题分析
- 应用与系统稳定性第六篇---JVM垃圾回收之finalize执行时引起timed out 闪退分析
- 应用与系统稳定性第七篇--- 用Asan 提前解决NDK疑难crash
功耗
- 能感知功耗的Linux调度器(EAS)
- Android 功耗改进
进程管理
- cpuset
- cgroup
- Android 进程调度之 adj 算法
- Linux 进程管理(一)
- Linux 进程管理(二)--fork
- Linux 进程 pid 分配法
- 收费培训视频 打通 Linux 脉络系列:进程、线程和调度
- Android 系统中的进程管理:进程的创建
- Android 系统中的进程管理:进程的优先级
- Android 系统中的进程管理:内存的回收
- Android系统上的进程管理:进程的调度
- Android 系统启动:init 进程与 init 语言
- Android 进程保活招式大全
- 进程和线程
- 通过线程提升性能
- 解读Android进程优先级ADJ算法
- 杂谈Android线程优先级
IO
- Android 性能优化 —— IO 的监控与优化
- 从内核文件系统看文件读写过程
- 认真分析mmap:是什么 为什么 怎么用
调试工具
- 另一个 Android 性能剖析工具——simpleperf
- Simpleperf
- 如何调试 Android Framework
- 如何调试 Android Native Framework
- Catapult 项目
- 手把手教你使用Systrace(一)
- 手把手教你使用Systrace(二)——锁优化
- 使用Android Studio和MAT进行内存泄漏分析
- Systrace 简介
- Systrace 基础知识 - Systrace 预备知识
- Systrace 基础知识 - Why 60 fps ?
- Systrace 基础知识 - SystemServer 解读
- Systrace 基础知识 - Input 解读
- Systrace 基础知识 - Vsync 产生与工作机制解读
- Systrace 基础知识 - Vsync-App :基于 Choreographer 的渲染机制详解
- Systrace 基础知识 - MainThread 和 RenderThread 解读
- Systrace 基础知识 - Binder 和锁竞争解读
- Systrace 基础知识 - Triple Buffer 解读
- Systrace 基础知识 - CPU Info 解读
- Tracing Window Transitions
- Android性能问题分析之bugreport
- 腾讯 Apm 框架 Matrix 源码阅读 - gradle插件
- 腾讯 Apm 框架 Matrix 源码阅读 - TracePlugin 架构解析
- 腾讯 Apm 框架 Matrix 源码阅读 - TracePlugin 之 AnrTracer
- 腾讯 Apm 框架 Matrix 源码阅读 - TracePlugin 之 StartupTracer
- 腾讯 Apm 框架 Matrix 源码阅读 - TracePlugin 之 FrameTracer
- 腾讯 Apm 框架 Matrix 源码阅读 - 架构解析
硬件相关
- Flash Wear Management in Android Automotive
- Cortex-A75 和 Cortex-A55
- CPU Utilization is Wrong
编程语言
- 探索 Java 隐藏的开销
- Kotlin 中文文档
- Java多态在android中的实现
- Cancellation and Exceptions in Coroutines
- Coroutines: First things first
- Cancellation in coroutines
- Exceptions in Coroutines
- Coroutines & Patterns for work that shouldn’t be cancelled
- 彻底理解引用在 Android 和 Java 中的工作原理
Linux
- 内核探索:Regmap 框架:简化慢速 I/O 接口优化性能
- 嵌入式 Linux 启动时间优化
- Linux文件系统预读的情景分析
- 使用blktrace统计磁盘块I/O访问频率
- Linux系统调用(syscall)原理
- 浅墨: 聊聊Linux IO(上)
- 浅墨: 聊聊Linux IO(中)——Linux内核中的IO栈
- 浅墨: 聊聊Linux IO(下)
- 郭健: deadline调度器之(一):原理
- 郭健: Deadline调度器之(二):细节和使用方法
- 郭健: Linux内存模型——平坦、非连续与稀疏
- linux内核分析——CFS(完全公平调度算法)
- 从几个问题开始理解CFS调度器
- CFS调度器(1)-基本原理
- CFS调度器(2)-源码解析
- CFS调度器(3)-组调度
- CFS调度器(4)-PELT(per entity load tracking)
- CFS调度器(5)-带宽控制
- CFS调度器(6)-总结
- 关于线程和I/O模型的极简知识
- TRIM:提升磁盘性能,缓解Android卡顿
- LWN 456904: 避免磁盘回写(writeback),抑制(throttling)缓存(page cache)写入
- LWN 384093: 有关 “回写”(writeback)的问题讨论
- LWN 211505: 避免和解决内存碎片化
- SMP Primer for Android
- 内存分配1 - 空闲链表和内存池
- 内存分配2 - Buddy系统的原理
- 内存分配3 - Linux中Buddy系统的实现
- Linux中的内存压缩
- 研究Linux内核的乐趣
- linux IO Block layer 解析
- CFS任务的负载均衡(框架篇)
- 一张图读懂内存反碎片化
- 浅谈新型非易失存储
- Linux devfreq framework 剖析
- 内存泄漏(增长)火焰图
- Linux 系统性能评测基准系统配置及其原理
- Cgroups 与 Systemd
Flutter
- 深入 Flutter 的高性能图形渲染
- 跨平台技术演进及Flutter未来
- 跨平台技术趋势及字节跳动 Flutter 架构实践
- Flutter 的性能测试和理论
- 深入理解 Flutter 多线程
- 深入理解Flutter引擎启动
- Flutter渲染机制—UI线程
- Flutter渲染机制—GPU线程
Fuchsia
- 许中兴博士演讲:Fuchsia OS 简介
技术之外的思考
- 我到底有多么努力
- 工作以来的一些感悟
- 如何自学Android?
- 技术人最重要的能力是什么?
- 浅谈软件工程师的代码素养
- 陆奇:除了好代码,工程师怎样才算优秀?
- 别让自己“墙”了自己
- 100% 成功率的 offer 收割机是怎样练成的?
- 使用简单的逻辑方法进行独立思考
面试题
- Android 2018 最新面试题
- 如何衡量一个Android应用开发人员的能力
- 2018Android面试总结
- Android2017-2018最新面试题(3-5年经验个人面试经历)
- Android 开发工程师面试指南
- 阿里电话面试面试题总结,附答案!
- 阿里巴巴面试题
- 美团面试题
- 豌豆荚三面试题
- 蜻蜓FM面试题
- 新浪微博面试题
- 网易杭研面试题
- 为什么想来我们公司工作?- 面试常见问题解析
- 今日头条大佬十年面试了 2000 人,总结了这 5 点
- 2019 年美团点评高级 Android 开发寒冬跳槽涨薪经验掏心分享
- 如何回答性能优化的问题,才能打动阿里面试官?
- 2019.07 Android 面试真题集锦
- 技术面试中面试官怎么考察候选人?
- 给扔物线 HenCoder Plus 学员的一次分享文字版
- 快手,字节跳动,百度,美团Offer之旅
- 美帝面试二三事
本文其他地址
由于博客留言交流不方便,点赞或者交流,可以移步本文的知乎或者掘金页面
知乎 - Android 性能优化必知必会
关于我 && 博客
- 关于我 , 非常希望和大家一起交流 , 共同进步 .
- 博客内容导航
- 优秀博客文章记录 - Android 性能优化必知必会
一个人可以走的更快 , 一群人可以走的更远
更多内容可以进入 Android Performance 查看