安卓性能優(yōu)化報告

本期迭代的任務(wù)是改善過度繪制和優(yōu)化布局嵌套。

  • 首先檢查項目中是否存在過渡繪制的頁面,并減少過渡繪制。

  • 再查看當(dāng)前App的布局嵌套,學(xué)習(xí)使用merge標(biāo)簽降低布局的層級

什么是過度繪制?

簡單來講,過度繪制是指像素點重復(fù)繪制了多次。我們可以打開手機或者模擬器的開發(fā)者選項,來查看當(dāng)前應(yīng)用程序是否存在過度繪制。這時我們可以看到屏幕出現(xiàn)多種顏色。

不同顏色代表含義(無色:無過度繪制,即該像素點只繪制1次;藍(lán)色:1x過度繪制,即該像素點繪制了2次;綠色:2x過度繪制;淺紅:3x過度繪制;紅色:4x過度繪制)

一般項目的驗收標(biāo)準(zhǔn)是:不允許出現(xiàn)黑色像素;不允許存在4x過度繪制;不允許存在面積超過屏幕1/4區(qū)域的3x過度繪制(淡紅色區(qū)域)

布局層級這么復(fù)雜,我們要如何找到多余的布局并將其優(yōu)化掉呢?下面來介紹一個小工具(作用于靜態(tài)的Activity,筆者在嵌套fragment的Activity中嘗試執(zhí)行失敗)

Scalpel

Scalpel是由JakeWharton大神開源的一個Android項目,用于分析解剖Android程序的界面布局并展現(xiàn)出3D效果。Scalpel使用非常簡單,只要將ScalpelFrameLayout作為根布局即可。

第一步:在Gradle中引入Scalpel

api 'com.jakewharton.scalpel:scalpel:1.1.2'

第二步:在需要觀察3D布局的activity布局文件中,將ScalpelFrameLayout作為根布局

<com.jakewharton.scalpel.ScalpelFrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
</com.jakewharton.scalpel.ScalpelFrameLayout>

第三步:在Activity的onCreate里,添加如下代碼

        ScalpelFrameLayout scalpelFrameLayout = new ScalpelFrameLayout(this);
        View view = LayoutInflater.from(this).inflate(R.layout.sample_activity, null);
        scalpelFrameLayout.addView(view);
        setContentView(scalpelFrameLayout);
        //以下可選
    //是否顯示3D布局
    scalpelFrameLayout.setLayerInteractionEnabled(true);
    //是否顯示view的布局
    scalpelFrameLayout.setDrawViews(true);
    //是否顯示view的ID
    scalpelFrameLayout.setDrawIds(true);
    //設(shè)置布局邊框的顏色
    scalpelFrameLayout.setChromeColor(0xff00ff00);
    //設(shè)置布局邊框的陰影顏色
    scalpelFrameLayout.setChromeShadowColor(0xff0000ff);
下面以簡單的登陸頁面為例,看看工具的使用效果:

如圖所示,我們現(xiàn)在是有6層布局,有的看上去明顯是不需要繪制的,那么我們來分析一下,怎么去掉多余的繪制呢。
首先,自己代碼中找到兩層多余的繪制



再者,系統(tǒng)自帶一層繪制,我們將那層繪制去掉,可以讓全部的頁面減少一層繪制。

getWindow().setBackgroundDrawable(null);

除了去除多余的背景色之后,我們來看看效果。

如何查看布局嵌套

AS自帶的開發(fā)工具Layout Inspector可以查看每個頁面的Component Tree。

(具體用法網(wǎng)上有很多優(yōu)秀的文檔,我不贅述。)
通過這個工具,我們可以看到系統(tǒng)的層級,以及我們自己代碼中,是否存在多余層級。


系統(tǒng)層級

項目代碼層級

對于嵌套復(fù)雜的布局可以使用 include、merge進行優(yōu)化

merge的作用

merge標(biāo)簽是作為include標(biāo)簽的一種輔助擴展來使用的,它的主要作用是為了防止在引用布局文件時產(chǎn)生多余的布局嵌套。大家都知道,Android去解析和展示一個布局是需要消耗時間的,布局嵌套的越多,那么解析起來就越耗時,性能也就越差,因此我們在編寫布局文件時應(yīng)該讓嵌套的層數(shù)越少越好。

merge的用法

merge標(biāo)簽只能作為根布局存在,通過include標(biāo)簽放到相應(yīng)的布局位置,這樣merge就能讓頁面直接繼承父布局,減少一層布局嵌套。




去除了LinearLayout


優(yōu)化前

優(yōu)化后

(優(yōu)化后的頁面開了開發(fā)者模式里過度繪制檢查的代碼)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容