什么是AppGallery Connect性能管理

AppGallery Connect(简称AGC)性能管理(Application Performance Management,简称APM)服务提供分钟级应用性能监控能力,依据APM SDK,可以实现零代码快速集成,您能够在AGC查看和分析APM收集到的应用性能数据,从而全面了解所开发应用的性能特点,快速精准修复应用存在的性能问题,持续提升应用的用户体验。

您将建立什么

在本次Codelab中,您将建立一个能够集成APM 的应用,另外通过手动触发网络请求事件,以测试APM服务能否正常监控检测网络性能,同时了解如何查看和分析应用性能问题。

您将会学到什么

开发环境及技能要求:

运行终端要求:

集成AGC APM,需要完成以下准备工作

具体操作,请按照《AppGallery Connect集成准备》中详细说明来完成。

集成APM插件

  1. 打开Android Studio项目级build.gradle文件,增加如下代码添加APM插件依赖:
    buildscript { repositories { // Add the maven repository maven { url 'https://developer.huawei.com/repo/' } } dependencies { // To benefit from the latest APM feaures, update your Android Gradle Plugin // dependency to at least v3.2.0 classpath 'com.android.tools.build:gradle:3.2.0' // Add agc plugin dependence classpath 'com.huawei.agconnect:agcp:1.4.1.300' // Add the dependency for the APM plugin classpath 'com.huawei.agconnect:agconnect-apms-plugin:1.4.1.301' } }
  2. 打开Android Studio应用级build.gradle文件,添加如下代码应用APM插件:
    apply plugin: 'com.android.application' // Apply the AGC plugin apply plugin: 'com.huawei.agconnect' // Apply the APM plugin apply plugin: 'com.huawei.agconnect.apms' dependencies { //.. }

集成APM SDK

针对Android Studio开发环境,开发前需集成APM SDK到您的Android Studio项目中。

  1. 登录AppGallery Connect网站,点击"我的项目"
  2. 在项目列表中找到您的项目,在项目下的应用列表中选择需要查看的应用。
  3. 单击"项目设置"中"应用"栏下的"agconnect-services.json"下载配置文件。
  4. 将"agconnect-services.json"文件拷贝到应用级根目录下。
  5. 打开Android Studio应用级build.gradle文件,添加如下代码集成APM SDK。
    dependencies { // Add APM SDK library dependency implementation 'com.huawei.agconnect:agconnect-apms:1.4.1.301' }
  6. 在APP模块(应用级)的混淆配置中添加如下排除项:
    -keep class com.huawei.agconnect.apms.**{*;} -dontwarn com.huawei.agconnect.apms.** -keep class com.hianalytics.android.**{*;} -keep class com.huawei.updatesdk.**{*;} -keep class com.huawei.hms.**{*;} -keep interface com.huawei.hms.analytics.type.HAEventType{*;} -keep interface com.huawei.hms.analytics.type.HAParamType{*;} -keepattributes Exceptions, Signature, InnerClasses, LineNumberTable
  7. 点击界面上的"Sync Now"链接同步已完成的配置。
  8. 编译应用。

本章Codelab中您可以在Android Studio工程中创建一个布局页面,参照下图进行UI设计,新增六个按钮。一个按钮点击后可触发网络监控事件,另外两个按钮点击后可控制是否收集APM性能数据。剩下三个按钮上报自定义事件。

本章Codelab中您可以手动触发一次网络请求,然后在APM性能管理台上查看网络性能指标是否正常(应用启动和应用屏幕事件在应用启动时,自动上报),详细步骤如下:

  1. 在应用Activity布局文件中创建三个按钮,描述分别为"Send Network Request"、"APMS Collection ON"和"APMS Collection OFF"。
  2. 创建HttpUtil.java类文件文件,并添加如下代码,定义请求发送方法。
    static private String URL = "https://developer.huawei.com/consumer/cn/"; static private MediaType MEDIATYPE = MediaType.parse("text/x-markdown; charset=utf-8"); static private String REQUESTBODY = "apms http request test"; static public void oneRequest() { OkHttpClient okHttpClient = new OkHttpClient(); Request request = new Request.Builder() .url(URL) .post(RequestBody.create(MEDIATYPE, REQUESTBODY)) .build(); okHttpClient.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { Log.d("apmsAndroidDemo", "onFailure: " + e.toString()); } @Override public void onResponse(Call call, Response response) throws IOException { Log.d("apmsAndroidDemo", "onResponse: Success"); } }); }
  3. 点击"Send Network Request"按钮触发调用Okhttp3的execute方法可以上报一次网络事件。
    Button sendNetworkRequestBtn = findViewById(R.id.btn_network); sendNetworkRequestBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Log.d("apmsAndroidDemo", "send network request."); HttpUtil.oneRequest(); } });

本章Codelab中您可以手动触发一次自定义指标上报,然后在APM性能管理台上查看自定义性能指标是否正常。
在应用Activity布局文件中创建三个按钮,描述分为"Send Custom Event"、"Send Custom Event By annotation"和"Send Custom Network Event",分别为通过API上报自定义事件、通过注解上报自定义和通过API上报自定义网络事件。

