導航:首頁 > 操作系統 > androidapp卡頓原因

androidapp卡頓原因

發布時間:2025-03-14 19:54:30

A. androidUI卡頓原理分析及Vsync信號機制

一、UI卡頓定義 

1、用戶角度:app操作界面刷新緩慢,響應不及時;界面滑動不夠流暢; 

2、系統角度:屏幕刷新幀率不穩定,掉幀嚴重,無法保證每秒60幀,導致屏幕畫面撕裂; 

二、UI卡頓常見原因分析以及處理方案 

1、過度繪制: 

原因:界面布局設計不合理或者過於復雜導致系統無法在16毫秒內完成渲染,view過度繪制導致CPU或者GPU負載過重,View頻繁觸發measure、layout操作,導致measure、layout累計耗時嚴重以及整個View錯誤的頻繁重新渲染; 

方案:優化界面布局,使界面布局視圖扁平化,去除不必要的背景顏色,減少透明色的使用; 

方案依據原理:盡量減少View在系統中measure、layout、draw的累計時間; 

2、UI線程的復雜運算 

原因:UI主線程運算耗時 

方案:減少UI線程中數據運算,使用子線程處理耗時任務 

3、頻繁GC 

原因:(1)、內存抖動;(2)、瞬間產生大量對象,消耗內存; 

方案:盡量避免在循環邏輯或者onDraw方法中頻繁創建新對象和使用局部變數; 

三、android Vsync機制 

1、什麼是Vsync ? 

Vsync 是Vertical Synchronization(垂直同步)的縮寫,是一種在PC上很早就廣泛使用的技術,可以簡單的把它認為是一種定時中斷。而在Android 4.1(JB)中已經開始引入VSync機制,用來同步渲染,讓AppUI和SurfaceFlinger可以按硬體產生的VSync節奏進行工作。 

2、Android屏幕刷新過程 

Android系統每隔16ms發出VSYNC信號,觸發對UI進行渲染,屏幕的刷新過程是每一行從左到右(行刷新,水平刷新,Horizontal Scanning),從上到下(屏幕刷新,垂直刷新,Vertical Scanning)。當整個屏幕刷新完畢,即一個垂直刷新周期完成,會有短暫的空白期,此時發出 VSync 信號。所以,VSync 中的 V 指的是垂直刷新中的垂直-Vertical。 

3、沒有使用Vsync的情況 

可見vsync信號沒有提醒CPU/GPU工作的情況下,在第一個16ms之內,一切正常。然而在第二個16ms之內,幾乎是在時間段的最後CPU才計算出了數據,交給了Graphics Driver,導致GPU也是在第二段的末尾時間才進行了繪制,整個動作延後到了第三段內。從而影響了下一個畫面的繪制。這時會出現Jank(閃爍,可以理解為卡頓或者停頓)。這時候CPU和GPU可能被其他操作佔用了,這就是卡頓出現的原因; 

4、使用Vsync同步 

CPU/GPU接收vsync信號,Vsync每16ms一次,那麼在每次發出Vsync命令時,CPU都會進行刷新的操作。也就是在每個16ms的第一時間,CPU就會響應Vsync的命令,來進行數據刷新的動作。CPU和GPU的刷新時間,和Display的FPS是一致的。因為只有到發出Vsync命令的時候,CPU和GPU才會進行刷新或顯示的動作。CPU/GPU接收vsync信號提前准備下一幀要顯示的內容,所以能夠及時准備好每一幀的數據,保證畫面的流暢; 

5、多級緩沖 

Android除了使用Vsync機制,還使用了多級緩沖的策略來優化屏幕顯示,如雙重緩沖(A + B),當Display buffer A 數據時,CPU/GPU就已經在buffer B 中處理下一幀要顯示的數據了。 

可是,當系統資源緊張性能降低時,導致GPU在處理某幀數據時太耗時,在Vsync信號到來時,buffer B的數據還沒准備好,此時不得不顯示buffer A的數據,這樣導致後面CPU/GPU沒有新的buffer准備數據,空白時間無事可做,後面Jank頻出

