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

简介: 【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
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();


目录
相关文章
|
13天前
|
JSON Java API
探索安卓开发:打造你的首个天气应用
在这篇技术指南中,我们将一起潜入安卓开发的海洋,学习如何从零开始构建一个简单的天气应用。通过这个实践项目,你将掌握安卓开发的核心概念、界面设计、网络编程以及数据解析等技能。无论你是初学者还是有一定基础的开发者,这篇文章都将为你提供一个清晰的路线图和实用的代码示例,帮助你在安卓开发的道路上迈出坚实的一步。让我们一起开始这段旅程,打造属于你自己的第一个安卓应用吧!
38 14
|
14天前
|
搜索推荐 前端开发 测试技术
打造个性化安卓应用:从设计到开发的全面指南
在这个数字时代,拥有一个定制的移动应用不仅是一种趋势,更是个人或企业品牌的重要延伸。本文将引导你通过一系列简单易懂的步骤,从构思你的应用理念开始,直至实现一个功能齐全的安卓应用。无论你是编程新手还是希望拓展技能的开发者,这篇文章都将为你提供必要的工具和知识,帮助你将创意转化为现实。
|
14天前
|
Java Android开发 开发者
探索安卓开发:构建你的第一个“Hello World”应用
在安卓开发的浩瀚海洋中,每个新手都渴望扬帆起航。本文将作为你的指南针,引领你通过创建一个简单的“Hello World”应用,迈出安卓开发的第一步。我们将一起搭建开发环境、了解基本概念,并编写第一行代码。就像印度圣雄甘地所说:“你必须成为你希望在世界上看到的改变。”让我们一起开始这段旅程,成为我们想要见到的开发者吧!
23 0
|
缓存 安全 开发工具
Android 解决bug:Android studio 运行、编译项目时导致电脑死机
Android 解决bug:Android studio 运行、编译项目时导致电脑死机
922 0
|
Android开发
Android Studio在android Emulator中运行的项目黑屏
Android Studio在android Emulator中运行的项目黑屏
762 0
Android Studio在android Emulator中运行的项目黑屏
|
Android开发 开发者 Windows
Android Studio运行项目
一、在真机上运行(Mac没得) 二、Android Studio自带模拟器(AVD)安装以及运行项目 三、在模拟器上运行
657 0
Android Studio运行项目
|
移动开发 Java API
android studio虚拟机运行react-native项目全流程(避坑笔记)
android studio虚拟机运行react-native项目全流程(避坑笔记)
android studio虚拟机运行react-native项目全流程(避坑笔记)
|
开发工具 Android开发
装X式的阅读代码,无需开启Android Studio来运行项目
这篇博文主要是给自己做个笔记,木有啥技术可言,也是方便自己在阅读代码的时候省去繁重的AS带来卡卡的感觉。 这篇博文是stormzhang大神那参考来的,很久就久仰大名了,今天没事逛了下他的博客,写的很全面,还有一些代码之外的问题探讨,让自己开阔了不少眼界,继续follow学习 现在,我们手上什么都没有,接下来,我们来一步一步的实现 随便找一个github上面的源码
2354 0
|
Android开发
Android Studio 运行项目发生instant Run requires启动不了程序
有时候运行程序会发生instant Run requires ‘Tools | Android | Enable ADB integration’ to be enabled. 是因为设置了ADB没被勾选上 看图,选上就行了 $(function () { $('pre.prettyprint
1408 0
|
Java Android开发
Android Studio 运行项目遇到的错误
版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/lyhhj/article/details/47416153 最近在用Android...
850 0