API上报自定义事件

  1. 在MainActivity.java中给"Send Custom Event"设定按钮点击事件。
    findViewById(R.id.custom_normal_event).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.d("apmsAndroidDemo", "send a custom event"); sendCustomEvent(); } });
  2. 在MainActivity.java中添加如下代码,定义一个自定义事件,并添加称分别为"处理结果"和"状态"的Property、名称为"处理次数"的指标。点击按钮后可以上报至云侧。
    // define custom event by code public void sendCustomEvent() { CustomTrace customTrace = APMS.getInstance().createCustomTrace("自定义事件1"); customTrace.start(); // code you want trace businessLogicStart(customTrace); businessLogicEnd(customTrace); customTrace.stop(); } public void businessLogicStart(CustomTrace customTrace) { customTrace.putMeasure("处理次数", 0); for (int i = 0; i < 5; i++) { customTrace.incrementMeasure("处理次数", 1); } } public void businessLogicEnd(CustomTrace customTrace) { customTrace.putProperty("处理结果", "成功"); customTrace.putProperty("状态", "正常"); }

注解上报自定义事件

  1. 在MainActivity.java中给"Send Custom Event By annotation"设定按钮点击事件。
    findViewById(R.id.custom_normal_event_by_annotation).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.d("apmsAndroidDemo", "send a custom event by annotation"); sendCustomEventByAnnotation(); } });
  2. 在MainActivity.java中添加如下代码,定义一个自定义事件,点击按钮后可以上报至云侧。
    private void sendCustomEventByAnnotation() { customEventHandle(); } // define custom event by annotation @AddCustomTrace(name = "自定义事件2") public void customEventHandle() { }

API上报自定义网络事件

  1. 在MainActivity.java中给"Send Custom Network Event"设定按钮点击事件。
    findViewById(R.id.custom_network_event).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.d("apmsAndroidDemo", "send a custom network event"); new Thread(new Runnable() { @Override public void run() { HttpUtil.customNetworkEvent(); } }).start(); } });
  2. 在HttpUtil.java中添加如下代码,定义一个自定义事件,在网络开始前调用API设置Url和请求发送字节数,在响应结束后设置响应码、响应大小、响应类型,并设置实际传输大小Property和异常信息Property,点击按钮后可以上报至云侧。
    static private String URL = "https://developer.huawei.com/consumer/cn/"; static private MediaType MEDIATYPE = MediaType.parse("text/x-markdown; charset=utf-8"); static private String REQUESTBODY = "apms http request test"; static public void customNetworkEvent() { OkHttpClient okHttpClient = new OkHttpClient(); Request request = new Request.Builder() .url(URL) .post(RequestBody.create(MEDIATYPE, REQUESTBODY)) .build(); // define custom network event NetworkMeasure networkMeasure = APMS.getInstance().createNetworkMeasure(URL, "POST"); networkMeasure.setBytesSent(request.headers().byteCount()); long bytesRecive = 0L; networkMeasure.start(); try { Response response = okHttpClient.newCall(request).execute(); networkMeasure.setStatusCode(response.code()); if (response.body() != null) { networkMeasure.setBytesReceived(response.body().contentLength()); networkMeasure.setContentType(Objects.requireNonNull(response.body().contentType()).toString()); bytesRecive = dealResponseBody(response.body()); response.body().close(); } networkMeasure.putProperty("传输字节", String.valueOf(bytesRecive)); networkMeasure.stop(); } catch (IOException e) { networkMeasure.setStatusCode(0); classErrorMessage(networkMeasure, e); networkMeasure.putProperty("错误信息", e.getMessage()); networkMeasure.putProperty("传输字节", String.valueOf(bytesRecive)); networkMeasure.stop(); } } private static void classErrorMessage(NetworkMeasure networkMeasure, Exception e) { if (e instanceof UnknownHostException) { networkMeasure.putProperty("错误信息", "DNS解析失败"); } } private static long dealResponseBody(ResponseBody body) throws IOException { InputStream inputStream = body.byteStream(); byte[] result = new byte[1000]; long len = 0; long readBytes = 0; while ((len = inputStream.read(result)) != -1) { readBytes += len; } return readBytes; }

本章Codelab中您可以手动触发一次应用ANR并上报,然后在APM性能管理台上查看ANR数据是否正常。

  1. 在应用Activity布局文件中创建一个描述为"TRIGGER ANR"的按钮触发应用ANR。
  2. 在MainActivity.java文件下添加如下代码,模拟应用ANR,并在MainActivity.java中的onCreate函数中调用initAnrTestButton函数。
    public void initAnrTestButton() { findViewById(R.id.anr_test).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.d("apmsAndroidDemo", "trigger anr"); anrTestEnable = true; } }); } @Override public boolean dispatchKeyEvent(KeyEvent event) { if (anrTestEnable) { try { Thread.sleep(20000); } catch (InterruptedException e) { e.printStackTrace(); } } return super.dispatchKeyEvent(event); } @Override public boolean dispatchTouchEvent(MotionEvent ev) { if (anrTestEnable) { try { Thread.sleep(20000); } catch (InterruptedException e) { e.printStackTrace(); } } return super.dispatchTouchEvent(ev); }
  3. 多次点击"TRIGGER ANR"按钮,直到手机界面弹出"应用无响应"对话框。
  1. 点击"APMS Collection ON"按钮触发调用APMS.enableCollection打开性能数据上报开关。
    findViewById(R.id.enable_apms_on).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { APMS.getInstance().enableCollection(true); } });
  2. APM性能数据上报开关默认为开,如果您不想上报性能数据,可以点击"APMS Collection OFF"按钮关闭此开关。
    findViewById(R.id.enable_apms_off).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { APMS.getInstance().enableCollection(false); } });
  3. 打包并运行应用程序,点击"Send Network Request"按钮上报一次网络事件。
  1. 在应用Activity布局文件中创建两个按钮,描述分别为 "APMS ANR MONITOR ON"和"APMS ANR MONITOR OFF",功能分别为打开ANR监控开关和关闭ANR监控。
  2. 点击"APMS ANR MONITOR ON"按钮触发调用enableAnrMonitor打开ANR监控开关。
    findViewById(R.id.enable_apms_on).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { APMS.getInstance().enableAnrMonitor(true); } });
  3. ANR监控开关默认为开,如果您不想监控ANR,可以点击"APMS ANR MONITOR OFF"按钮关闭此开关。
    findViewById(R.id.enable_apms_off).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { APMS.getInstance().enableAnrMonitor(false); } });
  4. 打包并运行应用程序,点击"TRIGGER ANR"按钮触发一次ANR。

