简介: 导致 App 性能低下的原因有很多,除去设备硬件和软件的外部因素,其中大部分是开发者错误地使用线、系统函数、编程范式、数据结构等导致的。即便是较有经验的程序员,也很难在开发时就能避免所有导致性能低下的“坑”,因此解决性能问题的关键是在于能不能尽早地发现和定位和捕获这些错误。

项目遇到的崩溃/卡顿/ANR/OOM/启动慢

1.1项目背景

1.2所遇到的挑战

1.3解决问题的步骤

1.4项目总结

2. 产品体验内容:集成/接入/使用

2.1集成/接入/ 友盟+ 应用性能监控平台 U-APM

2.2集成/接入/使用体验总结与分享

2.3对产品提出的建议/意见

1.项目遇到的奔溃/卡顿/ANR/OOM/启动慢

1.1项目背景

项目背景主要是公司开发项目,老板提起需求,产品经理规划需求以及文档,开发人员根据需求来规划开发,项目开发人员(两个前端开发,三个Java开发,两个测试,一个产品,一个ui);项目组织架构:

(小程序/H5):uniapp架构+U-APM监听统计+canvas绘制海报B端管理系统: Vue+Axios+Elementui+ueditor135编辑器+

项目名叫:值得买商城,主要是一个一体化的的B2C平台,包含内部商城管理系统(客服/运营可以在系统发布活动以及商品,管理商品、订单、会员,并且处理用户的询问以及投诉),C端小程序APP端(H5、APP端直接给用户提供一个便捷简介,实惠多优惠多的一个线上购物平台,通过活动优惠以及地推方式分享产生裂变,通过友盟统计抓取不同用户的喜好,定时更新推流以及发放优惠),项目类似京东商城、天猫商城,可以在商城浏览商品、下订单,会员用户以及星级用户可以参加各种活动。

电商模式:

1.1:B2B:商家到商家。比如阿里巴巴,慧聪网、铭万网。

1.2:B2C:商家到用户。比如京东。

1.3:C2C:用户到用户。比如淘宝。

1.4:B2B2C:商家到商家到用户。比如天猫。

1.5:O2O:线上到线下。比如百度外卖、美团、饿了么。

1.2所遇到的挑战/问题

1.项目上线例如代码异常或者控制台异常监听不到不太好排查

2.服务端队列接口其中一个挂掉项目直接奔溃

3.类似登录按钮点击请求频繁点击请求多次

4.页面组件不统一导致需求更改多处地方变动

5.切换环境或者项目距配置导致异常axios拦截失败

1.3解决问题的步骤

1. 最初项目开发中引入的fundebug第三方插件监听代码异常,但是部分拦截异常捕获不到{H5以及小程序使用的是fundebug,APP使用友盟的U-APM去接入捕获异常}

首先查看第三方捕获的异常区偏差问题,通过开发者工具调试debugger排查异常出现的位置,查看是代码逻辑问题还是其他异常,依次去排查解决

1.4项目总结

遇到问题,不要心急也不需要慌,既然问题出现了,按照问题出现的时间、方式、情况进行排查,找到问题之后,去一步步尝试解决就好,首先要把思路屡清楚,实战中总是会遇到怪怪的问题,用心去做就OK了,部分想系统的表格、表单,网站中的列表,标题栏等等模块项目中尽量去封装集成为组件库统一管理,减少工作量以及代码冗余。

2.产品体验内容:集成/接入/使用

这里来说一下友盟的U-APM集成接入以及使用方式,在这里首先先说明一下我个人在开发中为什么会选择友盟的这款产品api在项目中使用,在解决问题的步骤中我提到过,项目中h5跟小程序使用的一个第三方fundebug来抓取以及捕获异常,APP中开发使用U-APM捕获抓取错误异常并监听,{ fundebug捕获异常以及监听方面没有U-APM全面,只能监听到普通异常,U-APM可以监听到奔溃分析,自定义错误异常,启动分析,卡顿分析以受影响人数等等},唯一觉得美中不足的就是,U-APM只支持安卓跟IOS

2.1产品体验内容:集成/接入/使用

2.1.1首先进入网址登录注册应用获取下载SDK

U-APM网站地址应用性能监控平台 U-APM

2.1.2 获取到自己的应用key以及基础sdk

注意:

·       应用的安卓版和iOS版不能使用相同的AppKey,需要分开注册。

·       【友盟+】的应用名与实际应用名和包名无关,若注册应用时,提示应用名称已存在,建议命名为应用名+平台(iOS/Android)。

maven自动集成(推荐)

通过在Android Studio工程build.gradle配置脚本中添加maven线上依赖,导入最新版本组件化统计SDK。

maven依赖配置

在工程build.gradle配置脚本中buildscript和allprojects段中添加【友盟+】SDK新maven仓库地址。

maven { url 'https://dl.bintray.com/umsdk/release' }

