当前位置:首页 - 攻略资讯 - 正文

9877小游戏小游戏分类导航(btrace 开源!基于 Systrace 高性能 Trace 工具)

2025-02-17 11:12:21网友

9877小游戏小游戏分类导航

糖块俄罗斯、赖皮点豆、旋转的韵律、美女卧室救猫咪、黄金矿工小游戏、黄金弹头小游戏、猎人mm出击,这些游戏汇聚一堂,构成了9877小游戏的俄罗斯糖块系列,带给你不同的乐趣体验。

在6949推出英雄部队、国民自卫队与日本的战争、漂亮MM任你配、9877绝密任务、新款死亡之庙、中华小龙暴揍奥特曼、6949反恐陆战队、最新折磨打屁股2、最新美国美女特工、最新7k7kDNF2.2、最新版让子弹飞2、最新致命区域、鬼脸人与BOSS的大战等游戏中,你将置身于各种情境,体验刺激与挑战。

模拟6949勇士传说、模拟7k7k7、最新拳皇wing1.6、宇宙机器人复仇记录,这些游戏带你进入模拟与科幻的世界,让你在虚拟的战场与宇宙中展开冒险。

阳光海滩做成熟女孩、韩式流行时尚前卫、古代美妆服饰的化妆,这些游戏让你在虚拟的环境中体验不同的人生角色,享受时尚与美学的探索。

处置保鲜女小游戏,一款新颖的角色扮演游戏,带你进入一个独特的虚拟世界,体验保鲜女的挑战与成长。

9877小游戏小游戏分类导航(btrace 开源!基于 Systrace 高性能 Trace 工具)-第1张图片-拓城游

btrace 开源!基于 Systrace 高性能 Trace 工具

介绍

btrace(又名 RheaTrace) 是抖音基础技术团队自研的一款高性能 Android Trace 工具,它基于 Systrace 实现,并针对 Systrace 不足之处加以改进,核心改进点如下。

效率提升

:编译期间为 App 方法自动注入自定义事件,并提供高效、灵活配置规则。

性能提升:改进 Systrace 文件实时写 atrace 数据方式,性能提升最大 400 % 以上。

实用性提升:额外提供更详细 IO 等数据,大幅提升方法耗时归因效率;使用独创方案彻底来解决方法因执行异常引起 trace 数据不闭合问题。

项目地址:

https://github.com/bytedance/btrace

目前字节跳动已有多款 App 接入,包括抖音、TikTok、今日、幸福里等均已接入 RheaTrace,并为其体验优化提供强有力支持。

借助 RheaTrace 将为您的 App 带来极致流畅体验,RheaTrace 使用效果如下(因保密原则,每个方法用 ID 表示)。

9877小游戏小游戏分类导航(btrace 开源!基于 Systrace 高性能 Trace 工具)-第2张图片-拓城游

Systrace 简介

如果我们使用过 Systrace 分析应用性能,我们都知道 Systrace 提供 Category 配置让用户决定采集哪些系统 atrace 数据,如下命令,从 sched 开始后续是不同类别的 atrace 数据。

python systrace.py -o mynewtrace.html sched freq idle am wm gfx view \
    binder_driver hal dalvik camera input res

atrace 的数据类型见下图:

9877小游戏小游戏分类导航(btrace 开源!基于 Systrace 高性能 Trace 工具)-第3张图片-拓城游

其中,用户空间 atrace 类型包括应用层自定义 Trace 事件、系统层 gfx 渲染相关 Trace、系统层锁相关 Trace 信息等,其最终都是通过调用 Android SDK 提供 Trace.beginSection 或者 ATRACE_BEGIN 记录到同一个文件 /sys/kernel/debug/tracing/trace_marker 中。

此节点允许用户层写入数据,ftrace 会记录该写入操作时间戳。

当用户层发生函数调用时,ftrace 可以记录被跟踪函数的运行时间。

atrace 若需记录用户层某一 trace 类型,只需激活对应 TAG 类型即可。

如选择 gfx,则会激活 ATRACE_TAG_GRAPHICS,并将渲染事件记录到 trace_marker 文件中。

内核空间的数据主要是一些补充分析数据,如 freq、sched、binder 等,常用 CPU 调度相关信息包括:

CPU 频率变化情况。

任务执行情况。

大小核调度情况。

CPU Boost 调度情况。

9877小游戏小游戏分类导航(btrace 开源!基于 Systrace 高性能 Trace 工具)-第4张图片-拓城游

关于图中一些标签释义。

