<dd id="fl4gs"></dd>
<button id="fl4gs"><acronym id="fl4gs"></acronym></button>

    <dd id="fl4gs"><track id="fl4gs"></track></dd>
    <em id="fl4gs"><tr id="fl4gs"></tr></em>
    <span id="fl4gs"><track id="fl4gs"></track></span>
    1. <tbody id="fl4gs"></tbody>
      <th id="fl4gs"><track id="fl4gs"></track></th>
    2. |
      |
      51CTO旗下網站
      |
      |
      移動端

      Android 中的“后臺無效動畫“行為分析

      下面我們就以兩個實例,從技術的角度來看一下事件發生時候的情況和原因,希望看到這篇文章的開發者,檢查一下自己的應用是否有這個問題,有則改之,無則恭喜

      作者:Gracker來源:Android Performance|2019-10-24 12:13

      當一個 Android App 退到后臺之后,只要他沒有被殺死,那么他做什么事情大家都不要奇怪,因為這就是 Android。但是當用戶知道一個你一個 App 退到后臺之后還在持續做無效的動畫,而這個動畫完全是無意義的,而且用戶還不知道他在做動畫,消耗用戶那可憐的電量的時候,輕則被多任務殺掉,禁止后臺運行,重則直接卸載。

      一般的開發者很難發現這個問題,但是如果你經常使用 Systrace ,多開幾十個應用然后退回到桌面,左右滑動抓取 Systrace ,就可以很容易發現,總有那么幾個后臺的應用,還在頻繁地做無效的動畫。

      這里說的后臺做動畫,指的是由于某種原因,應用在退到后臺之后,用戶看不到任何這個 App 界面的時候,他仍然在后臺不斷地更新,耗費 CPU。引起這個問題的原因可能有好多個,畢竟 往 Choreographer 扔 CALLBACK_ANIMATION 的地方太多了,而且每個應用可能都不一樣,但最終還是需要各個應用去做修復

      下面我們就以兩個實例,從技術的角度來看一下事件發生時候的情況和原因,希望看到這篇文章的開發者,檢查一下自己的應用是否有這個問題,有則改之,無則恭喜

      實例 - 網易新聞

      我們在使用網易新聞后,將網易新聞退到后臺,然后左右滑動桌面,抓 Systrace 來看:

      網易新聞到后臺之后還在持續做 Animation 的回調(紅框內),每一幀都還是在 doFrame 操作

      Android 中的“后臺無效動畫“行為分析

      放大每一個 doFrame 來看,Choreographer 中的 input 和 traversal 都沒有觸發,只有 animation 的回調一直在執行

      Android 中的“后臺無效動畫“行為分析

      我們把這份 Trace 上的 cpu 部分全選,然后下面按照 Wall Duration 排序,可以發現網易新聞后臺動畫執行時間最長。應用已經在后臺且不可見的時候,還在這么頻繁地工作,占用 CPU 資源,消耗電量,實在是不應該

      Android 中的“后臺無效動畫“行為分析

      抓對應的 MethodTrace 來看,就是在做動畫,沒有進行關閉 ,動畫依舊在每一幀進行 onAnimationUpdate 的回調 ,可以看到這里是因為使用了 Airbnb 的 Lottie 庫導致的,動畫沒有關閉,所以還是一直在做觸發

      Android 中的“后臺無效動畫“行為分析

      實例 - QQ音樂

      啟動 QQ 音樂,然后回到桌面, 左右滑動桌面并抓取 Systrace 和 MethodTrace ,可以看到跟上面的網易新聞的表現一致

      Android 中的“后臺無效動畫“行為分析

      抓取了 QQ 音樂的后臺動畫時候的 MethodTrace 發現,也是由于退到后臺之后,沒有暫停動畫導致的,也是 Airbnb 的 Lottie 的鍋, 而且 QQ 音樂有三個動畫沒有停止,比網易新聞還要嚴重一些

      Android 中的“后臺無效動畫“行為分析

      放大后可以看到

      Android 中的“后臺無效動畫“行為分析

      當然也不是每一個都是 Airbnb 的 Lottie 動畫庫引起的,比如下面這個,就是普通的動畫沒有結束

      Android 中的“后臺無效動畫“行為分析

      根本原因

      根本原因是應用在不可見之后,沒有將動畫暫停,導致應用切換到后臺之后,依然在刷新動畫的回調,但此時由于是不可見的,不會觸發 Input Callback 和 draw Callback ,所以也不會有任何的繪制操作,也就是說這個 Animation 的刷新完全是沒有意義的(當然也有可能是業務需求?)

      上面兩個例子里面,網易新聞和 QQ 音樂都是因為使用了 Lottie 來實現動畫,但是沒有正確的關閉導致的。

      開發建議

      Lottie 庫的 issue 列表里面有人提到了這個情況:

      提出問題:

      • I recently did some benchmarking on an app which uses lottie to do some animations (autoplay and looping). I noticed that there is quite some CPU usage when the app is in the background and tried to investigate.
      • It seems to me looping animations do not pause/stop when the containing LottieAnimationView is off screen, and/or the Activity is paused.
      • I believe this is due to the cleanup code being only in onDetachedFromWindow() which is not necessarily being called once the Activity goes into a paused state and most definitely not, when the view is simply not visible (GONE, INVISIBLE ) anymore.

      解決方法:

      • Overriding LottieAnimationView and doing the following solves the visibility issue for me and Lottie is paused when not visible.
      1. @Override 
      2. protected void onVisibilityChanged(@NonNull View changedView, int visibility) { 
      3.     super.onVisibilityChanged(changedView, visibility); 
      4.     if (visibility == VISIBLE && wasAnimatingWhenVisibilityChanged) { 
      5.         resumeAnimation(); 
      6.     } else { 
      7.         if (isAnimating()) { 
      8.             wasAnimatingWhenVisibilityChanged = true
      9.             pauseAnimation(); 
      10.         } else { 
      11.             wasAnimatingWhenVisibilityChanged = false
      12.         } 
      13.     } 

      總之就是 : 當 App 不可見的時候,停止所有的動畫:pauseAnimation!!!

      【編輯推薦】

      1. 愛奇藝開源 Qigsaw,基于 Android App Bundle 的動態化框架
      【責任編輯:未麗燕 TEL:(010)68476606】

      點贊 0
      分享:
      大家都在看
      猜你喜歡

      訂閱專欄+更多

      CentOS 8 全新學習術

      CentOS 8 全新學習術

      CentOS 8 正式發布
      共16章 | UbuntuServer

      256人訂閱學習

      用Python玩轉excel

      用Python玩轉excel

      讓重復操作傻瓜化
      共3章 | DE8UG

      222人訂閱學習

      AI入門級算法

      AI入門級算法

      算法常識
      共22章 | 周蘿卜123

      191人訂閱學習

      讀 書 +更多

      用戶體驗要素

      本書是AJAX之父的經典之作。本書用簡潔的語言系統化地詮釋了設計、技術和商業融合是最重要的發展趨勢。全書共8章,包括關于用戶體驗以及為...

      訂閱51CTO郵刊

      點擊這里查看樣刊

      訂閱51CTO郵刊

      51CTO服務號

      51CTO官微

      日韩大片,babesxxx,亚洲在线电影,性直播视频