Android性能優(yōu)化(一)統(tǒng)計(jì)啟動(dòng)時(shí)間

在優(yōu)化之前首先得有一個(gè)量化的過程余赢,不然很難知道我們的優(yōu)化有沒有結(jié)果东羹,不能總是靠感覺岔冀,就像看大師炒菜个榕,大師告訴你放適量的鹽一樣蛋疼篡石。

工具選擇

知道了啟動(dòng)和頁面渲染的時(shí)間我們還得去找具體的位置,要是順便能定位位置就好了 西采,抱著這種心態(tài)凰萨,一開始我就瞄準(zhǔn)的第三方的開源庫,大概找了下有騰訊的# Matrix和360的# ArgusAPM械馆。但看到GitHub上的上次更新時(shí)間胖眷,瞬間有種情況不是很樂觀的感覺。

image.png

尤其是360這個(gè)霹崎,去年開源珊搀,上次更新就是9月前,跟不維護(hù)差不多了尾菇,再去issue里看看境析,情況真的不容樂觀:
image.png

瞬間感覺自己攤上大事了囚枪,我還只是個(gè)孩紙啊,行吧劳淆,我們再去看看騰訊大哥的Matrix吧
image.png

大哥就是大哥链沼,那還等啥,擼吧沛鸵。
一頓操作猛如虎括勺,一看BUG有2個(gè)痛點(diǎn)
1.沒辦法像Matrix的demo那樣統(tǒng)計(jì)啟動(dòng)之類的時(shí)間,因?yàn)楣こ逃玫氖茿ndroidX
image.png

2.每次修改類都需要clean一次工程谒臼,這個(gè)很耗時(shí)間啊

matrix找不到.png

看了下issue朝刊,發(fā)現(xiàn)不少反饋這樣的問題,都沒有得到官方正式的回復(fù)蜈缤,哎拾氓,好難,沒辦法只能自己搞了底哥。

自己寫簡陋版時(shí)間統(tǒng)計(jì)

自己搞雖然沒有Matrix這樣可以很快的定位到問題咙鞍,但也是有自己的優(yōu)勢的,比如編譯快趾徽。加入Matrix的Trace模塊可以明顯感受到編譯慢了很多要1m18s续滋,而正常調(diào)試編譯的時(shí)候只需要38s左右,這是因?yàn)榫幾g期間trace模塊會(huì)會(huì)自動(dòng)在每個(gè)方法是開始和結(jié)束加入時(shí)間統(tǒng)計(jì)的標(biāo)識(shí)孵奶,這樣方便我們定位問題疲酌。
主要統(tǒng)計(jì)的就是application創(chuàng)建時(shí)間、啟動(dòng)頁(Splash)時(shí)間了袁、第一個(gè)Activity渲染完成的時(shí)間朗恳。
最近負(fù)責(zé)項(xiàng)目的啟動(dòng)順序
application初始化一些庫=》Splash(一個(gè))=》MainActivity(FirstActivity)
當(dāng)前Activity加載完成的標(biāo)志是參考Matrix里的代碼,發(fā)現(xiàn)在Activity的onWindowFocusChange()里面有特別的插樁代碼载绿,源碼里的注釋也證實(shí)了觀點(diǎn)粥诫,之所以不支持AndroidX,估計(jì)就是忘了在對(duì)應(yīng)的地方插代碼了

image.png

統(tǒng)計(jì)Activity頁面加載時(shí)間

因?yàn)橛蠦aseActivity崭庸,所以從這著手怀浆,在onCreate時(shí)記錄,在第一次獲得焦點(diǎn)時(shí)結(jié)束怕享,統(tǒng)計(jì)時(shí)間差执赡,大概就是Activity的頁面加載時(shí)間了

 @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        timeOnCreate = System.currentTimeMillis();
    }

@Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        if (isFirstFocus && hasFocus){
            TraceHelper.get().onWindowFocusChange(tag,System.currentTimeMillis()-timeOnCreate);
            isFirstFocus=false;
        }
    }

統(tǒng)計(jì)一次冷啟動(dòng)時(shí)間

application創(chuàng)建時(shí)間=splashOnCreate()-start()
Splash渲染時(shí)間=onWindowFocusChange()-onCreate()
Splash停留的時(shí)間=mainActivityOnCreate()-splashOnCreate()
MainActivity渲染時(shí)間=onWindowFocusChange()-onCreate()
冷啟動(dòng)時(shí)間=MainActivityonWindowFocusChange()-applicationOnCreate()

自己項(xiàng)目的統(tǒng)計(jì)效果:測試機(jī)器Redmi5(驍龍450+3gRAM),缺少了Splash的頁面渲染時(shí)間熬粗,而我在oncreat方法里面就設(shè)置了跳轉(zhuǎn)搀玖,推測是這樣沒有獲得焦點(diǎn),MainActivity有3秒驻呐,有很大優(yōu)化空間了


image.png

統(tǒng)計(jì)方法時(shí)間

通過上面的過程灌诅,我們得到了一個(gè)總體的時(shí)間芳来,我們想細(xì)化定位的話還得知道這個(gè)過程里方法執(zhí)行的時(shí)間,由于方法數(shù)比較多猜拾,而且方法統(tǒng)計(jì)在整個(gè)項(xiàng)目都有用到的地方即舌,肯定就不能再像上面那樣自己寫了,由于時(shí)間緊我還沒有找到一個(gè)合適的第三方庫挎袜,只能等Matrix修復(fù)或者你們有更好的也可以在評(píng)論里分享一下

最后附上本次的工具類:

/**
 * create by z on 19/12/27
 *
 * @author z
 */
