#ebpf #android #apps #analyzer #track #uprobe #frametime

frame-analyzer

基于 ebpf & uprobe 跟踪 Android 应用的 frametime

5 个版本

0.2.6 2024 年 4 月 23 日
0.2.5 2024 年 4 月 22 日
0.1.31 2024 年 4 月 21 日

#27#ebpf

Download history 506/week @ 2024-04-22 26/week @ 2024-04-29 7/week @ 2024-05-06 14/week @ 2024-05-20 6/week @ 2024-06-03 9/week @ 2024-06-10 27/week @ 2024-06-17 20/week @ 2024-06-24 42/week @ 2024-07-22 24/week @ 2024-07-29 24/week @ 2024-08-05

每月 90 次下载

GPL-3.0 许可证

27KB
308 代码行

frame-analyzer-ebpf

Crates.io License Documentaiton

基于 ebpf & uprobe 跟踪 Android 应用的 frametime

  • 基于 EBPF 和 UPROBE 的实现,您可能需要更高的权限(例如 root)才能正确使用此 crate
  • 这**不是一个二进制 crate**,它使用一些技巧(见 )来使其像正常 lib crate 一样工作,尽管它包含一个 EBPF 程序
  • 仅支持 64 位设备和应用程序!

示例

简单的 frametime 分析器,在屏幕上打印 pid & frametime

use std::sync::{
    atomic::{AtomicBool, Ordering},
    Arc,
};

use anyhow::Result;
use clap::Parser;
use frame_analyzer::Analyzer;

/// Simple frame analyzer, print frametime on the screen
#[derive(Parser, Debug)]
#[command(version, about)]
struct Args {
    /// The pid of the target application
    #[arg(short, long)]
    pid: i32,
}

fn main() -> Result<()> {
    let arg = Args::parse();
    let pid = arg.pid;

    let mut analyzer = Analyzer::new()?;
    analyzer.attach_app(pid)?;

    let running = Arc::new(AtomicBool::new(true));

    {
        let running = running.clone();
        ctrlc::set_handler(move || {
            running.store(false, Ordering::Release);
        })?;
    }

    while running.load(Ordering::Acquire) {
        if let Some((_, frametime)) = analyzer.recv() {
            println!("frametime: {frametime:?}");
        }
    }

    Ok(())
}

许可证

本项目采用 GNU 通用公共许可证 v3.0 许可 - 有关详细信息,请参阅 许可证 文件。

依赖项

~7–15MB
~190K SLoC