android開發(fā) 之 優(yōu)化篇

本文的思維導(dǎo)圖(這里使用的是MindNode)

android-interview-questions-06-advanced.png

目錄

內(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.

更多參考Managing Your App's Memory

使用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)化

ios-png.png

更多參考PNG compression and iOS apps

  • 在啟動頁等較大背景圖片時 可以考慮使用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)

  • 混淆: 將類名、屬性名娘香、方法名混淆為難以讀懂的字母

更多參考Android Proguard(混淆) / ProGuard詳解

在線化

精簡

  • 清理不用的圖片資源, 語言資源等

  • 使用優(yōu)化過體積更小的第三方庫

更多參考Android APP終極瘦身指南

小結(jié)

由于經(jīng)驗和眼界有限, 本文肯定會有很多遺漏和錯誤, 歡迎大家留言和補充

附錄

更多文章, 請支持我的個人博客

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末苍狰,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子烘绽,更是在濱河造成了極大的恐慌淋昭,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件安接,死亡現(xiàn)場離奇詭異翔忽,居然都是意外死亡,警方通過查閱死者的電腦和手機盏檐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門歇式,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人胡野,你說我怎么就攤上這事材失。” “怎么了硫豆?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵龙巨,是天一觀的道長。 經(jīng)常有香客問我够庙,道長恭应,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任耘眨,我火速辦了婚禮昼榛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘剔难。我一直安慰自己胆屿,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布偶宫。 她就那樣靜靜地躺著非迹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪纯趋。 梳的紋絲不亂的頭發(fā)上憎兽,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天冷离,我揣著相機與錄音,去河邊找鬼纯命。 笑死西剥,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的亿汞。 我是一名探鬼主播瞭空,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼疗我!你這毒婦竟也來了咆畏?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤吴裤,失蹤者是張志新(化名)和其女友劉穎旧找,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嚼摩,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡钦讳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了枕面。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡缚去,死狀恐怖潮秘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情易结,我是刑警寧澤枕荞,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站搞动,受9級特大地震影響躏精,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鹦肿,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一矗烛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧箩溃,春花似錦瞭吃、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至霹陡,卻和暖如春和蚪,著一層夾襖步出監(jiān)牢的瞬間止状,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工攒霹, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留导俘,地道東北人。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓剔蹋,卻偏偏與公主長得像旅薄,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子泣崩,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容