这篇文章记录了 Android 性能优化所必须掌握的知识(主要是对应的优秀文章、公众号、博客、技术团队等),涵盖性能优化相关的方方面面。本文会持续更新,欢迎各位自荐或者推荐。
做了这么久性能相关的工作,也接触了不少模块,说实话要做好性能这一块,真心不容易。为什么这么说? 是因为需要接触的知识实在是太多了,Android 是一个整体,牵一发而动全身,不是说只懂一个模块就可以做好。
在学习的过程中,除了看源码,我还接触到了很多互联网上已有的知识,各位前辈们将他们的知识和经验倾囊相授,让我少走了很多弯路。我在自己的笔记里面存了很多很优秀的技术文章和技术文档,现在我决定将这些放到网上,让每一个想进入 Android 系统开发和优化这个领域的人,能通过阅读这篇文章,快速入门。同时也算是我对知识的一个梳理,查漏补缺,终身学习。
这篇文章记录了 Android 性能优化所必须掌握的知识,涵盖性能优化相关的方方面面(当然如果读者同学你也有很棒的私藏文章,也可以加入到这篇文章里面)。部分文章可能需要特殊的技巧才能看到,希望你已经掌握了这一部分技巧。另外附送 Android 开发者学习路线(2020 版本)。
这篇文章会持续更新,最新更新时间:2022-06-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问题定位组件
- 优化实践: 高刷下列表滑动出现卡顿掉帧的现象
- iOS 高刷屏监控 + 优化:从理论到实践全面解析
- 通过 ASM 实现大图监控
- Android S 原生系统内存泄露问题案例
- Can you trust time measurements in Profiler?
- 移动域全链路可观测架构和关键技术
响应速度
- Android应用启动全流程分析(源码深度剖析)
- Android App 启动优化全记录
- Optimizing Boot Times
- Android 中如何计算 App 的启动时间
- Google 官方文档 - Launch-time performance
- 都 9102 年了,Android 冷启动优化除了老三样还有哪些新招?
- 支付宝 App 构建优化解析:通过安装包重排布优化 Android 端启动性能
- Redex 初探与 Interdex:Andorid 冷启动优化
- Android 性能优化笔记(一)——启动优化
- 抖音研发实践:基于二进制文件重排的解决方案 App 启动速度提升超15%
- 爱奇艺 Android 客户端启动优化与分析
- 深入探索 Android 启动速度优化
- 抖音 Android 性能优化系列:启动优化之理论和工具篇
- APM 页面加载耗时校准
- Improving App Performance with Baseline Profiles
流畅度
- Android 中的卡顿丢帧原因概述 - 方法论
- 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 流畅度优化:利用字节码插桩实现一个快速排查高耗时方法的工具
- 或许是迄今为止第一篇讲解 fps 计算原理的文章吧
- Jank 卡顿及 stutter 卡顿率说明
- 一文读懂直播卡顿优化那些事儿
内存
- 抖音 Android 性能优化系列:Java OOM 优化之 NativeBitmap 方案
- 拯救OOM!字节自研 Android 虚拟机内存管理优化黑科技 mSponge
- 抖音 Android 性能优化系列:Java 内存优化篇
- Android Camera内存问题剖析
- 一次大量 JVM Native 内存泄露的排查分析(64M 问题)
- Andriod Native | 采样型内存调试工具GWP-ASan
- Android Native | 内存问题的终极武器——MTE
- 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 的原理和应用
- Binder | 内存拷贝的本质和变迁
- 内存优化: 纹理压缩技术
- 使用 perfetto 分析 Android native 物理内存泄漏
- 使用 Android profiler 分析 Android native 物理内存泄漏
- Android JVMTI 实现应用内存动态检测
- ThreadLocal 源码分析以及可能引发的内存泄漏问题
- App处于前台,Activity就不会被回收了?
图形栈
- Android 12(S) 图形显示系统 - 开篇
- Android 12(S) 图形显示系统 - 基本概念(一)
- Android 12(S) 图形显示系统 - 示例应用(二)
- Android 12(S) 图形显示系统 - 应用建立和 SurfaceFlinger 的沟通桥梁(三)
- Android 12(S) 图形显示系统 - SurfaceFlinger 的启动和消息队列处理机制(四)
- Android 12(S) 图形显示系统 - createSurface 的流程(五)
- Android 12(S) 图形显示系统 - BufferQueue/BLASTBufferQueue 之初识(六)
- Android 12(S) 图形显示系统 - 几个常用类的介绍(七)
- 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
虚拟机
- ART虚拟机 | GC的触发时机和条件
- ART虚拟机 | Large Object Space
- ART虚拟机 | JNI调用的中间环节
- ART虚拟机 | Finalize的替代者Cleaner
- ART虚拟机 | 如何让GC同步回收native内存
- ART虚拟机 | Java对象和类的内存结构
- ART虚拟机 | JNI静态注册和动态注册
- ART虚拟机 | 锁
- ART虚拟机 | Android应用中SIGSEGV信号的处理流程
- 第三视角: 一个 ART GC 的优化故事
- GC 超时导致的后台应用崩溃问题分析
- 带你了解 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 浅析
系统框架
- Android画面显示流程分析(1)
- Android画面显示流程分析(2)
- Android画面显示流程分析(3)
- Android画面显示流程分析(4)
- Android画面显示流程分析(5)
- 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 Binder 设计与实现 - 设计篇
- 四大组件之综述
- 四大组件之 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 通信架构
- Binder 学习指南
- 你知道 android 的 MessageQueue.IdleHandler 吗?
- 聊一聊 Android 的消息机制
- 聊聊 APK (一) ——直接运行 Dex 文件的黑魔法
- 聊聊 APK(二)——Dex 热修复与 Classpath
- 聊聊 APK(三)—— Android 资源编译的秘密
- 卢半山 - 反思|Android 事件拦截机制的设计与实现
- 卢半山 - Binder 内存拷贝的本质和变迁
- 卢半山 - AIDL 中 inout 的本质
- 卢半山 - Binder 的异常机制
- 卢半山 - Binder 世界中的代理机制(上)
- 卢半山 - 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设计模式
- Android Framework | 一种新型的应用启动机制:USAP
- Android 跨进程通信:图文详解 Binder 机制 原理
- Android Native – Message/Handler/Looper 机制(原理篇)
- Android Native – Message/Handler/Looper 机制(应用篇)
- Android P/Q/R/S 9/10/11/12 多任务手势动画 OtherActivityInputConsumer 情况
- Android 启动画面
稳定性
- Android ANR|原理解析及常见案例
- 彻底理解安卓应用无响应机制
- 应用与系统稳定性第一篇—ANR 问题分析的一般套路
- 应用与系统稳定性第二篇—ANR 的监测与信息采集
- 应用与系统稳定性第三篇—FD 泄露问题漫谈
- 应用与系统稳定性第四篇—单线程导致的空指针问题分析
- 应用与系统稳定性第五篇—Watchdog 原理和问题分析
- 应用与系统稳定性第六篇—JVM 垃圾回收之 finalize 执行时引起 timed out 闪退分析
- 应用与系统稳定性第七篇— 用 Asan 提前解决NDK疑难crash
- Android中的进程名和线程名
- Android Runtime | Trace文件的生成机制
- 讨论 | 基于FP的栈回溯对于主线程的特殊处理
- Android 资源溢出崩溃轻松解
- 字节Android Native Crash治理之Memory Corruption工具原理与实践
- 西瓜视频稳定性治理体系建设一:Tailor 原理及实践
- 西瓜视频稳定性治理体系建设二:Raphael 原理及实践
- 西瓜视频稳定性治理体系建设三:Sliver 原理及实践
- 西瓜卡顿 & ANR 优化治理及监控体系建设
- 今日头条 ANR 优化实践系列 - 设计原理及影响因素
- 今日头条 ANR 优化实践系列 - 监控工具与分析思路
- 今日头条 ANR 优化实践系列分享 - 实例剖析集锦
- 今日头条 ANR 优化实践系列 - Barrier 导致主线程假死
- 今日头条 ANR 优化实践系列 - 告别 SharedPreference 等待
- 自动拦截 50% crash,字节自研 Fastbot 如何助力今日头条稳定性测试
- 线上故障 - 通过系统日志分析和定位
功耗
进程管理
- cpuset
- cgroup
- Android 进程调度之 adj 算法
- Linux 进程管理(一)
- Linux 进程管理(二)–fork
- Linux 进程 pid 分配法
- 收费培训视频 打通 Linux 脉络系列:进程、线程和调度
- Android 系统中的进程管理:进程的创建
- Android 系统中的进程管理:进程的优先级
- Android 系统中的进程管理:内存的回收
- Android系统上的进程管理:进程的调度
- Android 系统启动:init 进程与 init 语言
- Android 进程保活招式大全
- 进程和线程
- 通过线程提升性能
- 解读 Android 进程优先级 ADJ 算法
- 杂谈 Android 线程优先级
IO
调试工具
- 另一个 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 解读
- Systrace 流畅性实战 1 :了解卡顿原理
- Systrace 流畅性实战 2 :案例分析: MIUI 桌面滑动卡顿分析
- Systrace 流畅性实战 3 :卡顿分析过程中的一些疑问
- Systrace 响应速度实战 1 :了解响应速度原理
- Systrace 响应速度实战 2 :响应速度实战分析-以启动速度为例
- Systrace 响应速度实战 3 :响应速度延伸知识
- Systrace 线程 CPU 运行状态分析技巧 - Runnable 篇
- Systrace 线程 CPU 运行状态分析技巧 - Running 篇
- Systrace 线程 CPU 运行状态分析技巧 - Sleep 和 Uninterruptible Sleep 篇
- 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 源码阅读 - 架构解析
- PerfettoViewer
- Android 性能分析工具介绍 | 开发者说·DTalk
硬件相关
编程语言
- 探索 Java 隐藏的开销
- Kotlin 中文文档
- Java 多态在 android 中的实现
- Cancellation and Exceptions in Coroutines
- 彻底理解引用在 Android 和 Java 中的工作原理
- Kotlin 中的协程、上下文和作用域
- 抽丝剥茧聊协程之深入理解 Continuation 原理
- Android Architecture Pattern
- High performance with idiomatic Kotlin
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
- Devfreq Bus Dcvs
- 基于 eBPF 的 CPU 利用率精准计算小工具开发
- 关于 eBPF 的一些粗浅理解
- 使用 ftrace 分析函数性能
- eBPF是什么?为什么对可观测性很重要
Flutter
- 深入 Flutter 的高性能图形渲染
- 跨平台技术演进及 Flutter 未来
- 跨平台技术趋势及字节跳动 Flutter 架构实践
- Flutter 的性能测试和理论
- 深入理解 Flutter 多线程
- 深入理解 Flutter 引擎启动
- Flutter 渲染机制— UI 线程
- Flutter 渲染机制— GPU 线程
- 深入探索 Flutter 性能优化
Fuchsia
技术之外的思考
- 如何在一个全新的领域展开学习
- 我到底有多么努力
- 工作以来的一些感悟
- 如何自学 Android?
- 技术人最重要的能力是什么?
- 浅谈软件工程师的代码素养
- 陆奇:除了好代码,工程师怎样才算优秀?
- 别让自己“墙”了自己
- 100% 成功率的 offer 收割机是怎样练成的?
- 使用简单的逻辑方法进行独立思考
- 这一年炼就的底层内功修养
- 084 创造自己的领域,乔布斯的人生规则,发声与退出,失眠的好处
- 我掌握到了如何无障碍观看英文技术视频
- 视频 - 泰勒·本-沙哈尔《正向领导力》
- Why did I choose to be an Android developer, not an IOS developer ?
- 技术负责人要停止写代码吗?
- 我是如何从哑巴英语到无障碍英文工作沟通的
- 英语:漏屋-英语学习的真实方法及误区分析
- 拆掉知识的墙
- 5000字详解性能需求
面试题
- Android 2018 最新面试题
- 如何衡量一个 Android 应用开发人员的能力
- 2018 Android 面试总结
- Android 2017-2018 最新面试题(3-5年经验个人面试经历)
- Android 开发工程师面试指南
- 阿里电话面试面试题总结,附答案!
- 阿里巴巴面试题
- 美团面试题
- 豌豆荚三面试题
- 蜻蜓FM面试题
- 新浪微博面试题
- 网易杭研面试题
- 为什么想来我们公司工作?- 面试常见问题解析
- 今日头条大佬十年面试了 2000 人,总结了这 5 点
- 2019 年美团点评高级 Android 开发寒冬跳槽涨薪经验掏心分享
- 如何回答性能优化的问题,才能打动阿里面试官?
- 2019.07 Android 面试真题集锦
- 技术面试中面试官怎么考察候选人?
- 给扔物线 HenCoder Plus 学员的一次分享文字版
- 快手,字节跳动,百度,美团Offer之旅
- 美帝面试二三事
- 面试随想
开源库
- 抖音 Android 性能优化系列:新一代全能型性能分析工具 Rhea
- Raphael 开源地址
- Tailor 开源地址
- xHook
- xDL 链接
- Android-Inline-Hook 链接
- And64InlineHook 链接
- malloc debug 链接
- LeakTracer 链接
- Nanoscope
- Profilo
- Lottie Android 5.0
技术 Weekly
技术团队和个人
微信公众号
本文其他地址
由于博客留言交流不方便,点赞或者交流,可以移步本文的知乎或者掘金页面
知乎 - Android 性能优化必知必会
掘金 - Android 性能优化必知必会
关于我 && 博客
下面是个人的介绍和相关的链接,期望与同行的各位多多交流,三人行,则必有我师!
- 博主个人介绍 :里面有个人的微信和微信群链接。
- 本博客内容导航 :个人博客内容的一个导航。
- 个人整理和搜集的优秀博客文章 - Android 性能优化必知必会 :欢迎大家自荐和推荐 (微信私聊即可)
- Android性能优化知识星球 : 欢迎加入,多谢支持~
一个人可以走的更快 , 一群人可以走的更远