帮助手册

Android 移动端 APM

Site24x7 Android 移动端 APM 可帮助您在真实终端用户设备上追踪原生移动应用的性能。例如,一个新闻阅读应用可能在内部执行以下操作:

  • 启动 Activity 以显示文章列表
  • 通过 REST API 调用加载文章列表
  • 将文章列表缓存到 SQLite 数据库
  • 为每篇文章下载缩略图
  • 将缩略图缓存到文件系统
  • 构建复杂 UI(例如自定义列表视图布局)

以上所有操作都可能是耗时较长的操作,会影响用户体验,因此对各类设备进行基准测试和优化非常重要。Site24x7 移动端 APM 通过以库的形式将 APM Agent 嵌入应用,来收集和汇总来自全球所有用户的指标。

APM Agent 使用事务和组件来衡量代码的执行时间。以上述示例为例,从启动 Activity 到渲染最终 UI 的完整操作序列可视为一个事务,各个单独操作可按 HTTP、SQLite、文件系统、UI 等不同组件类型进行分组。简单操作仅用事务即可衡量,复杂操作则可使用带组件的事务来衡量。

添加移动端 APM?

添加移动端 APM

  1. 登录 Site24x7,在 APM 选项卡下进入 Android OS 部分。
  2. 点击 添加应用程序 按钮。
  3. 输入 应用程序名称Apdex 阈值,然后点击 保存
  4. 在应用程序界面中,点击应用程序名称旁边的汉堡图标 (汉堡图标) 复制您的应用程序密钥。 
5. 将移动端 APM Android SDK 添加到应用级 build.gradle。
 

在您的原生应用中插桩并初始化移动端 APM

使用说明

首先登录 Site24x7 网站并创建一个新的移动端 APM 应用程序。您将获得应用程序密钥和库文件的下载链接。 同一应用程序密钥必须用于应用的所有版本。

  • 步骤 1:

    将移动端 APM Android SDK 添加到应用级 build.gradle

    //project level build.gradle file
    buildscript {
        repositories {
            google()
            jcenter()
            maven { url 'https://maven.zohodl.com' }
        }
    } //app level build.gradle file
    repositories {
        google()
        jcenter()
        maven { url 'https://maven.zohodl.com' }
    } dependencies {
        implementation fileTree(dir: 'libs', include: ['*.jar'])
        implementation 'com.android.support:appcompat-v4:23.0.0'
        implementation 'com.android.support.constraint:constraint-layout:1.1.3'
        implementation 'com.zoho.site24x7:mobileapm:2.2.2'
        testImplementation 'junit:junit:4.12'
        androidTestImplementation 'com.android.support.test:runner:1.0.2'
        androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    }

     

需要在应用级 build.gradle 中添加高亮显示的行,监控才能开始运行。 

步骤 2:

APM Agent 要求在 AndroidManifest.xml 中声明以下权限:

<uses-permissionandroid: name="android.permission.INTERNET"/>
<uses-permissionandroid: name="android.permission.ACCESS_NETWORK_STATE"/>
步骤 3:

在 Application 子类的 onCreate() 方法中调用 Apm.startMonitoring(),并传入您之前获取的应用程序密钥,以初始化 APM Agent。APM Agent 默认每 60 秒向 Site24x7 上传一次数据。您可以根据需要自定义上传间隔。如果没有记录到数据,APM Agent 无论间隔如何都不会建立多余的网络连接。

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import com.site24x7.android.apm.Apm;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Apm.startMonitoring(getApplicationContext(), "appKey", uploadInterval)
setContentView(R.layout.activity_main);
}

注意:请执行一些事务以开始数据收集。

步骤 4:

构建您的项目。

开始事务?

使用事务

通过调用  Apm.startTransaction() 并提供名称来开始一个事务。通常应在耗时操作开始前启动事务,操作完成后停止事务。事务是线程安全的,可在不同线程中启动和停止。一个事务对象只能被启动和停止一次。同名事务将在应用范围内取平均值。因此,当同一操作使用相同的事务名称多次执行时,记录的是平均执行时间。

private void   listArticles() {
     Transaction  transaction   = Apm. startTransaction ( "List Articles" );
     // Perform long-running operation
     Apm. stopTransaction ( transaction );
}

 

