<b>前 言</b>
為什麼寫這本書
一個好的應用,除了要有吸引人的功能和互動之外,在性能上也應該有高的要求,即使應用非常具有特色,或者功能和業務具有唯一性,在産品前期可能吸引了部分使用者,但使用者體驗不好的話,也會給産品帶來很差的口碑,如果有在體驗上更好的競品,使用者也會很快轉移。那麼一個好的應用應該如何定義呢?主要有三方面:
業務/功能
符合邏輯的互動
優秀的性能
衆所周知,android系統作為以移動裝置為主的一款作業系統,硬體配置有一定的限制,雖然配置現在越來越進階,但仍然無法和pc相比,在cpu和記憶體上的使用不合理或者耗費資源多時,就會碰到記憶體不足導緻的穩定性問題、cpu消耗太多導緻的卡頓問題等。例如,我們釋出一款産品後會收到很多的回報,這些回報來自很多管道,有使用者回報,有應用釋出平台的回報通道等。
面對這些問題時,大家想到的都是聯系使用者,然後看日志,特别是有關性能類問題的回報,原因也非常難找,日志大多用處不大,為什麼呢?因為性能問題大部分是非必現的問題,定位時很難複現,而又沒有關鍵的日志,當然就無法找到原因了。這些問題非常影響使用者的體驗和功能的使用,是以解決這些問題是非常重要的。目前市場上講解性能優化的書太少,即使有些書講到,很多也是一筆帶過,沒有深入分析和尋找解決方案,是以有必要用一本書來從多個次元講解在性能上我們面臨了什麼問題,如何解決這些問題,并在實際的項目中來優化我們的應用,以提高使用者體驗。
本書面向的讀者
本書适合所有android應用開發從業人員及在校學生,特别是有一定android應用開發經驗的開發人員,進階開發人員也可以通過本書了解更多的性能調優知識。
本書特色
本書為進階類圖書,對于一些基礎技術和基礎理論知識不會做過多的闡述,特别是入門類的知識點,大家可以從其他書籍擷取相關的知識。書中以性能優化為核心,深入剖析性能優化具體涉及的技術背景與優化方案,同時提供典型案例,幫助讀者更深入地掌握android應用開發技術,了解android的運作機制和原理,掌握android性能優化的思想,讓開發者快速成長,打造高品質的android應用。
本書的主要内容
可以把使用者能體驗到的性能問題主要總結為4個類别:
流暢
穩定
省電
省流量
性能問題的主要原因是什麼,原因有相同的,也有不同的,但歸根結底,不外乎記憶體使用、代碼效率、合适的政策邏輯、代碼品質這一類問題。本書講解内容的目标和方向如下圖所示。
從上圖可以看到,打造一個高品質的應用應該以4個方向為目标:快、穩、省、小。
快:使用時避免出現卡頓,響應速度快,減少使用者的等待時間,滿足使用者預期。
穩:降低crash率和anr率,不要在使用者使用過程中崩潰和無響應。
省:節省流量和耗電,減小使用者使用成本,避免使用時導緻手機發燙。
小:安裝包小可以降低使用者的安裝成本。
這4類問題需要從根源上解決,也就是要解決圖中第二個框裡的問題:卡頓、記憶體使用不合理、代碼品質差、代碼邏輯不優秀、安裝包過大。這些問題也是在開發過程中碰到最多的問題,在實作業務需求的同時,也需要考慮到這些點,多花時間去思考,避免功能完成後再來做優化和修複bug,這個時候帶來的成本會增加。如果是維護之前的代碼,就需要使用一系列工具來發現問題點。
性能優化不是更新一兩個版本可以解決的,是持續性的需求,結合到實際中,在一個新産品/項目開始時,由于人力和上線時間的限制,可以把優先級放低,但有些點是在寫代碼時就要考慮的,這就展現出程式員的技術功底。
本書強調性能調優的核心思想和方向如下:
發現問題→分析問題原因及背景→尋找最優解決方案→解決問題。
本書一共7章,在簡單介紹了android studio的使用指南後,分别從繪制(ui)、記憶體、存儲、穩定性、耗電以及安裝包6個方面進行優化,從系統上深入分析繪制和記憶體的原理,一步步深入了解導緻性能問題的本質原因,同時講述了多種性能優化工具的使用,通過分析典型案例,得到有效的優化方案,進而實作更高品質的應用。書中所講述的内容均基于android 6.0系統。
勘誤和資源下載下傳
由于寫作時間實在有限,在書稿傳遞時仍有些許不安,為此先為此書可能存在的錯誤或者描述不清楚的地方緻以真誠的歉意,如果你發現此書存在瑕疵或者有任何建議,請發郵件到[email protected],我會盡快回複,非常期待大家的回報。
本書代碼的下載下傳位址:https://github.com/lyc7898/androidtech。
緻謝
由于時間的問題,本書寫作時間非常長,非常感謝楊福川編輯對我的鼓勵和寬容,并且分享了非常有用的碎片化寫作方法,使我一直堅持把本書寫完。同時感謝李藝編輯的校對和勘誤,才完成了這本圖文并茂、格式清晰的技術書籍。
感謝我的妻子李萍女士對我的了解和支援,在我幾乎将所有的時間投入工作中時一直給予最大的寬容和鼓勵,使我每天即使再忙再累時仍然可以回到溫馨的家。同時感謝我的父母和嶽父母,感謝他們對我無私的幫助,他們都是偉大的父母。
特别感謝我的爺爺羅志華老先生,在我的學習生涯中給予的無私幫助,在工作和生活上的諄諄教誨。還要感謝劉景瑜老師,在求學階段的鼓勵和教誨,告訴我有很多需要去做的事情。
最後感謝我現在工作的公司,在這裡我得到了最快的成長,學習到非常多的東西,感謝公司上司及所有同僚,在這裡工作,能感受到大家每天都在成長。
<b>目 錄</b>
前 言
第1章 android studio使用指南
第2章 繪制優化
<a href="https://yq.aliyun.com/articles/82572/" target="_blank">2.1 android系統顯示原理 </a>
<a href="https://yq.aliyun.com/articles/82601/" target="_blank">2.7 提升動畫性能</a>
2.8 卡頓監控方案與實作 66
2.9 本章小結
第3章 記憶體優化 80
3.1 android記憶體管理機制 81
3.1.1 java對象生命周期 81
3.1.2 記憶體配置設定 82
3.1.3 記憶體回收機制 84
3.1.4 gc類型 86
3.2 優化記憶體的意義 87
3.3 記憶體分析工具 90
3.3.1 memory monitor 90
3.3.2 heap viewer 91
3.3.3 allocation tracker 94
3.4 避免記憶體洩漏 96
3.4.1 記憶體洩漏定義 97
3.4.2 使用mat查找記憶體洩漏 97
3.4.3 常見記憶體洩漏場景 103
3.4.4 記憶體洩漏監控 106
3.5 優化記憶體空間 109
3.5.1 對象引用 109
3.5.2 減少不必要的記憶體開銷 110
3.5.3 使用最優的資料類型 112
3.5.4 圖檔記憶體優化 117
3.6 圖檔管理子產品設計與實作 120
3.6.1 實作異步加載功能 121
3.6.2 實作三重緩存 130
3.6.3 開源圖檔元件 140
3.7 本章小結 142
第4章 存儲優化 144
4.1 存儲方式 144
4.1.1 sharedpreferences 145
4.1.2 檔案存儲 145
4.1.3 sqlite(需要擴充) 146
4.1.4 contentprovider 147
4.2 序列化 147
4.2.1 serializable與parcelable 148
4.2.2 gson實作json的序列化和反序列化 148
4.2.3 nano proto buffers 149
4.2.4 flatbuffers 149
4.2.5 小結 150
4.3 sharedpreferences優化 150
4.4 資料庫使用及優化 151
4.4.1 資料庫實作 152
4.4.2 資料庫優化 157
4.5 本章小結 161
第5章 穩定性優化 162
5.1 提高代碼品質 162
5.1.1 代碼審查 163
5.1.2 代碼靜态掃描工具 166
5.2 crash監控 168
5.2.1 java層crash監控 168
5.2.2 native層crash監控 171
5.2.3 crash上報機制 173
5.3 anr剖析 173
5.3.1 anr介紹 173
5.3.2 anr分析 174
5.3.3 anr監控 176
5.4 提高背景程序存活率 178
5.4.1 應用程序優先級 178
5.4.2 利用syncadapter提高程序優先級 180
5.5 本章小結 183
第6章 耗電優化 184
6.1 耗電檢測工具 184
6.2 三大子產品省電優化 187
6.2.1 顯示 187
6.2.2 網絡 188
6.2.3 cpu 189
6.3 應用常用優化方案 191
6.3.1 計算優化 191
6.3.2 避免wakelock使用不當 192
6.3.3 使用job scheduler 193
6.4 doze模式 197
6.4.1 doze模式介紹 197
6.4.2 doze模式應用政策 198
6.4.3 測試doze模式應用工作狀态 199
6.5 本章小結 199
第7章 安裝包大小優化 200
7.1 應用裝包的構成 200
7.2 減少安裝包大小的常用方案 203
7.2.1 代碼混淆 203
7.2.2 資源優化 204
7.2.3 其他優化 206
7.3 本章小結 207
結束語 208