buildscript {  repositories {  google()  jcenter() maven { url 'https://dl.bintray.com/umsdk/release' }  } dependencies {  classpath 'com.android.tools.build:gradle:3.4.0'  // NOTE: Do not place your application dependencies here; they belong  // in the individual module build.gradle files  } }  allprojects { repositories {  google()  jcenter() maven { url 'https://dl.bintray.com/umsdk/release' }  } }

在工程App 对应build.gradle配置脚本dependencies段中添加统计SDK库和其它库依赖:

// 下面各SDK根据宿主App是否使用相关业务按需引入。

// OAID目前为目前国内市场主流的Android Q设备标识,可根据需要选择。

// 友盟统计SDK  implementation 'com.umeng.umsdk:common:9.3.3'

// 版本号(必选)  implementation 'com.umeng.umsdk:asms:1.1.4'

// asms包依赖(必选)   implementation 'com.umeng.umsdk:game:9.2.0+G'

//游戏统计SDK依赖(可选)   implementation 'com.umeng.umsdk:apm:1.1.0'

// U-APM产品包依赖(必选)

崩溃/ANR类型

如果您使用的是9.0.4以上版本SDK,同时集成使用了umeng-apm-vx.x.x.aar插件,则默认开启新版本的稳定性功能

-keep class com.uc.** {*;}

如果开发者自己捕获了错误,需要手动上传到【友盟+】服务器可以调用下面两种方法:

@param {e}错误异常

@param{type}自定义错误类型

public static void UMCrash.generateCustomLog(Throwable e, String type)

方法一示例:

try {  // 抛出异常的代码 }

catch (Exception e) {

UMCrash.generateCustomLog(e, "UmengException"); }

方法二:

@param {e}错误异常

@param{type}自定义错误类型

public static void UMCrash.generateCustomLog(String e, String type)

捕获成功查看友盟+U-APM可视化工具:

详细文档查看官放文档比较清晰明了:

开发者中心

2.2集成/接入/使用体验总结与分享

首先来说一下市面上目前:导致 App 性能低下的原因有很多,除去设备硬件和软件的外部因素,其中大部分是开发者错误地使用线、系统函数、编程范式、数据结构等导致的。即便是较有经验的程序员,也很难在开发时就能避免所有导致性能低下的“坑”,因此解决性能问题的关键是在于能不能尽早地发现和定位和捕获这些错误。随着App业务的与日俱增,各个系统也越来越复杂,服务间的调用,服务的依赖,以及分析服务的性能问题也越棘手,因此引入性能监控平台尤为重要。能不能快速、准确、丰富的定位错误类型,是衡量性能监控产品的头要因素。以友盟+的U-APM应用性能监控平台为例,无论是 Java、Native崩溃,还是 ANR、系统各种强杀等问题;异常问题U-APM都可以捕获到,并会生成内容完整、丰富、全面的日志。作为App开发者,相信大家一定遇到过类似的尴尬问题:故障永远都是你的客户告诉你的,而在什么时候发生的,你也无法确定,只能通过客户的反馈倒推时间节点,靠后从错误日志中得到相对完整的日志信息,友盟+应用性能监控平台U-APM为例触达渠道就有邮件、钉钉、企业微信、飞书等等。其中后三者可以通过webhook的方式直接将监控告警发送到群组里,让组内的研发同学头先时间获取到有效信息,及时更改异常修复。个人觉得还是蛮好的在个人开发中还是企业应用开发中目前都够用了。

2.3对产品提出的建议/意见

作为开发者对U-APM的建议:

1.登录一个账号就可以有一个选择平台来切换ios/安卓来直接看到对应数据的统计,现在需要来回折腾有点麻烦

2.目前监测统计错误异常只支持IOS跟安卓APP,小程序,H5以及公众号这些目前不支持

3.如果从监测的异常有录屏功能就更好了,这样会直接查看录屏回放效果杠杠的~

原文链接

本文为阿里云原创内容,未经允许不得转载。

项目实战总结以及接入U-APM的更多相关文章

  1. SpringBoot电商项目实战 — ElasticSearch接入实现

    如今在一些中大型网站中,搜索引擎已是必不可少的内容了.首先我们看看搜索引擎到底是什么呢?搜索引擎,就是根据用户需求与一定算法,运用特定策略从互联网检索出制定信息反馈给用户的一门检索技术.搜索引擎依托于 ...

  2. 【腾讯Bugly干货分享】React Native项目实战总结

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/577e16a7640ad7b4682c64a7 “8小时内拼工作,8小时外拼成长 ...

  3. Unity3D项目实战笔记(10):Unity3D编译IPA的PostEvents–节约时间利器

    最近,SDK支付等接入差不多了,就从Unity3D生成IPA (企业版License), 然,需要手动执行的PostEvents竟然多大10项+, 这些我默默的承受了1周时间,每次约浪费20分钟-额外 ...

  4. 【WEB API项目实战干货系列】- API访问客户端(WebApiClient适用于MVC/WebForms/WinForm)(四)

    这几天没更新主要是因为没有一款合适的后端框架来支持我们的Web API项目Demo, 所以耽误了几天, 目前最新的代码已经通过Sqlite + NHibernate + Autofac满足了我们基本的 ...

  5. 【.NET Core项目实战-统一认证平台】第十四章 授权篇-自定义授权方式

    [.NET Core项目实战-统一认证平台]开篇及目录索引 上篇文章我介绍了如何强制令牌过期的实现,相信大家对IdentityServer4的验证流程有了更深的了解,本篇我将介绍如何使用自定义的授权方 ...

  6. 【.NET Core项目实战-统一认证平台】第十二章 授权篇-深入理解JWT生成及验证流程

    [.NET Core项目实战-统一认证平台]开篇及目录索引 上篇文章介绍了基于Ids4密码授权模式,从使用场景.原理分析.自定义帐户体系集成完整的介绍了密码授权模式的内容,并最后给出了三个思考问题,本 ...

  7. 【.NET Core项目实战-统一认证平台】第一章 功能及架构分析

    [.NET Core项目实战-统一认证平台]开篇及目录索引 从本文开始,我们正式进入项目研发阶段,首先我们分析下统一认证平台应该具备哪些功能性需求和非功能性需求,在梳理完这些需求后,设计好系统采用的架 ...

  8. 【.NET Core项目实战-统一认证平台】第二章网关篇-定制Ocelot来满足需求

    [.NET Core项目实战-统一认证平台]开篇及目录索引 这篇文章,我们将从Ocelot的中间件源码分析,目前Ocelot已经实现那些功能,还有那些功能在我们实际项目中暂时还未实现,如果我们要使用这 ...

  9. 【.NET Core项目实战-统一认证平台】第六章 网关篇-自定义客户端授权

    [.NET Core项目实战-统一认证平台]开篇及目录索引 上篇文章我们介绍了网关使用Redis进行缓存,并介绍了如何进行缓存实现,缓存信息清理接口的使用.本篇我们将介绍如何实现网关自定义客户端授权, ...

  10. Kafka项目实战-用户日志上报实时统计之分析与设计

    1.概述 本课程的视频教程地址:<Kafka实战项目之分析与设计>  本课程我通过一个用户实时上报日志案例作为基础,带着大家去分析Kafka这样一个项目的各个环节,从而对项目的整体设计做比 ...

随机推荐

  1. C++ 调用 Python 总结(一)

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  2. vim下删除swp文件

    vim下删除swp文件 几个选项的内涵 [O]pen Read-Only 只读的方式打开 (E)dit anyway 编辑模式打开,但是不会载入存盘的内容 (R)ecover 编辑模式打开并且加载暂存 ...

  3. Locust如何实现负载测试?

    一.场景要求 我们在使用locust时,有时候默认的场景无法满足我们的要求时,这时后我们需要自定义场景 比如我们要设置每一段时间启动10个用户运行,执行60s后再一次启动10个用户,总共运行10分钟, ...

  4. 使用maven命令安装Oracle的jar包到本地仓库

    mvn install:install-file -DgroupId=com.oracle -DartifactId=ojdbc6 -Dversion=11.2.0.4 -Dpackaging=jar ...

  5. ZYNQ7000系列学习之TF卡读写实验

    TF卡读写实验 1.实验原理 开发板上自动带有TF卡外接接口,这里只需调用封装好的IP核即可实现该功能.当然,你还需要一个TF卡(感觉SD卡也可以,反正这两种卡差不多).实验就是调用一个IP核,不涉及 ...

  6. KingbaseES使用kbbench计算连接耗时

    前言 本文讨论一下KingbaseES数据库中如何计算数据库连接耗时.有这样一个场景,不借助第三方工具,在数据库服务端计算1000个数据库连接的总耗时,并取得每个连接耗时的平均值.怎样实现呢?我们可以 ...

  7. KingbaseES file_dw 介绍

    file_dw简介 ​ file_fdw模块提供外部数据包装器file_fdw, 它能被用来访问服务器的文件系统中的数据文件,或者在服务器上执行程序并读取它们的输出. 数据文件或程序输出必须是能够被C ...

  8. #动态规划#CF889E Mod Mod Mod

    题目传送门 分析 这道题有一个很妙的地方就是将一段前缀整体一起做. 设 \(dp[i][j]\) 表示\(x\) 被前 \(i\) 个数取模后答案最大,并且 \(j\) 为取得此答案的最大值 最后再对 ...

  9. #主席树#CF813E Army Creation

    题目 \(n\) 个数 \(a_i\) , \(k\) 为给定值, \(q\) 次询问. 每次问 \([l,r]\) 内最多可以选多少个数, 满足同一个数的出现次数不超过 \(k\) 不带修,强制在线 ...

  10. netty系列之:在netty中实现线程和CPU绑定

    目录 简介 引入affinity AffinityThreadFactory 在netty中使用AffinityThreadFactory 总结 简介 之前我们介绍了一个非常优秀的细粒度控制JAVA线 ...