因此採用三級緩沖來解決系統對性能不穩定導致的卡頓

當出現上面所述情況後,新增一個buffer C 可以減少CPU和GPU在Vsync同步間的空白間隙,此時CPU/GPU能夠利用buffer C 繼續工作,後面buffer A 和 buffer B 依次處理下一幀數據。這樣僅是產生了一個Jank,可以忽略不計,以後的流程就順暢了。 

註:在多數正常情況下還是使用二級緩沖機制,三級緩沖只是在需要的時候才使用;

B. Android流暢度評估及卡頓優化

Google定義:界面呈現是指從應用生成幀並將其顯示在屏幕上的動作。要確保用戶能夠流暢地與應用互動,應用呈現每幀的時間不應超過16ms,以達到每秒60幀的呈現速度(為什麼是60fps?)。
如果應用存在界面呈現緩慢的問題,系統會不得不跳過一些幀,這會導致用戶感覺應用不流暢,我們將這種情況稱為卡頓。

來源於: Google Android的為什麼是60fps?

16ms意味著1000/60hz,相當於60fps。這是因為人眼與大腦之間的協作無法感知超過60fps的畫面更新。12fps大概類似手動快速翻動書籍的幀率, 這明顯是可以感知到不夠順滑的。24fps使得人眼感知的是連續線性的運動,這其實是歸功於運動模糊的效果。 24fps是電影膠圈通常使用的幀率,因為這個幀率已經足夠支撐大部分電影畫面需要表達的內容,同時能夠最大的減少費用支出。 但是低於30fps是 無法順暢表現絢麗的畫面內容的,此時就需要用到60fps來達到想要的效果,超過60fps就沒有必要了。如果我們的應用沒有在16ms內完成屏幕刷新的全部邏輯操作,就會發生卡頓。

首先要了解Android顯示1幀圖像,所經歷的完整過程。

如圖所示,屏幕顯示1幀圖像需要經歷5個步驟:

常見的丟幀情況: 渲染期間可能出現的情況,渲染大於16ms和小於16ms的情況:

上圖中應該繪制 4 幀數據 , 但是實際上只繪制了 3 幀 , 實際幀率少了一幀

判斷APP是否出現卡頓,我們從通用應用和游戲兩個緯度的代表公司標准來看,即Google的Android vitals性能指標和地球第一游戲大廠騰訊的PrefDog性能指標。

以Google Vitals的卡頓描述為准,即呈現速度緩慢和幀凍結兩個維度判斷:

PerfDog Jank計算方法:

幀率FPS高並不能反映流暢或不卡頓。比如:FPS為50幀,前200ms渲染一幀,後800ms渲染49幀,雖然幀率50,但依然覺得非常卡頓。同時幀率FPS低,並不代表卡頓,比如無卡頓時均勻FPS為15幀。所以平均幀率FPS與卡頓無任何直接關系)

當了解卡頓的標准以及渲染原理之後,可以得出結論,只有丟幀情況才能准確判斷是否卡頓。

mpsys 是一種在設備上運行並轉儲需要關注的系統服務狀態信息的 Android 工具。通過向 mpsys 傳遞 gfxinfo 命令,可以提供 logcat 格式的輸出,其中包含與錄制階段發生的動畫幀相關的性能信息。

藉助 Android 6.0(API 級別 23),該命令可將在整個進程生命周期中收集的幀數據的聚合分析輸出到 logcat。例如:

這些總體統計信息可以得到期間的FPS、Jank比例、各類渲染異常數量統計。

命令 adb shell mpsys gfxinfo <PACKAGE_NAME> framestats 可提供最近120個幀中,渲染各階段帶有納秒時間戳的幀時間信息。

關鍵參數說明:

通過gfxinfo輸出的幀信息,通過定時reset和列印幀信息,可以得到FPS(幀數/列印間隔時間)、丟幀比例((janky_frames / total_frames_rendered)*100 %)、是否有幀凍結(幀耗時>700ms)。
根據第2部分的通用應用卡頓標准,可以通過丟幀比例和幀凍結數量,准確判斷當前場景是否卡頓。並且通過定時截圖,還可以根據截圖定位卡頓的具體場景。

