【Android 性能优化】应用启动优化 ( 启动优化项目 | 界面启动时间 | 启动优化项目 | 方法追踪 MethodTracing )
文章目錄
- 一、 界面啟動(dòng)時(shí)間
- 二、 啟動(dòng)優(yōu)化項(xiàng)目
- 三、 方法追蹤
一、 界面啟動(dòng)時(shí)間
在 【Android 性能優(yōu)化】應(yīng)用啟動(dòng)優(yōu)化 ( 啟動(dòng)白屏問題 | 應(yīng)用啟動(dòng)時(shí)間測量 | 冷啟動(dòng) | 熱啟動(dòng) | 應(yīng)用啟動(dòng)時(shí)間計(jì)算源碼分析 ) __ 四、 APP 啟動(dòng)時(shí)間計(jì)算 博客中簡要介紹了相關(guān)的啟動(dòng)時(shí)間 ;
下面是執(zhí)行 adb shell am start -W 包名/完整 Activity 類名 命令 , 打印出的完整日志 ;
C:\Users\octop>adb shell am start -W kim.hsl.rtmp/kim.hsl.rtmp.MainActivity Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=kim.hsl.rtmp/.MainActivity } Status: ok LaunchState: COLD Activity: kim.hsl.rtmp/.MainActivity TotalTime: 431 WaitTime: 433 CompleteC:\Users\octop>2 . 相關(guān)的時(shí)間概念 :
① 應(yīng)用啟動(dòng)開始時(shí)間 : startTime , 這是用戶在 Launcher 應(yīng)用中點(diǎn)擊應(yīng)用圖標(biāo)的時(shí)間 , 之后開啟進(jìn)行應(yīng)用啟動(dòng) , 該時(shí)間就是 Am.java 中記錄的 startTime 開始時(shí)間 ;
IActivityManager.WaitResult result = null; int res;// 記錄開始時(shí)間 final long startTime = SystemClock.uptimeMillis(); if (mWaitOption) {// 啟動(dòng) Activity result = mAm.startActivityAndWait(null, null, intent, mimeType,null, null, 0, mStartFlags, profilerInfo, null, mUserId);res = result.result; } // 記錄結(jié)束時(shí)間 final long endTime = SystemClock.uptimeMillis();
上述源碼在 \frameworks\base\services\core\java\com\android\server\am\ActivityRecord.java
② 應(yīng)用開始加載時(shí)間 : mLaunchStartTime , 這是 Application 開始加載的時(shí)間 ; 對應(yīng) ActivityRecord.java 中的 mLaunchStartTime 時(shí)間 ;
③ UI 繪制時(shí)間 : displayStartTime , 這是 Activity 開始繪制 UI 布局的時(shí)間 ; 對應(yīng) ActivityRecord.java 中的 displayStartTime 時(shí)間 ;
④ 啟動(dòng)結(jié)束時(shí)間 : endTime , 這是加載結(jié)束 , 界面顯示完成的時(shí)間 ; 對應(yīng) ActivityRecord.java 中的 reportLaunchTimeLocked 方法的 curTime 參數(shù)時(shí)間 ;
private void reportLaunchTimeLocked(final long curTime) {final ActivityStack stack = task.stack;// 這里計(jì)算了 APP 啟動(dòng)時(shí)間final long thisTime = curTime - displayStartTime;final long totalTime = stack.mLaunchStartTime != 0? (curTime - stack.mLaunchStartTime) : thisTime;// 省略 1 萬行代碼displayStartTime = 0;stack.mLaunchStartTime = 0;}
上述源碼在 \frameworks\base\services\core\java\com\android\server\am\ActivityRecord.java
3 . 時(shí)間之間的關(guān)系 :
① 應(yīng)用加載時(shí)間 : TotalTime , 從 Application 開始加載 , 到界面顯示完畢的時(shí)間 ; TotalTime = endTime - mLaunchStartTime ;
② 界面顯示時(shí)間 : ThisTime , 從界面開始顯示 , 到界面顯示完畢的時(shí)間 ; ThisTime = endTime - displayStartTime ;
③ 用戶等待時(shí)間 : WaitTime , 從用戶點(diǎn)擊應(yīng)用圖標(biāo)開始 , 到應(yīng)用顯示完畢的時(shí)間 ; WaitTime = endTime - startTime ; 用戶等待的時(shí)間是 startTime 到 endTime 的所有時(shí)間 ;
4 . TotalTime 與 ThisTime 顯示時(shí)間關(guān)系 :
① 如果啟動(dòng)應(yīng)用的第 111 個(gè)界面 , 即 Launch Activity 界面 , 那么 TotalTime = ThisTime ;
② 如果啟動(dòng)連續(xù)多個(gè) Activity 界面 , 那么 TotalTime > ThisTime , 每個(gè) Activity 都會有一個(gè)顯示時(shí)間 , 所有的 Activity 的顯示時(shí)間 ThisTime 相加等于 TotalTime 的時(shí)長 ;
二、 啟動(dòng)優(yōu)化項(xiàng)目
在 Launcher 應(yīng)用點(diǎn)擊圖標(biāo)后 , 啟動(dòng)應(yīng)用 , 系統(tǒng)為應(yīng)用開啟進(jìn)程 , 分配內(nèi)存的步驟是無法干預(yù)的 , 開發(fā)者能做啟動(dòng)優(yōu)化的地方只有兩個(gè)位置 , 一個(gè)是 Application 的 onCreate 方法 , 另一個(gè)是 Activity 的 onCreate 方法 ;
針對上述的啟動(dòng)時(shí)間 , 可優(yōu)化的時(shí)間是 TotalTime , 和 ThisTime , 分別對應(yīng)應(yīng)用啟動(dòng)時(shí)間 , 和界面顯示時(shí)間 ;
1 . Application 的 onCreate 方法 : 在應(yīng)用的 Application 創(chuàng)建時(shí) , 需要調(diào)用 Application 中的 onCreate 方法 , 這里面絕對不能有耗時(shí)操作 , 直接影響到 ActivityThread 中初始化 Application 步驟的消耗時(shí)間 ;
2 . Activity 的 onCreate 方法 : 顯示第一個(gè) Activity 界面時(shí) , 不要在該 Activity 的 onCreate 方法中執(zhí)行耗時(shí)操作 ;
3 . 首界面布局優(yōu)化 : 一般在 Activity 界面中 , 需要加載 xml 布局文件 , 顯示布局文件中的畫面 , 布局文件層級不能太多 ;
三、 方法追蹤
如果要優(yōu)化性能 , 首先要知道當(dāng)前性能是多少 , 使用什么手段 , 優(yōu)化到什么程度 ; 這里就需要統(tǒng)計(jì)當(dāng)前的應(yīng)用性能 , 如應(yīng)用啟動(dòng)每個(gè)階段的耗時(shí) ;
使用 Debug.startMethodTracing() 追蹤分析方法執(zhí)行情況 ;
// 將追蹤信息存放到該文件中 File traceFile = new File(Environment.getExternalStorageDirectory(), "Method_Trace"); // 開啟方法追蹤 Debug.startMethodTracing(traceFile.getAbsolutePath());// TODO 要追蹤的內(nèi)容// 停止方法追蹤 Debug.stopMethodTracing(); 《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的【Android 性能优化】应用启动优化 ( 启动优化项目 | 界面启动时间 | 启动优化项目 | 方法追踪 MethodTracing )的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android 应用开发】Activi
- 下一篇: 【Android 性能优化】应用启动优化