【Android 性能优化】应用启动优化 ( 启动优化项目 | 界面启动时间 | 启动优化项目 | 方法追踪 MethodTracing )

2023-03-27 21:42:27 浏览数 (1)

文章目录

  • 一、 界面启动时间
  • 二、 启动优化项目
  • 三、 方法追踪

一、 界面启动时间


在 【Android 性能优化】应用启动优化 ( 启动白屏问题 | 应用启动时间测量 | 冷启动 | 热启动 | 应用启动时间计算源码分析 ) __ 四、 APP 启动时间计算 博客中简要介绍了相关的启动时间 ;

下面是执行 adb shell am start -W 包名/完整 Activity 类名 命令 , 打印出的完整日志 ;

代码语言:javascript复制
C:Usersoctop>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:Usersoctop>

2 . 相关的时间概念 :

① 应用启动开始时间 : startTime , 这是用户在 Launcher 应用中点击应用图标的时间 , 之后开启进行应用启动 , 该时间就是 Am.java 中记录的 startTime 开始时间 ;

代码语言:javascript复制
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();

上述源码在 frameworksbaseservicescorejavacomandroidserveramActivityRecord.java

② 应用开始加载时间 : mLaunchStartTime , 这是 Application 开始加载的时间 ; 对应 ActivityRecord.java 中的 mLaunchStartTime 时间 ;

③ UI 绘制时间 : displayStartTime , 这是 Activity 开始绘制 UI 布局的时间 ; 对应 ActivityRecord.java 中的 displayStartTime 时间 ;

④ 启动结束时间 : endTime , 这是加载结束 , 界面显示完成的时间 ; 对应 ActivityRecord.java 中的 reportLaunchTimeLocked 方法的 curTime 参数时间 ;

代码语言:javascript复制
    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;
    }

上述源码在 frameworksbaseservicescorejavacomandroidserveramActivityRecord.java

3 . 时间之间的关系 :

① 应用加载时间 : TotalTime , 从 Application 开始加载 , 到界面显示完毕的时间 ; TotalTime = endTime - mLaunchStartTime ;

② 界面显示时间 : ThisTime , 从界面开始显示 , 到界面显示完毕的时间 ; ThisTime = endTime - displayStartTime ;

③ 用户等待时间 : WaitTime , 从用户点击应用图标开始 , 到应用显示完毕的时间 ; WaitTime = endTime - startTime ; 用户等待的时间是 startTime 到 endTime 的所有时间 ;

4 . TotalTime 与 ThisTime 显示时间关系 :

① 如果启动应用的第

1

个界面 , 即 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() 追踪分析方法执行情况 ;

代码语言:javascript复制
// 将追踪信息存放到该文件中
File traceFile = new File(Environment.getExternalStorageDirectory(), "Method_Trace");
// 开启方法追踪
Debug.startMethodTracing(traceFile.getAbsolutePath());

// TODO 要追踪的内容

// 停止方法追踪
Debug.stopMethodTracing();

0 人点赞