public class TraceHelper {
    private boolean isEnable = true;
    private static TraceHelper instance;
    private long startTime;
    private long splashOnCreateTime;
    private long mainActivityTime;
    private long completeTime;
    private Map<String,Long> activityRenderTimes=new HashMap<>();
    private TraceHelper() {
    }

    public static TraceHelper get() {
        if (instance == null) {
            synchronized (TraceHelper.class) {
                if (instance == null) {
                    instance = new TraceHelper();
                }
            }
        }
        return instance;
    }

    private long getTime(){
        return System.currentTimeMillis();
    }

    public void start() {
        startTime = getTime();
    }


    public void splashOnCreate() {
        splashOnCreateTime = getTime();
    }


    public void mainActivity(){
        mainActivityTime = getTime();
    }


    @SuppressLint("DefaultLocale")
    public void onWindowFocusChange(String tag, long timeMist) {

        Log4jUtils.d(this,String.format("onWindowFocusChange--tag[%s]-----time[%d]",tag,timeMist));
        activityRenderTimes.put(tag,timeMist);
        //冷啟動(dòng)時(shí)間
        if (tag.contains("MainActivity")){
            complete();
        }
    }

     private void complete(){
        if (isEnable){
            completeTime=getTime();
            show();
        }
    }

    public void show(){
        Log4jUtils.d(this,"------------------------------------------------");
        Log4jUtils.d(this,"--applicationCreateTime: "+(splashOnCreateTime-startTime));
        Log4jUtils.d(this,"--SplashStayTime: "+(mainActivityTime -splashOnCreateTime));
        Log4jUtils.d(this,"--completeTime: "+(completeTime-startTime));
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            activityRenderTimes.forEach((s, aLong) -> {
                Log4jUtils.d(this,"--"+s+": "+aLong);
            });
        }
        Log4jUtils.d(this,"------------------------------------------------");
    }

}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末顽聂,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子盯仪,更是在濱河造成了極大的恐慌紊搪,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,084評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件全景,死亡現(xiàn)場離奇詭異耀石,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)爸黄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門滞伟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人炕贵,你說我怎么就攤上這事梆奈。” “怎么了称开?”我有些...
    開封第一講書人閱讀 163,450評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵亩钟,是天一觀的道長。 經(jīng)常有香客問我鳖轰,道長径荔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,322評(píng)論 1 293
  • 正文 為了忘掉前任脆霎,我火速辦了婚禮,結(jié)果婚禮上狈惫,老公的妹妹穿的比我還像新娘睛蛛。我一直安慰自己,他們只是感情好胧谈,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評(píng)論 6 390
  • 文/花漫 我一把揭開白布忆肾。 她就那樣靜靜地躺著,像睡著了一般菱肖。 火紅的嫁衣襯著肌膚如雪客冈。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,274評(píng)論 1 300
  • 那天稳强,我揣著相機(jī)與錄音场仲,去河邊找鬼和悦。 笑死,一個(gè)胖子當(dāng)著我的面吹牛渠缕,可吹牛的內(nèi)容都是我干的鸽素。 我是一名探鬼主播,決...
    沈念sama閱讀 40,126評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼亦鳞,長吁一口氣:“原來是場噩夢啊……” “哼馍忽!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起燕差,我...
    開封第一講書人閱讀 38,980評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤遭笋,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后徒探,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瓦呼,經(jīng)...
    沈念sama閱讀 45,414評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評(píng)論 3 334
  • 正文 我和宋清朗相戀三年刹帕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了吵血。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,773評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡偷溺,死狀恐怖蹋辅,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情挫掏,我是刑警寧澤侦另,帶...
    沈念sama閱讀 35,470評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站尉共,受9級(jí)特大地震影響褒傅,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜袄友,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評(píng)論 3 327
  • 文/蒙蒙 一殿托、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧剧蚣,春花似錦支竹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至目尖,卻和暖如春馒吴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評(píng)論 1 269
  • 我被黑心中介騙來泰國打工饮戳, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留豪治,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,865評(píng)論 2 370
  • 正文 我出身青樓莹捡,卻偏偏與公主長得像鬼吵,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子篮赢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1.什么是Activity?問的不太多启泣,說點(diǎn)有深度的 四大組件之一,一般的,一個(gè)用戶交互界面對(duì)應(yīng)一個(gè)activit...
    JoonyLee閱讀 5,731評(píng)論 2 51
  • 引言 1. Android性能優(yōu)化篇之內(nèi)存優(yōu)化--內(nèi)存泄漏 2.Android性能優(yōu)化篇之內(nèi)存優(yōu)化--內(nèi)存優(yōu)化分析...
    愛聽音樂的小石頭閱讀 4,774評(píng)論 0 6
  • 請(qǐng)保持淡定涣脚,分析代碼,記琢让!:性能很重要遣蚀。 啟動(dòng)時(shí)間優(yōu)化 毫無疑問,應(yīng)用的啟動(dòng)速度越快越好纱耻。 本文可以幫助你優(yōu)化應(yīng)用...
    Mupceet閱讀 11,396評(píng)論 5 19
  • 你屹立橋東 我屹立橋西 奔騰不息江河 將你我分割 我們一同經(jīng)歷風(fēng)雨 承載芭梯、見證歷史 我們曾歷經(jīng) 江水無情的拍打、沖...
    青明山閱讀 384評(píng)論 4 16
  • 此刻回到宿舍已經(jīng)三點(diǎn)多了弄喘,睡意漸起玖喘,還是忍不住拿起了手機(jī)寫和月姐黃兄的點(diǎn)點(diǎn)滴滴。 我和月姐他們相識(shí)蘑志,源于去年我擺...
    黃筱容閱讀 331評(píng)論 0 0