700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 【Android 性能优化】应用启动优化 ( Trace 文件分析 | 结合代码分析 Trace 文件 )

【Android 性能优化】应用启动优化 ( Trace 文件分析 | 结合代码分析 Trace 文件 )

时间:2020-03-25 21:07:45

相关推荐

【Android 性能优化】应用启动优化 ( Trace 文件分析 | 结合代码分析 Trace 文件 )

文章目录

一、 Trace 文件查看二、 结合代码分析 Trace 文件

一、 Trace 文件查看

上一篇博客 【Android 性能优化】应用启动优化 ( 方法追踪代码模板 | 示例项目 | SD 卡访问权限 | 示例代码 | 获取 Trace 文件 | Android Studio 查看文件) 中获取到了应用启动时 onCreate 方法的代码追踪内容 , 代码执行的详细信息都保存在了 Method_Trace.trace 文件中 , 本篇博客开始分析其中的内容信息 ;

Android Studio 中分析 Method_Trace.trace 文件界面 :

线程选择 :选择要分析的是哪个线程 , 在这里一般分析 main 主线程 , 选择该 main 线程后 , 下面的图标显示的就是主线程的操作细节 ;

方法调用图 ( Call Chart ) :选择了方法调用图后 , 就会显示方法调用细节 , 从 Zygote 创建进程 , ActivityThread 启动主线程 , 到界面 MainActivity 调用过程都有 ;

放大上述调用图 :按住 Ctrl 不松开 , 滚动鼠标滚轮 , 可以放大缩小上述方法调用图 ; 该图拉长后 , 很长 , 大约有一两百米的样子 ;

查看具体的某个方法执行时间 :将鼠标移动到某个方法的矩形块中 , 如这个 findViewById 方法 , 该橙色的块就代表了方法的执行时间 , 该方法执行了 92 微秒 ( μs ) ;

方法调用 :每一个矩形块 , 都代表一个方法 , 最上层的矩形块代表最外层方法 , 下层的矩形块是被上层矩形块调用的方法 , 每个方法 ;

上下排列的矩形块 :上下排列的矩形块表示上层方法调用下层方法 ;

左右排列矩形块 :代表先后执行的两个方法 ;

每个方法执行的详细参数 :

Total ( μs ) :方法执行消耗时间 , 单位是微秒 ( μs ) ;

% :方法执行时间占总体的百分比 ;

二、 结合代码分析 Trace 文件

下面代码中 , 在 Debug.startMethodTracing 与 Debug.stopMethodTracing 之间执行了 444 句代码 ;

protected void onCreate(Bundle savedInstanceState) {/*此时应用首界面启动完成, 将主题恢复成其它主题此处也可以根据不同的设置, 为应用设置不同的主题*/setTheme(R.style.AppTheme);super.onCreate(savedInstanceState);// 初始化权限initPermissions();// ★ 1. 将追踪信息存放到该文件中File traceFile = new File(Environment.getExternalStorageDirectory(), "Method_Trace");// ★ 2. 开启方法追踪Debug.startMethodTracing(traceFile.getAbsolutePath());setContentView(R.layout.activity_main);mSurfaceView = findViewById(R.id.surfaceView);// 创建直播推流器, 用于将采集的视频数据推流到服务器端// 800_000 代表 800K 的码率mLivePusher = new LivePusher(this,640, 480, 800_000, 10,Camera.CameraInfo.CAMERA_FACING_BACK);// 设置 Camera 采集的图像本地预览的组件, 在 mSurfaceView 界面先绘制摄像头// 此处要为 SurfaceHolder 设置 SurfaceHolder.Callback 回调 , 通过里面的回调函数// 驱动整个推流开始mLivePusher.setPreviewDisplay(mSurfaceView.getHolder());findViewById(R.id.button_play).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// rtmp://123.56.88.254/myapp/0// 0 相当于 直播的 密码// 配置好服务器后, 记录 IP 地址, 替换 123.56.88.254 IP 地址// rtmp://123.56.88.254/myapp/mystream 地址推流后// 可以直接在 RTMP 服务器端的主页, 使用 JWPlayer 观看直播内容// 网页地址是 http//123.56.88.254:8080/String rtmpServerAddress = "rtmp://123.56.88.254/myapp/mystream";mLivePusher.startLive(rtmpServerAddress);((TextView)findViewById(R.id.textViewUrl)).setText("推流地址 : " + rtmpServerAddress);}});// ★ 3. 停止方法追踪Debug.stopMethodTracing();}

onCreate 方法 :整个 onCreate 方法执行了 207 ms ;

protected void onCreate(Bundle savedInstanceState) {}

1. 开启方法追踪 :耗时 159 微秒 ;

// ★ 2. 开启方法追踪Debug.startMethodTracing(traceFile.getAbsolutePath());

2. setContentView 方法 :执行了 186.9 ms ;

setContentView(R.layout.activity_main);

3. 查找组件 :该方法仅仅耗时 85 微秒 , 可以忽略不计 ;

mSurfaceView = findViewById(R.id.surfaceView);

4. 创建直播推流器 :创建直播推流器使用了 16.96 毫秒的时间 ;

// 创建直播推流器, 用于将采集的视频数据推流到服务器端// 800_000 代表 800K 的码率mLivePusher = new LivePusher(this,640, 480, 800_000, 10,Camera.CameraInfo.CAMERA_FACING_BACK);

5. 设置 Camera 图像采集预览组件 :耗时 117 微秒 ;

// 设置 Camera 采集的图像本地预览的组件, 在 mSurfaceView 界面先绘制摄像头// 此处要为 SurfaceHolder 设置 SurfaceHolder.Callback 回调 , 通过里面的回调函数// 驱动整个推流开始mLivePusher.setPreviewDisplay(mSurfaceView.getHolder());

6. 设置按钮点击事件 :

findViewById(R.id.button_play).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// rtmp://123.56.88.254/myapp/0// 0 相当于 直播的 密码// 配置好服务器后, 记录 IP 地址, 替换 123.56.88.254 IP 地址// rtmp://123.56.88.254/myapp/mystream 地址推流后// 可以直接在 RTMP 服务器端的主页, 使用 JWPlayer 观看直播内容// 网页地址是 http//123.56.88.254:8080/String rtmpServerAddress = "rtmp://123.56.88.254/myapp/mystream";mLivePusher.startLive(rtmpServerAddress);((TextView)findViewById(R.id.textViewUrl)).setText("推流地址 : " + rtmpServerAddress);}});

① 查找按钮 :花费 112 微秒 ;

② 创建按钮点击监听器 :花费 8 微秒 ;

③ 设置按钮点击事件 :花费 24 微秒 ;

7. 结束方法追踪 :花费 18 微秒 ;

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

总结 : 在上述 onCreate 方法中 , 总耗时 207 毫秒 , 布局加载 setContentView(R.layout.activity_main) 花费了 186.9 毫秒 , 重点优化布局渲染 ;

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。