【Android 性能优化】应用启动优化 ( 启动优化项目 | 界面启动时间 | 启动优化项目 | 方法追踪 MethodTracing )
文章目錄
- 一、 界面啟動時間
- 二、 啟動優化項目
- 三、 方法追蹤
一、 界面啟動時間
在 【Android 性能優化】應用啟動優化 ( 啟動白屏問題 | 應用啟動時間測量 | 冷啟動 | 熱啟動 | 應用啟動時間計算源碼分析 ) __ 四、 APP 啟動時間計算 博客中簡要介紹了相關的啟動時間 ;
下面是執行 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 . 相關的時間概念 :
① 應用啟動開始時間 : startTime , 這是用戶在 Launcher 應用中點擊應用圖標的時間 , 之后開啟進行應用啟動 , 該時間就是 Am.java 中記錄的 startTime 開始時間 ;
IActivityManager.WaitResult result = null; int res;// 記錄開始時間 final long startTime = SystemClock.uptimeMillis(); if (mWaitOption) {// 啟動 Activity result = mAm.startActivityAndWait(null, null, intent, mimeType,null, null, 0, mStartFlags, profilerInfo, null, mUserId);res = result.result; } // 記錄結束時間 final long endTime = SystemClock.uptimeMillis();
上述源碼在 \frameworks\base\services\core\java\com\android\server\am\ActivityRecord.java
② 應用開始加載時間 : mLaunchStartTime , 這是 Application 開始加載的時間 ; 對應 ActivityRecord.java 中的 mLaunchStartTime 時間 ;
③ UI 繪制時間 : displayStartTime , 這是 Activity 開始繪制 UI 布局的時間 ; 對應 ActivityRecord.java 中的 displayStartTime 時間 ;
④ 啟動結束時間 : endTime , 這是加載結束 , 界面顯示完成的時間 ; 對應 ActivityRecord.java 中的 reportLaunchTimeLocked 方法的 curTime 參數時間 ;
private void reportLaunchTimeLocked(final long curTime) {final ActivityStack stack = task.stack;// 這里計算了 APP 啟動時間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 . 時間之間的關系 :
① 應用加載時間 : TotalTime , 從 Application 開始加載 , 到界面顯示完畢的時間 ; TotalTime = endTime - mLaunchStartTime ;
② 界面顯示時間 : ThisTime , 從界面開始顯示 , 到界面顯示完畢的時間 ; ThisTime = endTime - displayStartTime ;
③ 用戶等待時間 : WaitTime , 從用戶點擊應用圖標開始 , 到應用顯示完畢的時間 ; WaitTime = endTime - startTime ; 用戶等待的時間是 startTime 到 endTime 的所有時間 ;
4 . TotalTime 與 ThisTime 顯示時間關系 :
① 如果啟動應用的第 111 個界面 , 即 Launch Activity 界面 , 那么 TotalTime = ThisTime ;
② 如果啟動連續多個 Activity 界面 , 那么 TotalTime > ThisTime , 每個 Activity 都會有一個顯示時間 , 所有的 Activity 的顯示時間 ThisTime 相加等于 TotalTime 的時長 ;
二、 啟動優化項目
在 Launcher 應用點擊圖標后 , 啟動應用 , 系統為應用開啟進程 , 分配內存的步驟是無法干預的 , 開發者能做啟動優化的地方只有兩個位置 , 一個是 Application 的 onCreate 方法 , 另一個是 Activity 的 onCreate 方法 ;
針對上述的啟動時間 , 可優化的時間是 TotalTime , 和 ThisTime , 分別對應應用啟動時間 , 和界面顯示時間 ;
1 . Application 的 onCreate 方法 : 在應用的 Application 創建時 , 需要調用 Application 中的 onCreate 方法 , 這里面絕對不能有耗時操作 , 直接影響到 ActivityThread 中初始化 Application 步驟的消耗時間 ;
2 . Activity 的 onCreate 方法 : 顯示第一個 Activity 界面時 , 不要在該 Activity 的 onCreate 方法中執行耗時操作 ;
3 . 首界面布局優化 : 一般在 Activity 界面中 , 需要加載 xml 布局文件 , 顯示布局文件中的畫面 , 布局文件層級不能太多 ;
三、 方法追蹤
如果要優化性能 , 首先要知道當前性能是多少 , 使用什么手段 , 優化到什么程度 ; 這里就需要統計當前的應用性能 , 如應用啟動每個階段的耗時 ;
使用 Debug.startMethodTracing() 追蹤分析方法執行情況 ;
// 將追蹤信息存放到該文件中 File traceFile = new File(Environment.getExternalStorageDirectory(), "Method_Trace"); // 開啟方法追蹤 Debug.startMethodTracing(traceFile.getAbsolutePath());// TODO 要追蹤的內容// 停止方法追蹤 Debug.stopMethodTracing(); 《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的【Android 性能优化】应用启动优化 ( 启动优化项目 | 界面启动时间 | 启动优化项目 | 方法追踪 MethodTracing )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android 应用开发】Activi
- 下一篇: 【Android 性能优化】应用启动优化