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的功能(真是强大),不过还是因为版本原因没法用。。。
好了,其它的功能下次再看吧,来不起了,太困了。。。