文章目录
一、 界面启动时间
二、 启动优化项目
三、 方法追踪
一、 界面启动时间
在 【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 Complete C:\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 显示时间关系 :
① 如果启动应用的第 1 11 个界面 , 即 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();