如上圖所示,利用gfxinfo開發的檢查卡頓的小工具,圖中參數和卡頓說明如下:

根據上面對gfxinfo的幀信息解析,可以准確計算出每一幀的耗時。從而可以開發出滿足騰訊PerfDog中關於普通卡頓和嚴重卡頓的判斷。

依賴定時截圖,即可准確定位卡頓場景。如下圖所示(此處以PerfDog截圖示例):

通過第3部分的卡頓評估方法,我們可以定位到卡頓場景,但是如何定位到具體卡頓原因呢。

首先了解卡頓問題定位工具,然後再了解常見的卡頓原因,即可通過復現卡頓場景的同時,用工具去定位具體卡頓問題。

重點就是,充分利用gfxinfo輸出的幀信息,對卡頓問題進行分類。

了解了高效定位卡頓的方法和卡頓問題定位工具,再熟悉一下常見的卡頓原因,可以更熟練的定位和優化卡頓。

SurfaceFlinger 負責 Surface 的合成,一旦 SurfaceFlinger 主線程調用超時,就會產生掉幀。
SurfaceFlinger 主線程耗時會也會導致 hwc service 和 crtc 不能及時完成,也會阻塞應用的 binder 調用,如 dequeueBuffer、queueBuffer 等。

後台進程活動太多,會導致系統非常繁忙,cpu io memory 等資源都會被佔用,這時候很容易出現卡頓問題,這也是系統這邊經常會碰到的問題。
mpsys cpuinfo 可以查看一段時間內 cpu 的使用情況:

當線程為 Runnable 狀態的時候,調度器如果遲遲不能對齊進行調度,那麼就會產生長時間的 Runnable 線程狀態,導致錯過 Vsync 而產生流暢性問題。

system_server 的 AMS 鎖和 WMS 鎖 , 在系統異常的情況下 , 會變得非常嚴重 , 如下圖所示 , 許多系統的關鍵任務都被阻塞 , 等待鎖的釋放 , 這時候如果有 App 發來的 Binder 請求帶鎖 , 那麼也會進入等待狀態 , 這時候 App 就會產生性能問題 ; 如果此時做 Window 動畫 , 那麼 system_server 的這些鎖也會導致窗口動畫卡頓。

Android P 修改了 Layer 的計算方法 , 把這部分放到了 SurfaceFlinger 主線程去執行, 如果後台 Layer 過多,就會導致 SurfaceFlinger 在執行 rebuildLayerStacks 的時候耗時 , 導致 SurfaceFlinger 主線程執行時間過長。

主線程執行 Input Animation Measure Layout Draw decodeBitmap 等操作超時都會導致卡頓 。

Activity resume 的時候, 與 AMS 通信要持有 AMS 鎖, 這時候如果碰到後台比較繁忙的時候, 等鎖操作就會比較耗時, 導致部分場景因為這個卡頓, 比如多任務手勢操作。

應用裡面涉及到 WebView 的時候, 如果頁面比較復雜, WebView 的性能就會比較差, 從而造成卡頓。

如果屏幕幀率和系統的 fps 不相符 , 那麼有可能會導致畫面不是那麼順暢. 比如使用 90 Hz 的屏幕搭配 60 fps 的動畫。

由上面的分析可知對象分配、垃圾回收(GC)、線程調度以及Binder調用 是Android系統中常見的卡頓原因,因此卡頓優化主要以下幾種方法,更多的要結合具體的應用來進行:

在計算機和通信領域,幀是一個包括「幀同步串列」的數字數據傳輸單元或數字數據包。
在視頻領域,電影、電視、數字視頻等可視為隨時間連續變換的許多張畫面,其中幀是指每一張畫面。

C. 安卓手機卡頓怎麼辦

安卓手機卡頓怎麼辦1

1、首先在應用市場中下載安裝360手機助手。