在事务中使用组件对操作进行分组?

使用组件

您可以通过调用 Transaction.startComponent() 并指定类型,将事务中的操作分组到组件中。您可以使用预定义类型,如 Component.TYPE_HTTP, Component.TYPE_SQLITE, Component.TYPE_UI 等,也可以指定自己的类型。组件是线程安全的,可在不同线程中启动和停止。一个组件对象只能被启动和停止一次。父事务停止后,组件对象将无法再停止。一个事务中的多个组件可以重叠并行运行。同一事务中同名组件将取平均值。

private void   listArticles() {
 
Transaction  transaction   = Apm. startTransaction ( "List Articles" );
Component  httpComponent   transaction .startComponent( Component.TYPE_HTTP );
Component  articlesComponent   transaction .startComponent( "Download Articles" );
// Download articles
transaction .stopComponent( articlesComponent );
for (Article  article   in  articles ) {
    Component  thumbnailComponent   transaction .startComponent( "Download Thumbnail" );
    // Download thumbnail
    transaction .stopComponent( thumbnailComponent );
}
transaction .stopComponent( httpComponent );
Apm. stopTransaction (transaction);

}

在上述示例中,HTTP 操作(下载文章和缩略图)的总耗时由  Component.TYPE_HTTP   衡量,仅下载文章的耗时由  "Download Articles" 衡量。每张缩略图的耗时由  "Download Thumbnail"   取平均值记录,因为它在循环中多次执行。

 

刷新数据?

刷新数据

有时需要  使用  Apm.flush() 方法手动将最近记录的数据刷新到 Site24x7 服务器。如果您在应用或 Activity 销毁前记录了事务,可能需要执行此操作。如果您设置了较长的上传间隔(默认为 60 秒),为防止应用在下次上传间隔前被终止,应在适当时机手动刷新数据。

 

查看数据

查看数据的步骤: 
  • 登录您的 Site24x7 账户 > APM > Android OS,点击您的应用程序。  
  • 仪表板将列出您所有移动应用及其状态:正常、宕机、严重或故障。  
  • 已暂停或存在配置错误的应用也会列示在此处。  
  • 对于活跃应用,仪表板中将列出以下指标:  
    • 所选时间段内的响应时间和吞吐量(与上一时间段对比) 
    • 所选时间段内的崩溃次数 
    • 所选时间段内的 Apdex 评分和用户数量

指标与分析

在移动应用中接入 APM Insight API 后,可查看以下应用指标: 
  1. 全球汇总 
  2. 响应时间与吞吐量
  3. 按地理区域、运营商、设备及操作系统划分的响应时间
  4. 各事务的总响应时间、吞吐量及响应时间分布 
  5. 崩溃分析

1. 全球汇总报表

全球汇总报表展示您的应用在所选时间段内跨所有地理区域的性能表现。颜色编码基于 Apdex 评分(范围为 0 到 1),0 表示用户体验极差,1 表示用户体验极佳。您可以将鼠标悬停在地图上的某个区域,查看该位置的 Apdex 评分、平均响应时间、吞吐量和错误数。

2. 应用响应时间与吞吐量

所选时间段内应用的总响应时间和吞吐量可在管理选项卡中查看。

3. 按地理区域、运营商、设备和操作系统版本划分的响应时间

应用响应时间可能受应用代码之外的多种因素影响。跨地理区域、设备和操作系统版本对比应用响应时间,有助于缩小问题范围。

按地理区域和运营商划分的响应时间可在地理区域选项卡中查看。 

按不同设备和操作系统版本划分的响应时间可在设备类型选项卡中查看。 

4. 事务响应时间

各事务的响应时间、吞吐量和调用次数可在事务选项卡中查看。

5. 崩溃分析

点击崩溃分析选项卡,可查看所选时间段内的崩溃次数。您可以将鼠标悬停在顶部的堆叠图上,查看各设备的崩溃次数、问题数量以及受该崩溃影响的用户数。中间区域显示崩溃次数的变化百分比——包括崩溃总数的增减情况以及无崩溃用户数量。崩溃摘要列出了相关异常。

您可以点击异常,查看具体的错误行。

配置告警?

配置告警

