【Android 性能优化】应用启动优化 ( 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 之间执行了 4 4 句代码 ;

    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() {
            @Override
            public 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() {
            @Override
            public 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 毫秒 , 重点优化布局渲染 ;

猜你喜欢

转载自blog.csdn.net/han1202012/article/details/106898494