2、打開360手機助手切換到管理標簽。

3、在頁面頂端點擊立即體檢,檢查手機的情況。

4、點擊深度清理按鈕。

5、對手機進行一鍵清理加速。

6、完成後可以體驗到手機使用的速度變快了。

安卓手機卡頓怎麼辦2

1、安卓系統代碼開源

眾所周知安卓系統最大優勢是開源,系統源碼可以被公眾使用並且對其修改和發行,允許任何移動終端廠商和開發者加入到Android聯盟中來。但是開源同樣也存在著弊端,那就是應用質量參差不齊以及標准雜亂無章。

開源大大降低了安卓系統開發者的門檻,而一個單純功能的簡單應用由於代碼質量粗糙,很可能要佔用200MB RAM。如果手機運存只有2GB,卡頓會變得特別明顯。

我們操作安卓手機的時候,有時候點開一個瀏覽器軟體,後台會自動喚醒有利益相關的`幾款APP,即使安卓原生系統也無能為力。畢竟這一機制後面,是彼此應用的利益鏈條,而對於國內應用市場,谷歌更是鞭長莫及。大量的程序運行勢必拖慢了手機的運行速度,手機操作起來就無法順暢。

2、系統沉澱垃圾

微信作為如今最常用通訊軟體,安卓版安裝包大小是30MB;不過半年以後再去看這個應用,它的內存佔用可以達到500MB甚至更多。這種情況在視頻軟體里隨處可見,尤其一些社交和音樂/視頻應用。積年累月當應用把手機存儲快要堆滿了,系統運行速度肯定越來越慢。

3、系統版本無法升級

根據報告顯示,在去年末Android5.0及其以上(Android 5.1和Android 6.0)的市場份額僅佔全部安卓陣營的26%。換句話說,三分之二的用戶還停留在Android 4.X時代,為什麼強調這個分水嶺,要從Android5.0說起。Android 5.0系統即徹底從Dalvik轉換到ART,在系統轉換以前:應用在運行的過程中,虛擬機Dalvik通過一個叫JIT(Just-in-time)的解釋器動態的進行編譯並執行,這種虛擬機模式會大大拖慢系統的運行效率。作為對比,ART模式則是在用戶安裝應用時就進行預編譯操作,將原本在程序運行中時的編譯動作提前到應用安裝時。在省去解釋代碼這一過程之後,應用的運行效率會更高。

完成這種更新延遲的根本在於很多廠商在手機售出之後很少進行系統升級推送,同時大量消費者又沒有更新手機系統的習慣。很多手機系統卡在Android4.4,而越來越多的新應用卻是為了適配更高系統打造的,所以手機卡頓不可避免。

卡頓了用戶需要怎麼做

怎樣解決手機越用越卡?第一需要有一台能保障系統定期更新的手機;在這一基礎上定期對手機內存清理,把碎片和部分緩存信息清理干凈。更進一步操作還會利用到系統自帶防火牆或者第三方自啟動管理軟體,根據使用習慣屏蔽一部分自啟動應用。

當然通讀全文,不難發覺隨著日積月累,手機卡頓現階段在所難免。而用戶自身,甚至是手機廠商能做的,是把這個卡頓的時間點不斷推遲。我們只能寄希望於那些技術開發者,早日研究出不會卡頓的手機。

D. 手機卡頓如何解決

如果您使用的是華為手機,手機升級系統後短時間內出現卡頓,屬於正常現象,如果並非剛升級完出現,請按照以下方案排查:
溫馨提醒:升級系統後卡頓原因:由於系統升級後剛開始使用時,系統會對設備中的應用程序進行優化,此時設備負載較高,使用時可能會出現卡頓情況。建議升級完成後將手機滅屏充電2小時以上,然後重啟以保證設備內已安裝的應用優化完成。
1.清理存儲空間和運行內存
手機運行內存和存儲空間不足時會導致應用卡頓,建議您進入手機管家進行清理:
(1)進入手機管家點擊清理加速,待掃描完畢後,點擊清理項後的立即清理,根據提示刪除多餘的文件,並卸載不常用的應用,保持存儲空間充足(建議預留20%以上)。
(2)進入手機管家點擊一鍵優化/立即優化,優化完畢後,手機管家會顯示優化結果以及設置建議。根據提示,完成相應的設置。

2.重啟手機
請您重啟手機後嘗試。重啟能夠結束正在運行的應用程序,緩解卡頓現象。
3.檢查手機是否發熱或者充電時使用
手機特有的過熱保護功能會適當降低系統性能。建議您盡量避免充電時使用手機,適當降低屏幕亮度,關閉不使用或異常耗電應用與功能,如「藍牙」,NFC等。
4.檢查存儲卡
(1)可能是存儲卡硬體異常,是否曾提示「存儲卡異常」,若是,建議您盡快更換存儲卡。(2)可能是存儲卡存儲的文件過多(建議預留10%以上空間),導致讀寫速度慢,建議您清理存儲卡空間,或備份重要數據(QQ、微信等第三方應用需單獨備份)後格式化存儲卡。
(3)若手機的默認存儲位置為存儲卡,建議您將默認存儲位置更改為「內部存儲」後嘗試。
5.關閉省電模式、保持電量充足
如果您開啟了省電模式,建議您關閉(設置 > 電池 > 省電模式和 超級省電),並保持電量充足(20%以上)。省電模式和低電量情況下,手機會降低性能以節省電量。
6.卸載第三方手機管家類軟體
(1)如果您的設備裝有第三方管理類型的軟體,請卸載此類應用後嘗試。通常此類軟體與設備自帶的手機管家存在沖突,會導致運行卡頓。
(2)檢查是否為使用三方應用時卡頓,建議您向三方應用反饋或致電華為客服。
7.檢查手機是否正在下載、復制、傳輸等操作
如果手機正在執行上傳下載(文件、圖片、視頻、應用等)、復制(文件管理拷貝數據等)、傳輸(手機克隆、Huawei Share等)等操作時感覺到卡頓,建議您等待任務結束或停止此操作。
提示:您可以下拉狀態欄查看上傳、下載、傳輸文件的進度。
8. 升級系統版本
建議您備份重要數據(QQ、微信等第三方應用需單獨備份)及時進行設備系統更新,並將應用升級到最新版本。新版本會對系統性能進行優化提升。更新方法:進入設置,搜索進入軟體更新,點擊檢查更新。
9. 恢復出廠設置
請您備份重要數據(QQ、微信等第三方應用需單獨備份),將手機恢復出廠設置後重試。
如果問題仍然存在,請您備份好數據後(QQ、微信等第三方應用需單獨備份)攜帶購機憑證前往華為客戶服務中心進行檢測處理。
溫馨提醒:您可以選擇夜間充電(或滅屏充電40min以上),可以一定程度上整理手機內存碎片,緩解卡頓現象。

相關鏈接如下:預約服務寄修服務華為客戶服務中心維修備件價格查詢

閱讀全文

與androidapp卡頓原因相關的資料

熱點內容
抖音小籠包解壓神器 瀏覽:558
手機下載的源碼在哪裡儲存 瀏覽:846
pdf看三維 瀏覽:406
九宮演算法干什麼用的 瀏覽:907
phpjava性能比較 瀏覽:886
2016會計中級pdf 瀏覽:181
農村信用社app怎麼刪除明細 瀏覽:817
學而思電腦怎麼下載app 瀏覽:107
php防止mysql注入 瀏覽:233
磁力計校正演算法 瀏覽:491
解壓縮後變小了 瀏覽:957
智友文件夾 瀏覽:81
android操作系統開發的操作系統 瀏覽:478
原神手機怎麼改b站伺服器 瀏覽:296
樁基箍筋加密區高度規范 瀏覽:91
手機櫻花動漫app怎麼用 瀏覽:382
php科學計數法轉換 瀏覽:642
sip認證演算法 瀏覽:785
androidapp卡頓原因 瀏覽:906
25編程器電路 瀏覽:849