Android應(yīng)用優(yōu)化方案。

應(yīng)用穩(wěn)定性優(yōu)化

注:本文是為公司項(xiàng)目出優(yōu)化方案時所寫,有一定針對性局限性,如有問題歡迎討論。

  1. 內(nèi)存優(yōu)化
    內(nèi)存優(yōu)化主要是規(guī)避內(nèi)存泄露和圖片及時回收,以免導(dǎo)致內(nèi)存溢出系統(tǒng)拋出OOM錯誤。監(jiān)測工具:DDMS Heap 分析內(nèi)存使用情況,LeakCanary 監(jiān)聽內(nèi)存泄露。
umeng后臺錯誤排行

具體優(yōu)化的功能點(diǎn):

  • 首頁ViewPager+Fragment組合,修改viewpager策略,只保留當(dāng)前頁的數(shù)據(jù)內(nèi)容,其他頁面不在前臺則銷毀,并把數(shù)據(jù)存到數(shù)據(jù)庫。并且為保證流暢性,在滑動時候初始化,在初始化時候讀數(shù)據(jù)庫數(shù)據(jù),在展示到前臺時拉去網(wǎng)絡(luò)數(shù)據(jù)(過多長時間以后),實(shí)現(xiàn)懶加載。
  • 文章列表,建議縮小縮略圖展示尺寸,增加清晰度。并且每張圖的生命周期跟隨當(dāng)前頁面銷毀而釋放。
  • 包內(nèi)資源圖,盡量進(jìn)行壓縮,UI壓縮,超大圖片盡量能夠用jpg格式替換png(Google是不建議這樣做的,但是這樣顯示效果好占地少,可以借用第三方工具加載)。
  • 使用LeakCanary 來監(jiān)測 內(nèi)存泄露情況,并逐個解決。常見內(nèi)存泄露有Handler 和Timer內(nèi)存泄露(使用軟引用持有Context),非靜態(tài)內(nèi)部類創(chuàng)建靜態(tài)實(shí)例造成的內(nèi)存泄漏等等。


    Android Studio 提示的Handler內(nèi)存泄漏
LeakCanary提示的靜態(tài)實(shí)例持有Context導(dǎo)致的內(nèi)存泄漏

*使用DDMS Heap 分析內(nèi)存使用情況以及使用Monitors查看內(nèi)存主動回收情況。

DDMS Heap內(nèi)存使用分析
Monitors 內(nèi)存分析
  1. 布局優(yōu)化& 界面卡頓監(jiān)測
    開啟安卓手機(jī)GPU呈現(xiàn)模式分析,檢測應(yīng)用流暢度。開啟安卓手機(jī)開發(fā)者選項(xiàng)中 Enable GPU Overdraw ,查看應(yīng)用繪制次數(shù),減少頁面重繪。使用BlockCanary 監(jiān)測UI卡頓現(xiàn)象。

    具體該怎么檢測界面是否卡頓:

    • 肉眼觀察
    • 在安卓手機(jī)開發(fā)者選項(xiàng)中開起幀率顯示,根據(jù)幀率判斷是否界面卡頓。
幀率測試圖
  • 第二開啟安卓手機(jī)開發(fā)者選項(xiàng)中的GPU呈現(xiàn)模式分析,看條形圖分辨應(yīng)用是否卡頓,什么時候卡頓。條形圖怎么看
Gpu呈現(xiàn)模式分析

具體該怎么檢測是否過度繪制:

首頁繪制情況
其他應(yīng)用的繪制情況
  • 查看DDMS中的 dump view hierarchy for ui automator 布局嵌套情況
DDMS 布局嵌套情況
  1. 友盟&BugTags 錯誤修改
    根據(jù)友盟或者bugtags錯誤信息,定位到具體代碼,找出問題及時更改。減少錯誤率。
  2. 單元測試&MVP
    將 Model業(yè)務(wù)邏輯處理 和 View頁面處理分開,利用Android Studio中進(jìn)行單元測試和UI測試。
** 最終目標(biāo):錯誤率降低到千分之一以下 **

安裝包大小優(yōu)化

  1. 資源圖片優(yōu)化&無用資源文件刪減
    使用tinyPng進(jìn)行智能有損壓縮圖片。特大圖片使用jpg代替png。使用Android lint命令查找并刪除沒有用到的資源。
壓縮前后照片清晰度對比
智能有損壓縮前后的大小
如果轉(zhuǎn)換為jpg格式大小
  1. 代碼混淆整理&剔除無用代碼
    刪除無用的代碼,整理混淆語法,對字節(jié)碼進(jìn)行縮減體積、優(yōu)化。
  2. 皮膚、表情包在線化(插件化)
    表情包和皮膚資源可以做成擴(kuò)展包形式一來可以云更新,還可以減少安裝包大小。
  3. 依賴庫整理&去除無用語言資源
    整理依賴庫,功能相近的庫擇小擇優(yōu)選取,去除重復(fù)庫。通過配置resConfigs 只選擇英語和中文語言包。
** 最終目標(biāo):整包大小減少百分之40左右 **

網(wǎng)絡(luò)速度優(yōu)化

  1. 合并接口&優(yōu)化接口刪除冗余字段
    相近內(nèi)容合并到一個接口返回,避免頻繁的網(wǎng)絡(luò)請求,刪除接口中的冗余字段,減少數(shù)據(jù)量。
  2. 新聞詳情緩存&考慮使用H5+原生形式實(shí)現(xiàn)正文
    使用HTML5瀏覽正文詳情(支持圖文混排且更流暢:目前的詳情會跳布局,這樣會讓人感覺起來卡頓,因?yàn)檎刮粓D并不能一定等于圖片大?。褂迷丶f(xié)助完成評論等其他交互。
  3. 預(yù)下載重要數(shù)據(jù)
    在wifi情況下后臺靜默下載,必要資源,比如應(yīng)用全局展示的廣告等等。
  4. 使用https
    使用https防止流量劫持、抓包及爬蟲。對通信內(nèi)容進(jìn)行加密。
** 最終目標(biāo):讓每一步網(wǎng)絡(luò)操作都能夠可接受時間內(nèi)得到響應(yīng) **

應(yīng)用省流優(yōu)化

  1. GIF預(yù)覽圖
    流量情況需要點(diǎn)擊Gif圖片才會動
  2. webP圖片格式
    服務(wù)端存儲用七牛,Android客戶端用Fresco(支持webP動圖)。
** 最終目標(biāo):盡可能的節(jié)省流量 **

多版本快速開發(fā)

  1. MVP架構(gòu)
    MVP分離了view和model層使之解耦,方便進(jìn)行單元測試,方便邏輯移植。
  2. 提出公共module
    同質(zhì)化功能點(diǎn)放到公共module中,方便引用到其他項(xiàng)目中。
  3. 插件化開發(fā)
    根據(jù)功能點(diǎn)將應(yīng)用模塊化,例如直播,錄制等等。
** 最終目標(biāo):功能快速移植,降低代碼耦合度**

下期分享預(yù)告:

仿微信朋友圈(snapchat)圖片滑動退出手勢交互


下期分享預(yù)告

截圖來自: 橘子娛樂探索版(Android)

技術(shù)博客:Wells'Note

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容