做了這么久性能相關的工作,也接觸了不少模塊,說實話要做好性能這一塊,真心不容易.為什么這么說? 是因為需要接觸的知識實在是太多了, 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
功耗
進程管理
- 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 解讀
- 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 源碼閱讀 - 架構解析
硬件相關
編程語言
- 探索 Java 隱藏的開銷
- Kotlin 中文文檔
- Java多態在android中的實現
- Cancellation and Exceptions in Coroutines
- 徹底理解引用在 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
技術之外的思考
- 我到底有多么努力
- 工作以來的一些感悟
- 如何自學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 查看