不管是运用开发,还是功能优化,都需求借助Systrace东西。

今天我们主要从Systrace东西入手,介绍一款字节开源的RheaTrace库(又叫btrace,下文简称btrace)的运用。

Systrace

systrace是Google官方供给的,用于检测Android体系组件随时刻运转状态的东西。

监控办法

Systrace的原理特别简略,就是在办法的开端和完毕处,分别调用traceBegintraceEnd办法。

将运转的成果组成Trace Event格局,借助Google供给Trace Viewer解析东西,呈现出以时刻为横轴的办法调用堆栈图。

Android源码里,能够看到许多相关的代码。

Java层代码:

import android.os.Trace;
Trace.traceBegin(long traceTag, String methodName)
Trace.traceEnd(long traceTag)

Native层代码:

#include<utils/Trace.h>
ATRACE_CALL();

我们也能够在运用代码中,手动调用Trace的办法添加对运用办法的监控。

import android.os.Trace;
Trace.beginSection(String sectionName)
Trace.EndSection()

抓trace

  1. 通过adb衔接手机。

  2. 进入本地的systrace目录:/Users/${user_name}/Library/Android/sdk/platform-tools/systrace,履行如下命令:

python systrace.py -b 32768 -t 5 -o mytrace.html gfx input view webview wm am sm audio video camera hal app res dalvik rs bionic power sched irq freq idle disk mmc load sync workq memreclaim regulators

为了后续操作便利,能够将systrace的途径参加环境变量,也能够设置alias

systrace的缺陷

默许只要Android体系的源码里添加了Trace相关的代码,运用代码假如想要参加监控,需求手动添加,功率太低。

btrace

btrace是字节开源的根据SystraceAndroid trace东西,能够在编译期间主动注入自定义事情。

下面介绍一下,怎么运用btrace来对运用进行更完好的监控。

其实btrace的文档已经写得很清楚了,我们能够直接去看文档,我在这里也给我们简略列一下。

1. 编译前

要运用btrace的插桩能力,需求在app工程中进行一些修正。

操作十分简略,只需求引入plugin,进行相应的装备即可。

首先,在根目录的build.gradle中添加rhea-gradle-plugin依靠。

buildscript {
    repositories {
        ...
        mavenCentral()
        ...
    }
    dependencies {
        classpath 'com.bytedance.btrace:rhea-gradle-plugin:1.0.1'
    }
}
allprojects {
    repositories {
        ...
        mavenCentral()
        ...
    }
}

然后在app/build.gradle文件中添加对应的插件和依靠,进行一些自定义的装备。

dependencies {
    //rheatrace core lib
    implementation "com.bytedance.btrace:rhea-core:1.0.1"
}
...
rheaTrace {
   compilation {
      //为削减 APK 体积, 你能够为 App 中需求盯梢的办法设置 id 以此来盯梢此自定义事情, 默许值 false。
      traceWithMethodID = false 
      //该文件装备决定哪些办法您不希望盯梢, 默许值 null。
      traceFilterFilePath = "${project.rootDir}/rhea-trace/traceFilter.txt"
      //用特指定办法 id 来设置自定义事情名称, 默许值 null。
      applyMethodMappingFilePath = "${project.rootDir}/rhea-trace/keep-method-id.txt"
  }
   runtime {
      //仅在主线程抓取盯梢事情, 默许值 false。
      mainThreadOnly true 
      //在 App 启动之初开端抓取盯梢事情, 默许值 true。
      startWhenAppLaunch true
      //指定内存存储 atrace 数据 ring buffer 的巨细。
      atraceBufferSize "500000"
   }
}
// 添加插件
apply plugin: 'com.bytedance.rhea-trace'

2. 装备脚本环境

1. 承认python版别

目前btrace只支撑python2.7,所以在运用之前,先承认一下当前运用的python版别号。

python --version

2. 装备systrace环境变量

由于btrace需求依靠systrace,所以必须装备systrace的环境变量,让我们能够任何目录访问到systrace

export PATH=${PATH}:/Users/${user_name}/Library/Android/sdk/platform-tools/systrace

这里有一个问题,高版别的Android sdk移除了systrace,能够从30.0.0以下的版别下载systrace,拷贝到Android sdk目录下。

3. 抓trace

systrace差不多,也是将手机通过adb衔接,履行一个python脚本。

进入目录btrace/scripts/python/rheatrace,履行如下命令。

python rheatrace.py -a rhea.sample.android -t 5 -o ./output/mynewtrace.html sched freq idle am wm gfx view binder_driver hal dalvik camera input res

各个参数的意义,能够查阅文章最终附带的btrace官方README,假如运用过systrace的同学应该对这里的参数很熟悉。

履行完脚本后,在手机上履行你要监控的操作,等时刻到了会主动生成trace文件。

4. 通过文件修正装备

支撑通过文件修正装备,是我觉得btrace做得特别好的当地。

大概是由于字节的app也都比较重,编译一次很耗时,所以才有了这个计划,正好击中了开发大型app的同学们的痛点。

办法是创立姓名为rheatrace.config Properties格局文件,写入如下装备,再pushsdcard/rhea-trace/${运用包名}下,重启即可让装备收效。

io=true
classLoad=true
memory=true
mainThreadOnly=true
atraceBufferSize=100000
startWhenAppLaunch=true

详细的字段意义,能够到btrace的github README上找,链接贴在文章最终。

5. 用Perfetto翻开

Perfetto是Google新开发的功能调试工作,比Trace ViewerUI更美观,操作更快更快捷,且支撑protobuf编码格局。

Perfetto是兼容Trace Event格局的,所以systrace抓取到的文件能够直接用Perfetto翻开。perfetto

参考文章

bytedance btrace github
trace-viewer格局
Perfetto Quickstart