CPU 使用率:右边柱状图越高,表明使用率越高。

CPU 序号:标识 CPU 核心序号,表示该设备有 8 个核心,编号 0 -7。

CPU 频率:右边对应的粉色柱状图表示其频率变化趋势。

调度任务:标识在该 CPU 核心上正在运行的任务,点击任务可查看其 ID、优先级等信息。

这些信息 App 可以直接读取 /sys/devices/system/cpu 节点下相关信息获得,而另外一部分标识线程状态信息则只能通过系统或者 adb 才能获取,且这些信息不是统一节点控制,需要激活各自对应的事件节点,让 ftrace 记录下不同事件的 tracepoint。

内核在运行时,根据节点的使能状态,会往 ftrace 缓冲中记录事件。

例如,激活线程调度状态信息记录,需要激活类似如下相关节点。

events/sched/sched_switch/enable
events/sched/sched_wakeup/enable

激活后,则可以获取到线程调度状态相关的信息,比如:

Running: 线程在正常执行代码逻辑。

Runnable: 可执行状态,等待调度,如果长时间调度不到,说明 CPU 繁忙。

Sleeping: 休眠,一般是在等待事件驱动。

Uninterruptible Sleep: 不可中断的休眠,需要看 Args 描述来确定当时状态。

Uninterruptible Sleep - Block I/O: IO 阻塞。

9877小游戏小游戏分类导航(btrace 开源!基于 Systrace 高性能 Trace 工具)-第5张图片-拓城游

最终,上述两大类事件记录都汇集到内核态同一缓冲中, Systrace 工具是通过指定抓取 trace 类别等参数,然后触发手机端 /system/bin/atrace 开启对应文件节点信息,接着 atrace 会读取 ftrace 缓存,生成只包含 ftrace 信息的 atrace_raw 信息,最终通过脚本转换成可视化 HTML 文件,大致流程如下。

9877小游戏小游戏分类导航(btrace 开源!基于 Systrace 高性能 Trace 工具)-第6张图片-拓城游

RheaTrace 揭秘

本章节将从 RheaTrace 重点优势一一介绍。

Systrace 源码分析

Systrace 提供 TracebeginSection 作为分析入口。

public static void beginSection(@NonNull String sectionName) {
    if (isTagEnabled(TRACE_TAG_APP)) {
        if (sectionName.length() > MAX_SECTION_NAME_LEN) {
            throw new IllegalArgumentException(&34;);
        }
        nativeTraceBegin(TRACE_TAG_APP, sectionName);
    }
}

android.os.Tracedefine ATRACE_BEGIN(name) atrace_begin(ATRACE_TAG, name) static inline void atrace_begin(uint64_t tag, const char* name) { if (CC_UNLIKELY(atrace_is_tag_enabled(tag))) { void atrace_begin_body(const char*); atrace_begin_body(name); } }

atrace_begin_body 方法实现参考 system/core/libcutils/trace-dev.cpp。

void atrace_begin_body(const char* name)
{
    WRITE_MSG(&34;, &34;, name, &34;);
}

atrace_begin_body 最终实现在宏 WRITE_MSG 实现,代码如下:

beginSection(String) 传入的是方法 ID。

traceWithMethodID = true //决定哪些包名下的类您不需要做性能跟踪。

traceFilterFilePath = &34; //一些特定方法保持 ID 值固定不变。

applyMethodMappingFilePath = &34; } runtime { ...... } }

为减少包体积、性能影响,我们也借鉴 matrix 慢函数思路,支持为每个函数生成唯一 ID,traceWithMethodID 为 true,Trace34;libcutils.so&34;atrace_enabled_tags&34;atrace_marker_fd&34;&39; is not defined&installSystraceSnooper,本文不做过多介绍。

接着,通过 PLT Hook libcutils.so 中 write、write_chk 方法,判定该方法传入 fd 是否与 atrace_marker_fd 一致,若一致,则将 atrace 数据写入我们定义的文件中。

ssize_t proxy_write(int fd, const void* buf, size_t count) {
  BYTEHOOK_STACK_SCOPE();

  if (ATrace::Get().IsATrace(fd, count)) {
    ATrace::Get().LogTrace(buf, count);
    return count;
  }
  ...

  ATRACE_
声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。 E-MAIL:admin@bb1314.com 

本站所有应用均来自互联网,版权归原作者所有。如有侵权,敬请联系我们及时处理。 E-MAIL:admin@bb1314.com

湘ICP备19000562号-1