查看概览

  1. 登录AppGallery Connect网站,点击"我的项目"
  2. 在项目列表中找到您的项目,在项目下的应用列表中选择需要查看的应用。
  3. 选择"质量 > 性能管理",进入"应用性能管理"页面。
  4. 点击"概览",进入概览页面。在该页面下方。
    概览页面展示应用近30天问题和指标概览。
    指标概览包括"启动时长(按版本分布)"、"缓慢帧占比(Top5 activity)"、"冻结帧占比 (Top5 activity)"、"网络请求耗时(Top5国家/地区)"和"网络请求成功率(随时间变化)"。在概览页面,您可以快速了解应用的重要性能指标,及时识别应用是否发生问题。

查看网络分析数据

  1. 点击"网络分析"页签,进入网络请求指标统计页面。该页面提供每个URL请求次数,响应时间,请求成功率(可根据时间段进行选择)。
  2. 点击上图中某个请求的"查看详情",进入该请求的详情页面,该页面展示"请求耗时"和"请求成功率"详情。
  3. 在"请求耗时"页面中,展示请求耗时分布情况、按不同维度(版本号、国家/地区、手机类型、一级区域、系统版本、运营商、网络)统计的请求耗时等。

查看网络自定义事件

  1. 网络自定义事件无单独入口,查看步骤和"查看网络分析数据"章节一致,。如果用户设定了Property,则可在"查看详情"页面中的维度栏看到对应Property下的耗时和请求成功率情况。

查看自定义事件

  1. 点击"应用分析"页签,进入"自定义"列表页面。该页面呈现了目前上报的自定义事件的列表,包含自定义事件名称、中位值、样本数和查看详情操作。
  2. 点击"自定义事件1"的"查看详情"按钮,即可查看自定义事件耗时情况的分布。点击"处理次数"页签,该页面显示上报的"处理次数"指标的分布情况。最下方是多维度分析栏,自定义属性"状态"和"处理结果"这两个维度展示在维度分析栏下,您可查看这两个维度下"处理次数"的分布情况。

查看ANR数据

  1. 点击"ANR分析"页签,进入ANR报表页面。该页面呈现了目前ANR的走势,包含"近24小时TOP5问题(影响用户率前5的问题)"、ANR发生总次数、影响用户数、ANR率在时间、手机型号、系统版本、应用版本不同维度下的分布,以及ANR问题分类列表。
  2. 点击TOP5问题卡片,就会进入一类ANR问题详情页面,该页面展示了此类ANR问题影响用户率、次数ANR率(ANR次数/启动次数)、发生次数、影响用户数随时间的分布、影响用户数在手机型号、应用版本、系统版本3个不同维度下的分布以及此类ANR问题发生的记录列表。
  3. 点击"发生记录"列表中某个记录的"查询详情"按钮,即可查看该次ANR发生时的详情。

祝贺您,您已经成功地构建了您的第一个集成AGC APM的应用程序,并学到了如何在APM性能管理台查看和分析应用性能数据。

AGC APM的相关API介绍请参见API索引

本Codelab中所用demo源码下载地址如下:

源码下载

已复制代码