Android常見問題
- 內存泄漏: 不使用的內存空間(對象)一直被引用著沒有得到釋放。
- 內存抖動: 短時間內大量創建對象又在短時間內頻繁觸發GC導致內存波動很大,android虛擬機執行GC操作時需要耗費CPU性能頻繁GC會到來嚴重的性能問題。內存抖動是因為大量的對象被創建又在短時間內馬上被釋放。瞬間產生大量的對象會嚴重占用Young Generation的內存區域,當達到閥值,剩余空間不夠的時候,也會觸發GC。即使每次分配的對象占用了很少的內存,但是他們疊加在一起會增加Heap的壓力,從而觸發更多其他類型的GC。這個操作有可能會影響到幀率,并使得用戶感知到性能問題。
- 內存溢出:內存泄漏到一定程度超出系統給進程分配的內存大小就會造成內存溢出程序奔潰,或者加載一個或多個大型文件(圖片)到內存中也會導致內存溢出。
- ANR: 應用無響應,代碼效率過低或者在主線程執行耗時操作。
內存監控工具
- adb shell dumpsys meminfo:內存泄露檢測和改善。
- Memory Monitor:查看整個app所占用的內存,以及發生GC的時刻,短時間內發生大量的GC操作是一個危險的信號。
- Allocation Tracker:使用此工具來追蹤內存的分配。
- Heap Viewer:實時查看App分配的內存大小和空閑內存大小,發現Memory Leaks
- Heap Snapshot:獲取Java堆內存詳細信息,可以分析出內存泄漏的問題
- Memory Analyzer Tool:MAT一款詳細分析Java堆內存的工具,該工具非常強大,為了使用該工具,我們需要hprof文件,該文件我們在之前的Heap Snapshot工具的時候,我們就生成了該文件。但是該文件不能直接被MAT使用,需要進行一步轉化,可以使用hprof-conv命令來轉化,但是Android Studio可以直接轉化。
性能監控工具
- Profile GPU Rendering:連續多幀每一幀的刷新時間都超過16ms就應該被視為性能問題。
- Profile GPU Rendering : M Update:Profile GPU Rendering的升級版。
- TraceView:從代碼層面分析性能問題,針對每個方法來分析,比如當我們發現我們的應用出現卡頓的時候,我們可以來分析出現卡頓時在方法的調用上有沒有很耗時的操作,關注以下兩個問題:+ 調用次數不多,但是每一次執行都很耗時+ 方法耗時不大,但是調用次數太多
- Systrace:計算容器的性能并發現性能的瓶頸。
- GPU Monitor:分析GPU的性能,實時查看繪制每一幀所花費的時間,與Profile GPU Rendering差不多。
- Strict Mode:UI線程被阻塞超過5秒,就會出現ANR,這太糟糕了。防止程序出現ANR是很重要的事情,那么如何找出程序里面潛在的坑,預防ANR呢?很多大部分情況下執行很快的方法,但是他們有可能存在巨大的隱患,這些隱患的爆發就很容易導致ANR。Android提供了一個叫做Strict Mode的工具,我們可以通過手機設置里面的開發者選項,打開Strict Mode選項,如果程序存在潛在的隱患,屏幕就會閃現紅色。我們也可以通過StrictMode API在代碼層面做細化的跟蹤,可以設置StrictMode監聽那些潛在問題,出現問題時如何提醒開發者,可以對屏幕閃紅色,也可以輸出錯誤日志。
- LINT:Lint是Android提供的一個靜態掃描應用源碼并找出其中的潛在問題的一個強大的工具。例如,如果我們在onDraw方法里面執行了new對象的操作,Lint就會提示我們這里有性能問題,并提出對應的建議方案。Lint已經集成到Android Studio中了,我們可以手動去觸發這個工具,點擊工具欄的Analysis -> Inspect Code,觸發之后,Lint會開始工作,并把結果輸出到底部的工具欄,我們可以逐個查看原因并根據指示做相應的優化修改。Lint的功能非常強大,他能夠掃描各種問題。當然我們可以通過Android Studio設置找到Lint,對Lint做一些定制化掃描的設置,可以選擇忽略掉那些不想Lint去掃描的選項,我們還可以針對部分掃描內容修改它的提示優先級。建議把與內存有關的選項中的嚴重程度標記為紅色的Error,對于Layout的性能問題標記為黃色Warning。
- Monkey:Monkey是可以運行在模擬器里或實際設備中的程序。它向系統發送偽隨機的用戶事件流(如按鍵輸入、觸摸屏輸入、手勢輸入等),實現對正在開發的應用程序進行壓力測試。
- 其他工具:其他性能檢測工具
網絡監控工具
- Network monitor:實時監控上傳和接收的網速