当前位置: 首页 > news >正文

Android学习22 -- perfetto

1 前言

在之前的工作中就偶尔见到同事分析性能的时候,拿出漂亮的火焰图,或者XX图,当时非常惊讶,觉得怎么可以做这么好。

后面看多了,才知道这个原来是安卓的perfetto工具,专门用来分析性能的。别人能玩,我们当然也能玩,所以现在有时间自己也试试。

2 Camera程序

弄了一个Camera的小程序。

package com.example.cameraxdemo2;

import android.content.pm.PackageManager;
import android.os.Bundle;

import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.camera.lifecycle.ProcessCameraProvider;
import androidx.camera.view.PreviewView;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;

import com.google.common.util.concurrent.ListenableFuture;
import androidx.annotation.NonNull;
import android.Manifest;
import androidx.camera.core.Preview;  // 关键导入
import androidx.camera.view.PreviewView;
import androidx.camera.core.CameraSelector; // 关键导入
import androidx.camera.core.Preview;
import androidx.camera.lifecycle.ProcessCameraProvider;

public class MainActivity extends AppCompatActivity {
    private PreviewView previewView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        previewView = findViewById(R.id.previewView);

        if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
                == PackageManager.PERMISSION_GRANTED) {
            startCamera();
        } else {
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.CAMERA}, 101);
        }
    }

    private void startCamera() {
        ListenableFuture<ProcessCameraProvider> cameraProviderFuture =
                ProcessCameraProvider.getInstance(this);

        cameraProviderFuture.addListener(() -> {
            try {
                ProcessCameraProvider cameraProvider = cameraProviderFuture.get();

                Preview preview = new Preview.Builder().build();
                preview.setSurfaceProvider(previewView.getSurfaceProvider());

                CameraSelector cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA;

                cameraProvider.unbindAll();
                cameraProvider.bindToLifecycle(this, cameraSelector, preview);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }, ContextCompat.getMainExecutor(this));
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
                                           @NonNull int[] grantResults) {
        if (requestCode == 101 && grantResults.length > 0 &&
                grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            startCamera();
        }
    }
}

代码也很简单,就是用了一下安卓的cameraProvider。运行时是这样的。还是用的祖传的荣耀平板8。

3 perfetto

3.1 命令行 

根据教程,可以直接使用adb命令来操作。大概是这样

adb shell perfetto -o /sdcard/trace.perfetto-trace -c - <<EOF
buffers {
  size_kb: 10240
  fill_policy: RING_BUFFER
}
data_sources {
  config {
    name: "linux.ftrace"
    target_buffer: 0
    ftrace_config {
      ftrace_events: "sched/sched_switch"
      ftrace_events: "sched/sched_wakeup"
      ftrace_events: "tracing_mark_write"
    }
  }
}
duration_ms: 15000
EOF

 导出成/sdcard/trace.perfetto-trace之后pull出来。但是一运行就报错,提示各种权限问题,还有一些参数问题。看来还是要找个root的机器才行。。。试了很多方法未果,最后放弃了。

3.2 Android Studio

在Studio上也有这功能,但是一开始没发现,找了半天原来是这。

 

好吧,果然还是Android Studio强大,一下就可以抓取了。

这个是内存的。

 

还有CPU的。

 

另外还有个System trace我这边启动报错了,不知道原因。。。

好吧,很好很强大,下次再详细分析吧。。。

3 Perfetto UI

谷歌对于这个还专门有个网站,可以更好的查看结果。但是我上传上去就是报错。。。

 可能还是荣耀平板8的安卓9有点老了吧。。。

另外这个网站还有web usb的功能(真是强大),不过还是因为版本原因没法用。。。

好了,其它的功能下次再看吧,来不起了,太困了。。。

相关文章:

  • 【自动驾驶 机器人】速度规划 |梯形/S型速度曲线
  • python中的字符串
  • 嵌入式面试笔试那点事2:2025.4.13
  • Vue事件修饰符课堂练习
  • golang-context详解
  • MySQL varchar 最大长度
  • 【苹果cms 2】资源站动漫采集爬取
  • C#容器源码分析 --- List<T>
  • AI技术实战:从零搭建图像分类系统全流程详解
  • SaaS、Paas、IaaS、MaaS、BaaS五大云计算服务模式
  • 【前端网络请求】XHR封装,支持文件上传、进度监控、混合字段传输
  • 基于SpringBoot的瑜伽馆管理系统【附源码】
  • Java 基础数据类型与运算符深度剖析
  • Python、C++中的查找
  • Spring Bean的创建过程与三级缓存的关系详解
  • socket到底是什么
  • 分发饼干问题——用贪心算法解决
  • Oracle 11G RAC 删除添加节点(一):删除节点
  • 智能SEO关键词AI精准布局
  • swagger 注释说明
  • 中央网信办部署开展“清朗·整治AI技术滥用”专项行动
  • 专访 | 杜普兰蒂斯:爱上中国文化,下一步努力提升速度
  • 北京银行一季度净赚超76亿降逾2%,不良贷款率微降
  • 农行一季度净利润719亿元增2.2%,不良率微降至1.28%
  • 郭继孚被撤销全国政协委员资格,此前为北京交通发展研究院长
  • 企业取消“大小周”引热议,半月谈:不能将显性加班变为隐性加班