本文的思維導(dǎo)圖(這里使用的是MindNode)
目錄
內(nèi)存優(yōu)化
盡量避免使用枚舉
相比基本數(shù)據(jù)類型, 枚舉占用的內(nèi)存更多, 因此, Android官方也建議避免使用枚舉
Enums often require more than twice as much memory as static constants. You should strictly avoid using enums on Android.
使用SparseArray,ArrayMap代替HashMap
SparseArray | ArrayMap | |
---|---|---|
場景 | 替代Key為基本數(shù)據(jù)類型的HashMap | 替代Key為Object數(shù)據(jù)類型的HashMap |
目的 | 減少內(nèi)存占用 | 減少內(nèi)存占用 |
優(yōu)點 | 節(jié)約內(nèi)存 / No auto-boxing | 節(jié)約內(nèi)存 |
缺點: | 大數(shù)據(jù)量時效率低 / 只在android可用 | 大數(shù)據(jù)量時效率低 / 只在android可用 |
更多參考Android Memories by Romain Guy / SparseArray vs HashMap / android use ArrayMap SparseArray instead of HashMap
使用Parcelable序列化
Serializable | Parcelable | |
---|---|---|
特點 | 實現(xiàn)簡單但效率較低 | 效率更高但實現(xiàn)比較麻煩(推薦插件Android Parcelable Code Generator) |
原理 | 依賴反射, 同時產(chǎn)生大量臨時對象會依賴GC | 過程完全由自己實現(xiàn)和控制 |
范圍 | Java項目中都可用 | 只在android可用 |
在使用Intent傳遞數(shù)據(jù)時, 盡量使用Parcelable做序列化, 尤其當(dāng)數(shù)據(jù)是Object類型時
詳細(xì)參考PARCELABLE VS. JAVA SERIALIZATION IN ANDROID APP DEVELOPMENT
Bitmap
優(yōu)先加入高分辨率資源 因為低分辨率圖片適配高分辨率設(shè)備時圖片會放大
對大圖使用inSampleSize采樣 生成縮略圖應(yīng)用到目標(biāo)大小的的ImageView
對于超清大圖使用BitmapRegionDecoder, 按區(qū)域加載并顯示圖片
詳細(xì)參考Android 開發(fā)繞不過的坑:你的 Bitmap 究竟占多大內(nèi)存 / Android 高清加載巨圖方案 拒絕壓縮圖片
合理使用多進程
例如將Music Player分成兩個獨立的進程: UI + Play Service, 這樣UI進程的資源就可以在Music Player后臺長時間播放時釋放
雖然這樣的場景下, 可以降低內(nèi)存占用, 但是通常情況下新的進程是會帶來更多的內(nèi)存開銷的, 所以多進程的內(nèi)存優(yōu)化方式需要謹(jǐn)慎使用
性能優(yōu)化
Layout
使用include對布局進行復(fù)用
減少復(fù)雜布局, 同時盡量避免使用Alpha通道
在子線程加載資源, 并對資源進行復(fù)用(RecyclerView中ViewHolder)
Lazy Load資源和View
WebView緩存
if (NetStatusUtil.isConnected(getApplicationContext())) {
webSettings.setCacheMode(WebSettings.LOAD_DEFAULT); //根據(jù)cache-control決定是否從網(wǎng)絡(luò)上取數(shù)據(jù)。
} else {
webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); //沒網(wǎng)罩息,則從本地獲取嗤详,即離線加載
}
詳細(xì)參考Android開發(fā):最全面、最易懂的Webview詳解
使用Parcelable序列化
同上, 詳細(xì)參考: 內(nèi)存優(yōu)化 - 使用Parcelable序列化
Bitmap
- 使用圖片緩存: LruCache & DiskLruCache = Least Recently Used + LinkedHashMap + (Runtime Memory / 8)
詳細(xì)參考LruCache
合理使用多線程
理論上, 除了UI操作以外的其他任何操作都是可以放在子線程中的
Android多線程詳細(xì)參考android學(xué)習(xí) 之 Service
但是, 我們也并不鼓勵"濫用"多線程, 因為
多線程有額外的系統(tǒng)開銷
多線程往往伴有同步問題
多線程還需要考慮通信, 如果使用不當(dāng), 反而會引起內(nèi)存問題(詳細(xì)參考android開發(fā) 之 內(nèi)存泄漏)
更多參考Performance Tips
打包優(yōu)化
圖片格式
常見圖片格式的文件大小: png > jpg > webp, 但實際開發(fā)中主要還是使用png, 這是因為
png無損 而jpg有損
png有alpha通道 而jpg沒有
png有硬解碼加速 而jpg待考證
iOS會對png進行壓縮和優(yōu)化 而對jpg沒有任何優(yōu)化
在啟動頁等較大背景圖片時 可以考慮使用jpg
webp支持alpha通道 壓縮比例高 顯示效果不錯 但是鑒于沒有廣泛應(yīng)用 所以酌情考慮使用
圖片其他
對于簡單圖形可以使用代碼實現(xiàn)
使用9-Patch+圖片拉伸來適應(yīng)不同屏幕的需求
多主題使用一套圖片 + blending (詳細(xì)參考iOS中使用blend改變圖片顏色)
總之: 在開發(fā)過程中, 盡量少盡量小地引入圖片
ProGuard
壓縮: 移除無效的類瓷炮、屬性葱色、方法等
優(yōu)化: 優(yōu)化字節(jié)碼, 并刪除未使用的結(jié)構(gòu)
混淆: 將類名、屬性名娘香、方法名混淆為難以讀懂的字母
在線化
酌情使用在線圖片資源
插件化實現(xiàn)在線功能: React Native / NativeScript
精簡
清理不用的圖片資源, 語言資源等
使用優(yōu)化過體積更小的第三方庫
小結(jié)
由于經(jīng)驗和眼界有限, 本文肯定會有很多遺漏和錯誤, 歡迎大家留言和補充
附錄
更多文章, 請支持我的個人博客