通过配置告警,当应用响应时间超过指定阈值时,您将收到通知。

您可以根据严重程度将告警设置为故障或严重。 

按照以下步骤配置告警:

  1. 登录您的 Site24x7 账户 > APM > Android。 
  2. 选择您的应用程序 > 将鼠标悬停在汉堡图标上 > 编辑监视器详情。
  3. 在配置文件下,点击 (+) 添加新的阈值和可用性配置文件。
  4. 在监视器类型中选择您的移动应用程序,并为告警命名。
  5. 输入平均响应时间值——当应用响应时间超过此值时,您将收到告警。
  6. 点击保存

您可以在通知配置文件中调整设置,决定应用宕机时何时接收告警。此外,您还可以配置用户告警组,决定告警触发时由谁接收通知。 

 

自定义 API

自定义 API 用于动态设置用户 ID、追踪自定义事件、捕获屏幕等。本文档将介绍 Site24x7 中可用的各类自定义 API 及其使用语法。

可用 API

  1. 初始化 SDK
  2. 自定义用户 ID
  3. 事务
  4. HTTP 调用
  5. 屏幕
  6. 环境
  7. 刷新
  8. 排除 HTTP 调用
  9. 排除屏幕
  10. Fragment 支持

1. 初始化 SDK

您可以使用以下 API 以自定义上传间隔初始化 SDK。默认情况下,数据上传间隔设置为 60 秒。

语法

/**
* Initializes the APM agent.
* @param {Context} context
* The application context.
* @param {String} appKey
* The application key.
* @param {int} uploadIntervalSeconds
* The interval in seconds at which to upload data to the site24x7 servers. The default is 60 seconds.
* @throws MalformedURLException
* if {@code serverUrl} could not be parsed.
*/
Apm.startMonitoring(getApplicationContext(), "appKey", uploadInterval)

2. 自定义用户 ID

默认情况下,SDK 会自动生成唯一用户 ID。如果您希望自定义用户 ID,可使用以下语法实现。当您需要追踪特定用户的指标或调试特定用户的问题时,此功能非常实用。

语法

/**
   *@param {String} userId
   */
Apm.setUserId("user@zylker.com")

3. 事务

您可以使用以下 API 追踪具有应用特定计时的自定义事件。

语法

/**
   *Transaction (can contain multiple components)
   *@param {String} transactionName
   *Component
   *@param {String} transactionName
   *@param {String} componentName
   */
Transaction transaction = Apm. startTransaction ( "List Articles" );
Component httpComponent = transaction .startComponent( Component.TYPE_HTTP );
Component articlesComponent = transaction .startComponent( "Download Articles" );
    // Download articles
     transaction .stopComponent( articlesComponent );
     for (Article article in articles ) {
     Component thumbnailComponent = transaction .startComponent( "Download Thumbnail" );
    // Download thumbnail
     transaction .stopComponent( thumbnailComponent );
     }
transaction .stopComponent( httpComponent );
Apm. stopTransaction (transaction);

4. HTTP 调用

默认情况下,使用以下网络库的网络请求将被自动捕获。

  • java.net.HttpURLConnection
  • javax.net.ssl.HttpsURLConnection
  • OkHttpLibrary(将提供拦截器)

语法

/**
   *Introducing Site24x7LoggingInterceptor for tracking HTTP calls made using OkHttp Library or Retrofit.
   */
OkHttpClient client = new OkHttpClient.Builder()
     .addNetworkInterceptor(new Site24x7LoggingInterceptor())
     .build();
Using the request body:
Request request = new Request.Builder()
     .url(url)
     .build();ResponseBody body = client
     .newCall(request)
     .execute()
     .body();Using Retrofit:
Retrofit retrofit = new Retrofit.Builder()
     .baseUrl(BASE_API_URL)
     .client(client)
     .build();


如需添加更多 HTTP 调用,请使用以下 API。

语法

/**
   *@param {String} url
   *@param {String} requestMethod
   *@param {long} startTime
        You can get it from System.currentTimeMillis()
   *@param {long} loadTime
        Measured in Millis
   *@param {int} responseCode
   *@param{String} screen
        The screen in which the HTTP call is made.
   */
Apm.addHttpCalls("https://www.example.com", "GET", 1642743078700, 526, 200, "paymentscreen" )

