如何离线部署 perfetto ui
perfetto 是从安卓9.0开始可用的安卓系统性能监测相关的一个工具,可以参考官网: perfetto
通常我们使用 ui.perfetto.dev 来查看从系统里面抓取到的信息,这个网站是可以离线使用的,但是某些时候,我们需要将这个网站离线或者部署到内网使用,这里我们主要参考 Perfetto build instruction。p.s: 官网是更加详细的,这里只是简单总结一下步骤。
1、下载源码
你可以通过这样一条命令下载到源码
git clone https://android.googlesource.com/platform/external/perfetto/
做Android Framework或者固件的人一样就能看出来了,这条命令下载了AOSP源码下的 platform/external/perfetto
,下载到源码的方式还有很多,例如Github上 perfetto。
2、下载依赖
下载需要外网环境和Linux系统
cd perfetto
tools/install-build-deps --ui
这里最好使用Ubuntu环境,并且需要安装 3.7 版本以上的 python3,如果不想破坏宿主机环境,可以用虚拟机或者docker来解决。
这一步视网络环境,下载时间在 10min~30min 左右。
3、编译运行(p.s 这一步可能需要 16GB 内存,我用12GB内存的虚拟机是跑不起来的)
ui/run-dev-server
成功运行之后,你会看到类似下图的信息,如果你是在本地编译运行,这个时候通过浏览器范围 http://127.0.0.1:10000 应该可以正常看到网页了。
如果你不是在本地编译运行,可以用类似
./ui/build -s --serve-host 0.0.0.0 -w
的命令来运行,然后浏览器直接访问编译和运行perfetto的设备的IP地址,端口为 10000来访问它。下面我是在局域网运行的样例
4. 离线部署
第三步有提及,编译运行需要12GB上内存,这个条件直接劝退VPS内存小的人。ui.perfetto.dev
实际上是一堆js/html文件,编译运行之后,对应的网页文件在源码路径out/ui/ui/dist
里面能找到,dist 目录里面的文件大概是这些(p.s: 如果你编译出来没有 service_worker.js ,使用命令编译运行不要停掉,用浏览器访问一次服务就会生成出来)
dist
├── index.html
├── service_worker.js
├── service_worker.js.map
└── v36.1-127c77716
├── assets
│ ├── brand.png
│ ├── catapult_trace_viewer.html
│ ├── catapult_trace_viewer.js
│ ├── favicon.png
│ ├── logo-128.png
│ ├── logo-3d.png
│ ├── MaterialSymbolsOutlined.woff2
│ ├── rec_atrace.png
│ ├── rec_battery_counters.png
│ ├── rec_board_voltage.png
│ ├── rec_cpu_coarse.png
│ ├── rec_cpu_fine.png
│ ├── rec_cpu_freq.png
│ ├── rec_cpu_voltage.png
│ ├── rec_frame_timeline.png
│ ├── rec_ftrace.png
│ ├── rec_gpu_mem_total.png
│ ├── rec_java_heap_dump.png
│ ├── rec_lmk.png
│ ├── rec_logcat.png
│ ├── rec_long_trace.png
│ ├── rec_mem_hifreq.png
│ ├── rec_meminfo.png
│ ├── rec_native_heap_profiler.png
│ ├── rec_one_shot.png
│ ├── rec_profiling.png
│ ├── rec_ps_stats.png
│ ├── rec_ring_buf.png
│ ├── rec_syscalls.png
│ ├── rec_vmstat.png
│ ├── Roboto-100.woff2
│ ├── Roboto-300.woff2
│ ├── Roboto-400.woff2
│ ├── Roboto-500.woff2
│ ├── RobotoCondensed-Light.woff2
│ ├── RobotoCondensed-Regular.woff2
│ ├── RobotoMono-Regular.woff2
│ └── scheduling_latency.png
├── engine_bundle.js
├── engine_bundle.js.map
├── frontend_bundle.js
├── frontend_bundle.js.map
├── index.html
├── manifest.json
├── perfetto.css
├── perfetto.css.map
├── traceconv_bundle.js
├── traceconv_bundle.js.map
├── traceconv.wasm
└── trace_processor.wasm
2 directories, 53 files
把这些文件拿出来用任意一个你喜欢的web服务器搭建一个静态文件服务器即可,同样的,如果你实在没有编译运行的环境,还可以直接把 ui.perfetto.dev 扒下来。
5.移掉 is_internal_us.js 的访问
访问官网 ui.perfetto.dev 的时候,明明说是可以离线运行并且UI都出来了,但是每次访问官网,浏览器还是得转半天,打开浏览器得调试页面可以看到还访问了https://storage.cloud.google.com/perfetto-ui-internal/is_internal_user.js
,如下图所示
这个链接即使在外网也是访问不到的,这里提供两种办法。
- 如果自己没有需要访问谷歌云的需求,可以直接改本机的hosts,把 storage.cloud.google.com 指向 127.0.0.1 在,这样它访问失败的速度比较快。
- 编译运行之前,修改源码的
ui/src/frontend/index.ts
,按照下图所示把对应的位置注释掉,然后重新编译运行、部署。
6. 支持USB调试
官网是支持在网页上直接通过usb adb来连接安卓设备直接抓取trace的,离线部署的话只需要添加 https 支持就可以了。下面是我本地搭的示例