1.繪制優(yōu)化
卡頓造成原因:
- 界面繪制:①頁面復雜,層級較深,造成measure,layout,draw都有可能耗時較長,導致vsync信號到達時,數(shù)據(jù)無法準備好,無法刷新界面
- 數(shù)據(jù)處理:①UI線程處理大量數(shù)據(jù),導致主線程不能及時進行界面繪制;②內(nèi)存緊張,導致頻繁GC,會阻塞主線程
優(yōu)化方式:
<1>定性分析
①在安卓的開發(fā)者模式中,打開GPU調(diào)試,當條形圖的高度高過綠色的橫線時,代表繪制耗時過長。
②在安卓的開發(fā)者模式中,打開過度繪制,當一片區(qū)域的顏色是紅色或者粉紅色時,代表UI嵌套過深,可能有無用的UI層級存在。
③使用過程中,用戶感覺到卡頓
<2>定量分析和優(yōu)化
①使用systrace,查找卡頓點,可在代碼中添加調(diào)試點,逐步排除,重點關(guān)注Alerts提示 和 Frames顏色為紅色的部分;可以使用android device monitor進行大范圍追蹤,也可在代碼中使用系統(tǒng)提供的api定量追蹤。
代碼中使用api如下:
android device monitor使用如下:
生成的html文件如下,下圖展示了可以優(yōu)化的點,比如繪制耗時等:
②然后使用traceview查找具體耗時方法,針對優(yōu)化:
在代碼中api如下,可以生成.trace文件:
當然,也可以使用android device monitor,如下:
下面這示例可以看出:測試的testWriter()方法中,md5()方法消耗了大量時間,就可以找到優(yōu)化點,從而進行針對性優(yōu)化
③在android device monitor中,使用hierarchy view查看UI布局,優(yōu)化嵌套層級,示例如下:
④使用android lint進行代碼檢查,可以配置各種規(guī)則,可以對代碼進行全方位的靜態(tài)檢查。
⑤自定義主線程的printer,檢測每次消息處理時間,進行卡頓定位
可優(yōu)化點
①性能framelayout>linearlayout>relativelayout,優(yōu)先使用framelayout
②減少布局層級
③使用merge減少層級,使用viewstub繪制較少使用的布局
④已知寬高,不使用wrap_content屬性
⑤界面只刷新必要的區(qū)域
⑥r(nóng)ecycleview,listview只刷新對應(yīng)的item
⑦硬件加速(api兼容問題)
⑧啟動速度優(yōu)化
2.內(nèi)存優(yōu)化
潛在問題
①頻繁GC,導致線程阻塞
②內(nèi)存泄漏,內(nèi)存一致增長
優(yōu)化點
①內(nèi)存抖動,一般現(xiàn)象為鋸齒狀的內(nèi)存狀態(tài)圖
②內(nèi)存泄漏
優(yōu)化工具
①借助leakcanary定位問題,找到內(nèi)存泄漏的頁面
②在androidstudio的profiler - memeory中,通過查看當前存在問題頁面的內(nèi)存快照,精準定位,查找泄漏點,進行問題修復。
常見內(nèi)存泄漏
①靜態(tài)類持有activity context
②handler內(nèi)存泄漏
③第三方框架未釋放
④實例變量持有fragment,導致fragment無法釋放
⑤cursor,file未關(guān)閉
常用優(yōu)化方式
①借助弱引用解決 handler內(nèi)存泄漏;;實例變量持有fragment,導致fragment無法釋放;靜態(tài)類持有activity context
②靜態(tài)類持有context,提供釋放方法,將context置null
③正確關(guān)閉文件流,cursor
④圖片優(yōu)化,圖片大小,圖片編碼,采樣率,三級緩存
⑤lru緩存優(yōu)化
⑥使用最優(yōu)數(shù)據(jù)結(jié)構(gòu),靠經(jīng)驗
3.存儲優(yōu)化
常用方式及特點
①sharedpreference:適合存儲簡單配置信息,開關(guān)等
②file:適合存儲大數(shù)據(jù),音視頻或者網(wǎng)絡(luò)內(nèi)容
③sqlite:適合存儲復雜的數(shù)據(jù)類型
④contentprovider:進程之間的數(shù)據(jù)交換
優(yōu)化點
①sharedpreference:使用apply異步存儲
②sqlite:使用sqlitestatement;使用事務(wù)一次插入多條數(shù)據(jù);使用索引提高查詢效率,異步存儲;分頁
③file:文件讀寫并發(fā)
④contentprovider:權(quán)限管理
4.穩(wěn)定性優(yōu)化
存在問題
①crash:java層,native層
②anr:觸摸事件超時5s,廣播超時10s,service超時20s
檢測工具
①java層crash,實現(xiàn)Thread.UncaughtException,捕捉異常
②anr發(fā)生時,系統(tǒng)會生成trace文件,低版本手機會有trace.txt文件,高版本手機在adb中,執(zhí)行adb bugreport,可導出anr記錄文件
保活方法,歸根結(jié)底是提高進程優(yōu)先級
①長連接保持心跳,保持進程活躍
②注冊系統(tǒng)廣播,相應(yīng)系統(tǒng)消息
③使用syncadapter提供的賬號同步機制提高進程優(yōu)先級,demo地址https://github.com/dongdaniqng/SyncAdapter
④雙進程,一像素,不推薦,流氓程序才這么干
5.耗電優(yōu)化
耗電問題
①屏幕常亮
②頻繁調(diào)用傳感器,藍牙,相機,定位,視頻,音頻等
③代碼問題,頻繁刷新,cpu使用率高,比如頻繁刷新廣告,刷新后臺任務(wù)等
優(yōu)化工具
①androidstudio profiler
②battery-historian
優(yōu)化點
①及時關(guān)閉不再使用的傳感器
②代碼合理優(yōu)化,使用workmanager或者jobscheduler優(yōu)化任務(wù)
6.安裝包體積優(yōu)化
常用方案
①代碼優(yōu)化,使用混淆
②資源優(yōu)化,使用android lint移除無用資源(存在誤刪,需要注意);配置shrinkResources;移除無用的lib,so,無用的assets目錄文件
③圖片優(yōu)化,盡量使用一套圖片文件,多個dimen尺寸文件;或者使用webp,svg圖片
④插件化,將不頻繁使用的模塊存放到服務(wù)器,然后下載
⑤第三方框架擇優(yōu)使用
7.網(wǎng)絡(luò)優(yōu)化
①Dns:解析使用httpdns;直接使用ip
②Http :版本升級,比如從1.x升級到2.x,3.x,減少三次握手時間
③Https:升級ssl/tls加密協(xié)議版本,減少https的tls握手事件
④Cdn:使用cdn,緩存一些資源,加快訪問速度
8.安全優(yōu)化
本地安全
①敏感信息加密存儲,使用keystore等,或者先加密再存儲
②apk下載安裝完整性校驗,防劫持校驗
③運行環(huán)境檢查,如root,xposed環(huán)境
④安全鍵盤
⑤防止截屏
⑥代碼安全檢查,四大組件的權(quán)限等
⑦登錄等隱私界面防劫持
網(wǎng)絡(luò)安全
①使用https
②重要信息加密傳輸