再忙也要学Systrace 之 app 冷启动
2020-05-15 本文已影响0人
程序员Android1
和你一起终身学习,这里是程序员 Android
本篇文章主要介绍 Android
开发中的部分知识点,通过阅读本篇文章,您将收获以下内容:
一、Kernel CPU 大小核
二、自定义Event TAG
三、app 冷启动大致流程
四、分析 Demo中埋的坑
一、Kernel CPU 大小核
Systrace 中 CPU Info 一般在最上面,里面经常会用到的信息包括:
- CPU 频率变化情况
- CPU 任务执行情况
- 大小核的调度情况
- CPU Boost 调度情况
搜索自己写的 systracedemo ,然后按"M" 就会高亮显示 app demo在CPU 中运行情况。
![](https://img.haomeiwen.com/i5851256/e8f74dc38082a942.png)
小核 :CPU 0、 CPU 1、 CPU 2、 CPU 3
大核 :CPU 4、 CPU 5、 CPU 6、 CPU 7
通过安兔兔获取CPU 频率如下:
![](https://img.haomeiwen.com/i5851256/0af0e9d016c69246.png)
选中CPU中高亮的内容,就可以查看此app 线程的运行的一些信息,比如 什么时候开始的,在哪个CPU核上,运行了多少时间片。
![](https://img.haomeiwen.com/i5851256/023fb49c359308dc.png)
二、自定义Event TAG
1. app层 自定义 TAG
自定义方法如下:
import Android.os.Trace;
Trace.beginSection(String sectionName)�
... ...
Trace.EndSection()
2. Framework 层自定义 TAG
自定义方法如下:
import Android.os.Trace;
Trace.traceBegin(long traceTag, String methodName)
... ...
Trace.traceEnd(long traceTag)
3. Native 层自定义 TAG
自定义方法如下:
#include<utils/Trace.h>
ATRACE_BEGIN("TEST");
... ...
ATRACE_END();
三、app 冷启动大致流程
PostFork ---> ZygoteInit --->ActivityThreadMain --->Bind Application--->ActivityStart --->handleStartActivity --->ActivityResume--->Choreographer#doFrame
大致流程如下:
![](https://img.haomeiwen.com/i5851256/be249eca737254e3.png)
1.PostFork ---> ZygoteInit --->ActivityThreadMain
![](https://img.haomeiwen.com/i5851256/c62191f658ce183b.png)
2.Bind Application
![](https://img.haomeiwen.com/i5851256/64dd8c081eb01298.png)
3.ActivityStart --->handleStartActivity --->ActivityResume
![](https://img.haomeiwen.com/i5851256/8ca8980821744b25.png)
4.Choreographer#doFrame
![](https://img.haomeiwen.com/i5851256/fb8694033f75d2e6.png)
四、分析 Demo中埋的坑
为了学习分析问题,在Demo 中埋了 3个sleep 在启动,通过选择启动过程的内容发现 sleep了6s多,跟自己埋坑的时间一致。
1.启动耗时分析如下:
![](https://img.haomeiwen.com/i5851256/14a1a91d0ab3b037.png)
![](https://img.haomeiwen.com/i5851256/cad040f09922b94a.png)
2.埋坑代码如下:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Trace.beginSection("----jie--onCreate------");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
setContentView(R.layout.activity_main);
Trace.endSection();
}
@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
Trace.beginSection("----jie--onStart------");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Trace.endSection();
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
Trace.beginSection("----jie--com.example.systracedemo.MainActivity------");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Trace.endSection();
}
}
至此,本篇已结束。转载网络的文章,小编觉得很优秀,欢迎点击阅读原文,支持原创作者,如有侵权,恳请联系小编删除,欢迎您的建议与指正。同时期待您的关注,感谢您的阅读,谢谢!