Android 移动端 APM
Site24x7 Android 移动端 APM 可帮助您在真实终端用户设备上追踪原生移动应用的性能。例如,一个新闻阅读应用可能在内部执行以下操作:
- 启动 Activity 以显示文章列表
- 通过 REST API 调用加载文章列表
- 将文章列表缓存到 SQLite 数据库
- 为每篇文章下载缩略图
- 将缩略图缓存到文件系统
- 构建复杂 UI(例如自定义列表视图布局)
以上所有操作都可能是耗时较长的操作,会影响用户体验,因此对各类设备进行基准测试和优化非常重要。Site24x7 移动端 APM 通过以库的形式将 APM Agent 嵌入应用,来收集和汇总来自全球所有用户的指标。
APM Agent 使用事务和组件来衡量代码的执行时间。以上述示例为例,从启动 Activity 到渲染最终 UI 的完整操作序列可视为一个事务,各个单独操作可按 HTTP、SQLite、文件系统、UI 等不同组件类型进行分组。简单操作仅用事务即可衡量,复杂操作则可使用带组件的事务来衡量。
添加移动端 APM?
添加移动端 APM
- 登录 Site24x7,在 APM 选项卡下进入 Android OS 部分。
- 点击 添加应用程序 按钮。
- 输入 应用程序名称 和 Apdex 阈值,然后点击 保存。
- 在应用程序界面中,点击应用程序名称旁边的汉堡图标 (
) 复制您的应用程序密钥。

在您的原生应用中插桩并初始化移动端 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"/>步骤 3:
<uses-permissionandroid: name="android.permission.ACCESS_NETWORK_STATE"/>
在 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 等,也可以指定自己的类型。组件是线程安全的,可在不同线程中启动和停止。一个组件对象只能被启动和停止一次。父事务停止后,组件对象将无法再停止。一个事务中的多个组件可以重叠并行运行。同一事务中同名组件将取平均值。
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 评分和用户数量

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

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

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

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

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

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

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

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

配置告警?
自定义 API
自定义 API 用于动态设置用户 ID、追踪自定义事件、捕获屏幕等。本文档将介绍 Site24x7 中可用的各类自定义 API 及其使用语法。
可用 API:
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 日
功能增强:
- 支持 Flutter 框架。
版本 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 时出现的异常。
新功能:
- 用于配置自定义环境的 API。
- 用于启用 Fragment 支持的 API。
- 使用上下文、应用程序密钥和上传间隔开始监控的 API。
- 通过 Site24x7LoggingInterceptor 支持 Retrofit 和 Okhttp 客户端。
功能增强:
- 增强了 Crashlytics 支持。
版本 2.0.0
2021 年 6 月 4 日
功能增强:
- 支持追踪 HTTP 调用,包括请求方法、响应时间、吞吐量、状态码、平台和屏幕。
- 支持根据响应时间、吞吐量和次数追踪屏幕。
- 支持自动追踪视图和导航。
- 支持手动追踪视图。
- 启用用户会话追踪,会话超时时间为 60 分钟。
- 支持手动添加用户 ID。
- 支持追踪以下包的所有 HTTP 调用:
- java.net.HttpURLConnection
- javax.net.ssl.HttpsURLConnection
- 支持手动添加其他 HTTP 调用。