5. 屏幕

默认情况下,所有屏幕都会被捕获;但如果您希望添加缺失的屏幕,请使用以下 API。

语法

/**
   *@param {String} screenName
   *@param {String} orientation
   *@param {long} loadTime measured in millis
   *@param {long} startTime measured in millis
   */
Apm.addScreen("DetailScreen", "portrait", 50, 1642743078700)

6. 环境

您可以使用以下 API 设置自定义环境详情,以便在开发、调试、生产或发布等不同环境配置中筛选数据。

语法

/**
   *@param {String} environment
        Custom environment types like debug, release, or beta release.
   */
Apm.setEnvironment("release")

7. 刷新

您可以使用以下 API 立即将已记录的数据上传到服务器,而无需等待下一次上传间隔。默认情况下,刷新间隔设置为 60 秒。

语法

Apm.flush()
注意


如果网络不可用,数据将在队列中保留,直到下一次上传间隔。如果您配置了较长的上传间隔,在 Activity 或服务销毁时可能需要手动刷新数据。

8. 排除 HTTP 调用

您可以通过向以下 API 传递 URL 列表,将自定义 URL 排除在追踪之外。

语法

/**
@param {Lis<String>} listOfUrls
*/
Apm.excludeHttpCalls( Arrays.asList("example.com") )

9. 排除屏幕

您可以通过向以下 API 传递屏幕列表,将自定义屏幕排除在追踪之外。

语法

/**
   @param {List<String>} listOfScreens
   */
Apm.excludeScreens( Arrays.asList("customScreenName") )

10. Fragment 支持

您可以使用以下代码行自动追踪 Fragment。

语法

this.getSupportFragmentManager().registerFragmentLifecycleCallbacks(new Site24x7FragmentLifeCycleCallbacks(), true);
注意

请将以上代码行添加到启动 Activity 的 onCreate 方法中。

/**
*Enables fragment support for other activities
*/
Apm.enableFragmentSupport() 

发布说明

版本 2.2.2

2024 年 4 月 2 日

功能增强:

  • 注册 Fragment 生命周期回调时,支持检查 Activity 是否为 FragmentActivity 的实例。

Bug 修复:

  • 修复了处理 React Native 生命周期回调时出现的 NullPointerException 问题。

版本 2.2.1

2024 年 2 月 5 日

功能增强:

版本 2.2.0

2023 年 12 月 21 日

新功能:

以下为移动端核心指标相关功能:

  • 支持捕获应用启动时间(包括温启动和冷启动)。
  • 支持自动计算视图控制器的慢帧与卡顿帧。

功能增强:

  • 会话时长已限制为 15 分钟。

版本 2.1.1

2022 年 11 月 15 日

问题修复

  • java.io.IOException — 已解决流意外结束的问题。
  • java.io.FileNotFoundException — 当 HTTP URL 名称超过最大允许字符数时会抛出此异常,该问题已修复。

版本 2.1.0

2022 年 5 月 13 日

问题修复

  • java.lang.IllegalStateException — 已解决"Monitoring already started"异常。
  • java.lang.ClassCastException — 已解决捕获 Fragment 时出现的异常。

新功能

功能增强

  • 增强了 Crashlytics 支持。

版本 2.0.0

2021 年 6 月 4 日

功能增强

  • 支持追踪 HTTP 调用,包括请求方法、响应时间、吞吐量、状态码、平台和屏幕。
  • 支持根据响应时间、吞吐量和次数追踪屏幕
  • 支持自动追踪视图和导航。
  • 支持手动追踪视图。
  • 启用用户会话追踪,会话超时时间为 60 分钟。
  • 支持手动添加用户 ID
  • 支持追踪以下包的所有 HTTP 调用:
    • java.net.HttpURLConnection
    • javax.net.ssl.HttpsURLConnection
  • 支持手动添加其他 HTTP 调用

本文档对您有帮助吗?

您愿意帮助我们改进文档吗?请告诉我们哪些方面可以做得更好。


很抱歉本文档未能让您满意。我们希望了解可以从哪些方面改进您的体验。


感谢您抽出时间分享反馈。我们将利用您的反馈来改进在线帮助资源。

短链接已复制!