
ANR產生的原因
只有當應用程式的UI執行緒回應超時才會引起ANR,超時產生原因一般有兩種,
1,當前的事件沒有機會得到處理,例如UI執行緒正在回應另一個事件,當前事件由于某種原因被阻塞了,
2,當前的事件正在處理,但是由于耗時太長沒能及時完成, 根據ANR產生的原因不同,超時事件也不盡相同,
從本質上將,產生ANR的情況有三種,大致可以對應到android中四大組件中的三個(Activity/View,BroadcastReceiver和Service),
KeyDispatchTimeout 1,最常見的一種型別,原因就是View的點擊事件或者觸摸事件在特定的時間(5s)內無法得到回應,
BroadcastTimeout 2,原因是BroadcastReceiver的onReceive()函式運行在主執行緒中,在特定的時間(10s)內無法完成處理,
ServiceTimeout 3,比較少出現的一種型別,原因是Service的各個生命周期函式在特定時間(20s)內無法完成處理,
ANR的定位和分析
當發生ANR時,可以通過結合Logcat日志和生成的位于手機內部存盤的/data/anr/traces.tex檔案進行分析和定位,
卡頓原理

Android系統每隔16ms發出VSYNC信號,觸發對UI進行渲染,如果每次渲染都成功,就能夠達到流暢的畫面所需要的60fps,(為了能夠實作60fps,這意味著程式的大多數操作都必須在16ms內完成) 如果你的某個操作花費時間是超過了16ms,系統在得到VSYNC信號的時候就無法進行正常渲染,這樣就發生了丟幀現象,那么用戶在當前幀看到的仍然是上一幀畫面,
卡頓檢測 blockcanary

原理簡介:
1、卡頓發生在主執行緒,主執行緒的所有事件處理都是在主執行緒的looper中處理的
2、looper的loop方法中,在呼叫msg.target.dispatchMessage(msg);處理訊息前后會使用printer列印message資訊,
3、設定自定義的printer,第一次呼叫時記錄開始時間T1,第二次呼叫時記錄結束時間T2,對應訊息處理前后的時間,如果兩次時間差超過自定義的阻塞時間,則調出T1到T2的堆疊資訊進行處理顯示,

導致卡頓的原因及優化
(1)界面布局較為復雜造成界面過度繪制(使用除錯GPU過度繪制來查看界面)(背景)
進行布局優化
(2)影片太多或者影片執行程序較為復雜
簡化影片;使用屬性影片
(3)view繪制程序較為耗時(gpu呈現模式分析)
簡化邏輯
(4)gc占用程式計算時間(Memory Monitor里面查看到短時間發生了多次記憶體的漲跌,這意味著很有可能發生了記憶體抖動,Allocation Tracker來查看在短時間內,同一個堆疊中不斷進出的相同物件)
物件重復利用
(5)記憶體泄漏(記憶體泄漏指的是那些程式不再使用的物件無法被GC識別,這樣就導致這個物件一直留在記憶體當中,占用了寶貴的記憶體空間,顯然,這還使得每級Generation的記憶體區域可用空間變小,GC就會更容易被觸發,間接導致卡頓問題)(leakcanary檢測)
(6)串列優化,使用區域重繪
Android程式性能優化
- 第一章.ANR問題決議
- 第二章.crash監控方案
- 第三章.啟動速度與執行效率優化專案實戰
- 第四章.記憶體優化
- 第五章.耗電優化
- 第六章.網路傳輸與資料存盤優化
- 第七章.apk大小優化
- 第八章.實戰專案

Android網路傳輸與資料存盤優化
- 1.網路優化的三個要點
- 2.網路優化的兩個維度
- 3.三個線下測驗工具
- 4、周期長
- 5.線上監控的三個要點
- 6.三個線上監控方案
- 7.三個流量優化方案
- 8.網路請求質量優化

資料領取
以上完整pdf資料全部免費分享,有需要的朋友可以點擊這里直達免費獲取方式,
最后
當程式員容易,當一個優秀的程式員是需要不斷學習的,從初級程式員到高級程式員,從初級架構師到資深架構師,或者走向管理,從技術經理到技術總監,每個階段都需要掌握不同的能力,早早確定自己的職業方向,才能在作業和能力提升中甩開同齡人,
無論你現在水平怎么樣一定要 持續學習 沒有雞湯,別人看起來的毫不費力,其實費了很大力,這四個字就是我的建議!!!!!!!!!
我希望每一個努力生活的IT工程師,都會得到自己想要的,因為我們很辛苦,我們應得的,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/294822.html
標籤:其他

